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

桌面外壳 Fahaxik1oxxx/dsh-desktop

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

dsh-desktop — 官方 DeepSeek Harness 桌面的外置增强层

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]!
npm 包存在但缺 main/exports/bin 入口声明,源码安装也可能起不来
数据截至 2026/09/25·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 36 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✓npm 包dsh-desktop @ 0.2.0
✓Node 引擎要求 >=22.12.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/13 08:11:09

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 33 处,展示前 30 条)
  • 读取本地文件
    launch.js:23
    if (fs.existsSync(cjs)) return { exe: process.execPath, prefix: [cjs] };
  • 读取本地文件
    launch.js:36
    const text = fs.readFileSync(path.join(PROJECT, 'desktop-runtime.json'), 'utf8');
  • 读取本地文件
    launch.js:45
    return JSON.parse(fs.readFileSync(path.join(APP, 'package.json'), 'utf8')).version;
  • 读取本地文件
    launch.js:50
    const marker = JSON.parse(fs.readFileSync(MARKER, 'utf8'));
  • 读取本地文件
    launch.js:58
    return fs.statSync(path.join(REPO, 'pnpm-lock.yaml')).mtimeMs;
  • 读取本地文件
    launch.js:72
    desktopArtifact: fs.existsSync(path.join(APP, 'lib', 'main.js')),
  • 执行外部命令来自配置/变量
    launch.js:114
    const child = spawn(electronExecutable(), [
  • 写入本地文件
    launch.js:132
    fs.mkdirSync(DEVELOPMENT_ROOT, { recursive: true });
  • 写入本地文件
    launch.js:133
    fs.writeFileSync(MARKER, `${JSON.stringify({ head: state.head, lockMtimeMs: state.lockMtimeMs }, null, 2)}\n`);
  • 执行外部命令来自配置/变量
    launch.js:192
    const child = spawn(pnpm.exe, [...pnpm.prefix, 'run', 'start:desktop'], {
  • 读取本地文件
    link-audit.js:19
    entries = fs.readdirSync(hoistRoot, { withFileTypes: true });
  • 读取本地文件
    link-audit.js:29
    scoped = fs.readdirSync(full, { withFileTypes: true });
  • 读取本地文件
    link-audit.js:58
    stat = fs.lstatSync(link);
  • 读取本地文件
    link-audit.js:72
    if (!fs.existsSync(target)) {
  • 读取本地文件
    link-audit.js:76
    if (!fs.existsSync(path.join(target, 'package.json'))) {
  • 删除本地文件
    link-audit.js:93
    fs.unlinkSync(entry.link);
  • 执行外部命令固定命令
    proc.js:11
    execFile('taskkill', ['/pid', String(child.pid), '/T', '/F'], () => {});
  • 执行外部命令来自配置/变量
    proc.js:25
    const child = spawn(exe, args, { cwd, env, windowsHide: true, shell: false });
  • 读取本地文件
    stamp-electron-icon.js:30
    if (fs.existsSync(path.join(dir, 'dist', 'electron.exe'))) return dir;
  • 读取本地文件
    stamp-electron-icon.js:39
    if (fs.existsSync(p)) return p;
  • 读取本地文件
    stamp-electron-icon.js:45
    return crypto.createHash('sha256').update(fs.readFileSync(ICON)).digest('hex');
  • 读取本地文件
    stamp-electron-icon.js:70
    if (fs.existsSync(renamed)) {
  • 删除本地文件
    stamp-electron-icon.js:72
    fs.unlinkSync(renamed);
  • 读取本地文件
    stamp-electron-icon.js:76
    const current = fs.existsSync(pathFile) ? fs.readFileSync(pathFile, 'utf8').trim() : '';
  • 写入本地文件
    stamp-electron-icon.js:78
    fs.writeFileSync(pathFile, 'electron.exe');
  • 读取本地文件
    stamp-electron-icon.js:85
    marker = JSON.parse(fs.readFileSync(markerFile, 'utf8'));
  • 执行外部命令来自配置/变量
    stamp-electron-icon.js:94
    const result = spawnSync(rceditExe(), [
  • 写入本地文件
    stamp-electron-icon.js:103
    fs.writeFileSync(markerFile, `${JSON.stringify({ iconDigest: digest, exeSize: fs.statSync(exe).size }, null, 2)}\n`);
  • 读取本地文件
    update-and-start.js:69
    if (fs.existsSync(cjs)) return { exe: process.execPath, prefix: [cjs] };
  • 读取本地文件
    update-and-start.js:75
    return ARTIFACTS.filter((p) => !fs.existsSync(path.join(REPO, p)));
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • Electron桌面外壳
  • 服务器生命周期管理
  • 托盘控制

README

由 DeepSeek 最新模型翻译生成
展开完整文档(README 剩余 1 节)
dsh-desktop — 官方 DeepSeek Harness 桌面的外置增强层

DeepSeek Harness 自带官方桌面端,位于该仓库的 apps/desktop(Electron 壳 + 自己的 Host + 打包脚本)。本仓库不复制也不修改它,只提供官方桌面缺少的那一半:源码检出的更新与增量重建。

官方在 GitHub 上的 release 只有变更说明、没有安装包资源,所以本机使用官方桌面就是从源码启动:

pnpm run dev:desktop # 构建后启动(会跑完整构建)
pnpm run start:desktop # 跳过构建,直接启动已有产物

为什么需要这一层

start:desktop 不知道源码是否比产物新,dev:desktop 每次都跑完整构建。于是每次 git pull 之后只有两个选择:用可能过期的产物启动,或者等一次完整构建。官方桌面的自动更新只服务打包版本,管不到源码检出。

这一层补上:

- 只快进:先 fetch,确认本地落后且可 fast-forward 才合并;工作区有 tracked 改动或已分叉就跳过更新并照常启动,绝不覆盖本地内容。
- 依赖按需:只有 pnpm-lock.yaml 真的变了才跑 pnpm install。
- 增量构建:按变更文件选最短的构建组合,纯文档更新完全不构建。
- 缺产物兜底:apps/desktop/lib 或 apps/desktop-host/lib 缺失时强制完整构建,而不是按「无变更」跳过。

使用

| 入口 | 作用 |
| 桌面 / 开始菜单「DeepSeek Harness」 | 无控制台窗口启动官方桌面(唯一快捷方式) |
| desktop\launch-hidden.vbs | 无窗口启动:wscript.exe 以 SW_HIDE 跑整条进程链,输出写 logs\desktop.log |
| desktop\start-official.cmd | 启动(保留控制台,便于直接看输出) |
| desktop\update-and-start.cmd | 更新 + 增量重建 + 启动(保留控制台以便看构建进度) |
| desktop\update-and-start.cmd --check | 只报告本地/远端状态与将要执行的构建 |
| desktop\open-log.cmd | 打开最近一次无窗口启动的输出 |

桌面只放一个快捷方式;更新与看日志是维护动作,从 desktop\ 目录里跑对应的 .cmd。

选项:

| 选项 | 作用 |
| --check | 只报告,不修改任何东西 |
| --full | 忽略增量判断,跑完整 pnpm run build |
| --no-build | 只更新,不构建 |
| --no-start | 更新后不启动桌面 |
| --git | 指定 git 可执行文件(默认 PATH 上的 git) |

两个启动器都会设置 DSH_HOME(默认 %USERPROFILE%\.dsh),让官方桌面直接用你已有的会话、工作区与凭据;不设置的话官方开发启动器会在 apps/desktop/.desktop-build 下另建一个空 home。

首次启动会准备随包运行时(Node + Python,约 270 MB),可能要好几分钟;网络受限时设好 HTTPS_PROXY 后重跑即可。

.cmd 与 .vbs 必须保持 CRLF 行尾且纯 ASCII:cmd.exe 会误解析 LF-only 批处理,而其中的 UTF-8 多字节字符会触发 DBCS 前导字节错位。.gitattributes 已声明这两类文件为 CRLF。

启动前的环境修复(preflight)

两条启动路径都会先跑 preflight.js,它只做幂等的两件事:

1. 清理 pnpm 死链。 pnpm 的 node_modules/.pnpm/node_modules 会残留已删除包的链接(install、--force、删 .modules.yaml 都报 “Already up to date”,不会清理)。官方开发启动器会遍历该目录并对每条链接 realpathSync,任何一条死链都会让启动直接 ENOENT 失败。判定标准只有两条:目标不存在,或目标不是包目录(没有 package.json);包名与链接名不同的正常别名(如 string-width-cjs)保留。
2. 盖章 exe 图标。 见下节。

启动路径:快速与完整

上游 pnpm run start:desktop 每次都跑 dev.ts,它无条件做两件重活:

1. prepareDevelopmentProject —— 把约 1500 个依赖链接镜像进一次性项目;
2. preparePrimaryRuntime —— 完整冒烟:用随包 Python 导入 numpy/pandas、做 Office 文档往返转换、跑 pip check、核对 node/pnpm 版本。

本机实测这条路要约 100 秒才能出窗口,而那两份准备结果是落在磁盘上、跨启动有效的。所以 start.js 先判断它是否仍然对应当前检出:

| 条件 | 不成立时 |
| apps/desktop/lib/main.js 与 apps/desktop-host/lib/index.js 存在 | 回退完整启动 |
| 目标平台的 primary-runtime 目录存在 | 回退完整启动 |
| 一次性项目记录的桌面版本 == 当前 apps/desktop/package.json 版本 | 回退完整启动 |
| 记录的工作区状态(git HEAD + pnpm-lock.yaml 修改时间)未变 | 回退完整启动 |

全部成立就直接拉起 Electron(launch.js 按 dev.ts 的方式设置环境与参数),把日常启动压到几秒;任何一条不成立都回退到上游完整路径,那次运行会重建被校验的东西并更新记录。

- node start.js --check 只打印这次会走哪条路以及原因。
- 拉取新源码或改动依赖锁之后,下一次启动会是完整启动(约 100 秒),之后恢复快速。
- 如果你自己跑过上游 pnpm run start:desktop,用 node start.js --mark-prepared 把当前状态记为已准备,下次即走快速路径。

启动器还会清掉继承来的 ELECTRON_RUN_AS_NODE:DSH 自己的 Electron 子进程会设置它,一旦被继承,Electron 会按纯 Node 启动并对 --remote-debugging-port / --user-data-dir 报 bad option 直接退出。上游 dev.ts 只展开 process.env,没有这一步。

Windows 图标

上游既没有 app.setAppUserModelId,也没给主窗口指定 icon,所以任务栏、Alt+Tab 与 exe 图标都来自 Electron 可执行文件本身——未打包启动就是 Electron 默认图标。

这一层就地给 dist\electron.exe 盖章应用图标与产品名,而不是复制改名成 DeepSeekHarness.exe:

| 可执行文件 | app.isPackaged |
| electron.exe | false → 官方桌面正确进入开发模式 |
| DeepSeekHarness.exe | true → 官方桌面误判为已打包,去找 apps/desktop/dsh/desktop-runtime.json 并启动失败 |

Electron 在 Windows 上按可执行文件名判断 app.isPackaged(process.defaultApp 是另一个基于参数的信号,两者不等价)。所以改名这个老办法会直接破坏官方桌面的开发模式判定。

盖章用仓库已带的 rcedit(desktop/node_modules/rcedit),幂等判断记录在 dist\.dsh-icon-stamp.json:标记里的图标摘要 + 盖章后的 exe 大小都匹配才跳过;重装依赖把 exe 还原成原始字节后大小会变,下次启动自动重盖。

图标取自本仓库自带的两份图标,都是本机原本在用的那张图,而不是上游的 apps/desktop/resources/:

| 文件 | 用途 |
| assets\deepseek-win.ico | 盖章进 electron.exe(任务栏 / Alt+Tab / exe) |
| assets\deepseek.ico | 桌面与开始菜单快捷方式 |

上游托盘图标 apps/desktop/resources/tray-windows.ico 是上游资源,这一层不改它。

增量构建规则

变更文件 → pnpm run 步骤:

| 变更位置 | 构建步骤 |
| 仅 .md / docs/ / .agents/ / snapshots/ / LICENSE | 不构建 |
| 仅 .github/ / website/ / benchmarks/ / examples/ | 不构建 |
| 仅 apps/desktop/* | build:desktop |
| 仅 apps/web/ | build:web |
| packages/client/ | build:lib + build:web |
| 其它 packages/、apps/cli/、apps/desktop-host/、vendor/、scripts/、根配置文件 | build:lib |
| native/* | build:native-system + build:lib |
| 认不出的新区域 | 完整 build |

每一步都必须在官方 package.json 里真实存在,tests/build-plan.test.js 会在嵌套检出时校验这一点。规则判断错时可以 --full 覆盖。

目录

desktop/ ← 本仓库 launch-hidden.vbs 无窗口启动(输出写 logs\desktop.log) start-official.cmd 启动(保留控制台) start.js 启动入口:preflight → 快速或完整启动;--check / --mark-prepared launch.js 决策采集与 Electron 启动;--check 的实现 launch-plan.js 能否跳过上游准备的纯判断 update-and-start.cmd 更新 + 增量重建 + 启动 update-and-start.js 编排:fetch → ff → install → build → launch preflight.js 启动前修复:清理 pnpm 死链 + 盖章 exe 图标 link-audit.js pnpm virtual-hoist 死链的识别与清理 stamp-electron-icon.js 就地给 electron.exe 盖图标与产品名 build-plan.js 变更文件 → 构建步骤 gitup.js dirty / behind / lockfile / ff 判定(纯逻辑) proc.js 子进程执行器(超时杀进程树) open-log.cmd 打开最近一次无窗口启动的日志 tests/ node:test assets/deepseek-win.ico exe / 任务栏图标(BMP 帧,Windows 资源用) assets/deepseek.ico 快捷方式图标(PNG 帧)

npm 脚本

| 命令 | 作用 |
| npm test | node --test |
| npm start | 等于 start-official.cmd |
| npm run check | 打印这次会走快速还是完整启动 |
| npm run update | 等于 update-and-start.cmd |
| npm run stamp | 单独盖章 exe 图标(-- --force 强制重盖) |
唯一的运行期依赖是 rcedit(盖章 exe 用);Electron 由上游 apps/desktop 自己声明。

测试

node --test

嵌套在上游检出内时,测试会额外校验构建步骤名在官方 package.json 中存在;单独检出本仓库时该用例自动跳过。

License

本仓库代码 MIT。官方桌面、web 界面与上游功能归 deepseek-ai/deepseek-harness(MIT, Copyright (c) 2026 DeepSeek)所有;DeepSeek 徽标归其权利人所有。
预览分享卡片长什么样 ↓Fahaxik1oxxx/dsh-desktop
分享 · DeepSeek Harness Hub
Fahaxik1oxxx/dsh-desktop

dsh-desktop — 官方 DeepSeek Harness 桌面的外置增强层

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部