🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

桌面端封装 qaqaza11/DSH-Desktop

DeepSeek Harnessv0.2.0
qaqaza1177 天前有提交已提供中文文档扫描:含敏感能力

把网页版装进独立窗口,托盘常驻一键启动

33.3/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add qaqaza11/DSH-Desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · desktop
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 77 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-desktop @ 0.2.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/17 10:23:48

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 42 处,展示前 34 条)
  • 读取本地文件
    main.js:76
    if (envDir && fs.existsSync(envDir)) return envDir
  • 读取本地文件
    main.js:78
    if (saved && fs.existsSync(saved)) return saved
  • 读取本地文件
    main.js:80
    if (fs.existsSync(docs)) return docs
  • 读取本地文件
    main.js:132
    if (env && fs.existsSync(env)) return env
  • 读取本地文件
    main.js:137
    if (fs.existsSync(bundled)) return bundled
  • 读取本地文件
    main.js:144
    if (fs.existsSync(runtimesDir)) {
  • 执行外部命令固定命令
    main.js:155
    const out = execFileSync('where', ['dsh'], { encoding: 'utf8', windowsHide: true })
  • 发起网络请求
    main.js:176
    const req = http.get({ host, port, path: '/', timeout: 2500 }, (res) => {
  • 执行外部命令来自配置/变量
    main.js:246
    const child = spawn(command, ['--profile', DSH_PROFILE, '--port', String(DSH_WEB_PORT)], {
  • 写入本地文件
    main.js:315
    fs.mkdirSync(dir, { recursive: true })
  • 写入本地文件
    main.js:317
    logStream = fs.createWriteStream(logFilePath, { flags: 'a' })
  • 写入剪贴板
    main.js:351
    if (diagText) { try { clipboard.writeText(diagText) } catch { } }
  • 写入剪贴板
    main.js:388
    try { clipboard.writeText(diagText) } catch { }
  • 发起网络请求
    main.js:603
    const res = await net.fetch(UPDATE_URL, {
  • 写入本地文件
    main.js:739
    fs.mkdirSync(destDir, { recursive: true })
  • 发起网络请求
    main.js:745
    res = await net.fetch(target.url, { method: 'GET', cache: 'no-store' })
  • 写入本地文件
    main.js:762
    const out = fs.createWriteStream(tmp)
  • 写入本地文件
    main.js:778
    fs.copyFileSync(tmp, dest)
  • 删除本地文件
    main.js:779
    fs.unlinkSync(tmp)
  • 删除本地文件
    main.js:783
    try { fs.unlinkSync(tmp) } catch { }
  • 写入剪贴板
    main.js:794
    clipboard.writeText(`DSH Desktop ${latestVersion}\nSHA-256: ${sha256}\n文件: ${dest}`)
  • 执行外部命令固定命令
    main.js:945
    execFileSync('taskkill', ['/pid', String(childProcess.pid), '/t', '/f'], { stdio: 'ignore', windowsHide: true })
  • 读取本地文件
    lib/settings.js:13
    return JSON.parse(fs.readFileSync(settingsFile(userDataDir), 'utf8'))
  • 写入本地文件
    lib/settings.js:21
    fs.mkdirSync(userDataDir, { recursive: true })
  • 写入本地文件
    lib/settings.js:22
    fs.writeFileSync(settingsFile(userDataDir), JSON.stringify(settings, null, 2), 'utf8')
  • 读取本地文件
    build/after-pack.js:13
    if (!fs.existsSync(src)) {
  • 读取本地文件
    build/after-pack.js:16
    if (fs.existsSync(dest)) {
  • 删除本地文件
    build/after-pack.js:17
    fs.rmSync(dest, { recursive: true, force: true })
  • 写入本地文件
    build/after-pack.js:19
    fs.mkdirSync(path.dirname(dest), { recursive: true })
  • 写入本地文件
    build/after-pack.js:28
    fs.mkdirSync(to, { recursive: true })
  • 读取本地文件
    build/after-pack.js:29
    for (const entry of fs.readdirSync(from, { withFileTypes: true })) {
  • 写入本地文件
    build/after-pack.js:38
    fs.copyFileSync(s, d)
  • 读取本地文件
    build/after-pack.js:45
    for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
  • 读取本地文件
    build/after-pack.js:48
    else if (entry.isFile()) total += fs.statSync(p).size
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 网页封装独立窗口
  • 托盘常驻
  • 一键启动

DeepSeek Harness 桌面端封装-内置运行环境,点击即用

README

由 DeepSeek 最新模型翻译生成
DSH Desktop DeepSeek Harness 的 Windows 桌面版 —— 保留web界面并封装为桌面端,一键下载且保留原版使用体验。 下载安装 1. 打开 下载页面 2. 下载 DSH Desktop Setup x.y.z.exe 3. 双击安装 → 桌面出现「DSH Desktop」图标 → 启动 效果: 首次运行如果 Windows 提示「未知发布者」(安装包暂未代码签名),点「仍要运行」即可。 特点 - 零依赖:安装包自带 Node.js 和 DSH 运行时,对方电脑无需任何环境 - 和网页版数据互通:插件、会话、登录凭据与你的命令行/浏览器 dsh 共用同一份 - 独立不冲突:自动挑选空闲端口,不跟浏览器里的 dsh 抢 3080 - 关窗不退出:最小化到系统托盘;托盘右键可「打开项目… / 检查更新 / 退出」 - 出问题看得懂:启动失败弹诊断窗口,可复制错误信息、一键「重试启动」、「打开日志」 - 自动更新:后台检查 GitHub 新版本并提示(下载后由你手动安装,不会偷偷执行) 常见问题 - 和网页版有区别吗? 没有本质区别——同一个界面、同一份数据;桌面版多了独立窗口、托盘和自动更新。 - 会显示别人的会话吗? 不会。桌面版默认用空闲端口独立运行;只有显式设置 DSH_DESKTOP_PORT 时才复用该端口已有服务。
展开完整文档(README 剩余 1 节)
DSH Desktop

DeepSeek Harness 的 Windows 桌面版 —— 保留web界面并封装为桌面端,一键下载且保留原版使用体验。

下载安装

1. 打开 下载页面
2. 下载 DSH Desktop Setup x.y.z.exe
3. 双击安装 → 桌面出现「DSH Desktop」图标 → 启动

效果:

首次运行如果 Windows 提示「未知发布者」(安装包暂未代码签名),点「仍要运行」即可。

特点

- 零依赖:安装包自带 Node.js 和 DSH 运行时,对方电脑无需任何环境
- 和网页版数据互通:插件、会话、登录凭据与你的命令行/浏览器 dsh 共用同一份
- 独立不冲突:自动挑选空闲端口,不跟浏览器里的 dsh 抢 3080
- 关窗不退出:最小化到系统托盘;托盘右键可「打开项目… / 检查更新 / 退出」
- 出问题看得懂:启动失败弹诊断窗口,可复制错误信息、一键「重试启动」、「打开日志」
- 自动更新:后台检查 GitHub 新版本并提示(下载后由你手动安装,不会偷偷执行)

常见问题

- 和网页版有区别吗? 没有本质区别——同一个界面、同一份数据;桌面版多了独立窗口、托盘和自动更新。
- 会显示别人的会话吗? 不会。桌面版默认用空闲端口独立运行;只有显式设置 DSH_DESKTOP_PORT 时才复用该端口已有服务。
- 提示「无法启动 dsh 服务」? 点诊断窗口里的「重试启动」;仍失败就「打开日志」看末尾错误(最常见是端口被其他程序占用)。
- 怎么换项目目录? 托盘右键 →「打开项目…」选个文件夹,新会话就从那里开始。

开发文档

以下是技术细节,普通用户不需要看。

构建

git clone https://github.com/qaqaza11/DSH-Desktop.git
cd DSH-Desktop
pwsh -NoProfile -File scripts/fetch-runtime.ps1 # 拉取打包运行时(node.exe + dsh, 带 SHA-256 校验)
npm install
npm start # 开发运行
npm test # 单元测试
npm run dist # 打包 Windows 安装包

fetch-runtime.ps1 只允许兼容矩阵内验证过的版本组合(当前 DSH 0.1.0-rc.7 + Node 24.18.0);已有 runtime 版本不符会拒绝打包(-Force 强制重建)。

配置(环境变量)

| 变量 | 默认 | 说明 |
| DSH_DESKTOP_PORT | 自动挑选空闲端口 | 显式指定端口(1–65535);显式设置时复用该端口已有 DSH 服务 |
| DSH_DESKTOP_PROFILE | web | dsh profile(需包含 @deepseek-ai/dsh-web-app bundle) |
| DSH_DESKTOP_WORKDIR | 记住的目录 → 文档目录 | 会话工作目录 |
| DSH_DESKTOP_DSH_CMD | 内置 runtime | 指定 dsh CLI 路径 |
| DSH_DESKTOP_UPDATE_REPO | qaqaza11/DSH-Desktop | GitHub 更新源 owner/repo |
| DSH_DESKTOP_UPDATE_URL | — | 自定义更新检查端点 |
| DSH_DESKTOP_UPDATE_EXE_URL | — | 直连安装包下载地址 |
| DSH_DESKTOP_TEST_QUIT_MS | — | 测试钩子:N 毫秒后走真实退出路径(仅 CI/验收) |

自动更新

- 检查时机:启动 8 秒后 + 每 6 小时静默检查;托盘「检查更新」手动触发
- 版本判定:严格 SemVer(支持 v 前缀与预发布),只提示严格更新的版本
- 安全边界:接入签名/校验前,下载后不自动执行——弹窗展示 SHA-256(自动复制到剪贴板),由你核对后手动安装
- 发布方须在 Release 正文公布安装包 SHA-256(scripts/make-sha256sums.ps1 可生成),否则用户没有比对对象

安全与信任(如实说明)

- 导航安全:同源判定用 URL origin 整段比较;端口 1–65535 校验;服务探测校验 DSH 指纹,端口被占用时不会误连
- 下载安全:更新地址仅允许 https:,GitHub 资产额外限制域名白名单
- 安装包未签名:SmartScreen 可能提示「未知发布者」,不承诺"完全无提示安装";签名接入见 docs/signing.md

验收

8 项自动化验收:pwsh -NoProfile -File scripts/acceptance.ps1(详见 docs/acceptance.md)。

目录结构

main.js Electron 主进程(服务托管/窗口/托盘/更新) lib/ 更新解析、设置持久化、诊断窗口预加载 test/ 单元测试 docs/ 发布验收清单、代码签名接入指南 scripts/ runtime 拉取、校验文件生成、发布验收 build/after-pack.js 打包钩子(把 dsh 运行时补进安装包) runtime/ 打包用内置运行时(不进 git)

许可证

MIT。架构学习自 anywhere-labs/deepseek-harness-desktop,dsh 本体为 DeepSeek Harness 官方发布物。
预览分享卡片长什么样 ↓qaqaza11/DSH-Desktop
分享 · DeepSeek Harness Hub
qaqaza11/DSH-Desktop

把网页版装进独立窗口,托盘常驻一键启动

回到顶部