双击图标即可启动并常驻托盘管理进程
28.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add GehrmannMerlin/DeepSeek-harness-Desktop该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · desktop
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 69 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 43 处,展示前 36 条)
- 写入本地文件src/utils/boot-timeline.js:35
stream = fs.createWriteStream(path.join(logsDir, 'boot.log'), { flags: 'a' }); - 发起网络请求src/health/harness-health-checker.js:21
req = http.get(url, { timeout: timeoutMs }, (res) => { - 写入本地文件src/utils/logger.js:10
this.stream = fs.createWriteStream(file, { flags: 'a' }); - 写入本地文件src/utils/paths.js:19
fs.mkdirSync(dir, { recursive: true }); - 执行外部命令固定命令src/utils/npx-resolver.js:47
execFile('where', [tool], { encoding: 'utf8', windowsHide: true, timeout: 5000 }, (err, stdout) => { - 读取本地文件src/runtime/runtime-state-store.js:57
raw = await this.fs.readFile(this.filePath, 'utf8'); - 写入本地文件src/runtime/runtime-state-store.js:83
await this.fs.mkdir(path.dirname(this.filePath), { recursive: true }); - 写入本地文件src/runtime/runtime-state-store.js:91
await this.fs.rename(temporaryPath, this.filePath); - 删除本地文件src/runtime/runtime-state-store.js:94
await this.fs.unlink(temporaryPath).catch(() => {}); - 读取本地文件src/runtime/dsh-runtime-manager.js:102
pkg = JSON.parse(await this.fs.readFile(packagePath, 'utf8')); - 读取本地文件src/runtime/dsh-runtime-manager.js:133
pkg = JSON.parse(await this.fs.readFile(packagePath, 'utf8')); - 读取本地文件src/runtime/dsh-runtime-manager.js:144
const stats = await this.fs.stat(cliEntry); - 写入本地文件src/runtime/dsh-runtime-manager.js:192
await this.fs.mkdir(versionsDir, { recursive: true }); - 写入本地文件src/runtime/dsh-runtime-manager.js:208
await this.fs.rename(resolvedStaging, targetRoot); - 写入本地文件src/runtime/dsh-runtime-manager.js:232
await this.fs.rename(targetRoot, isolated); - 读取本地文件src/runtime/dsh-runtime-manager.js:314
entries = await this.fs.readdir(stagingDir, { withFileTypes: true }); - 读取本地文件src/runtime/dsh-runtime-manager.js:325
const stats = await this.fs.stat(candidate); - 删除本地文件src/runtime/dsh-runtime-manager.js:328
await this.fs.rm(candidate, { recursive: true, force: true }); - 读取本地文件src/runtime/dsh-runtime-manager.js:345
entries = await this.fs.readdir(versionsDir, { withFileTypes: true }); - 删除本地文件src/runtime/dsh-runtime-manager.js:363
await this.fs.rm(rootPath, { recursive: true, force: true }); - 发起网络请求src/update/npm-registry-update-source.js:14
const request = https.get(endpoint, { headers: { accept: 'application/json' } }, (response) => { - 写入本地文件src/update/runtime-artifact-downloader.js:36
const writer = fs.createWriteStream(destination, { flags: 'wx' }); - 写入本地文件src/update/runtime-artifact-downloader.js:62
await fsp.mkdir(extractionRoot, { recursive: true }); - 写入本地文件src/update/runtime-artifact-downloader.js:65
await fsp.mkdir(destination, { recursive: true }); - 写入本地文件src/update/runtime-artifact-downloader.js:68
await fsp.mkdir(path.dirname(destination), { recursive: true }); - 写入本地文件src/update/runtime-artifact-downloader.js:69
await pipeline(entry.stream(), fs.createWriteStream(destination, { flags: 'wx' })); - 写入本地文件src/update/runtime-artifact-downloader.js:82
await fsp.mkdir(operationRoot, { recursive: true }); - 删除本地文件src/update/runtime-artifact-downloader.js:91
fsp.rm(archivePartPath, { force: true }), - 删除本地文件src/update/runtime-artifact-downloader.js:92
fsp.rm(archivePath, { force: true }), - 删除本地文件src/update/runtime-artifact-downloader.js:93
fsp.rm(operationRoot, { recursive: true, force: true }), - 执行外部命令来自配置/变量src/update/runtime-verifier.js:13
execFile(command, args, { timeout: timeoutMs, windowsHide: true, encoding: 'utf8' }, (error, stdout, stderr) => { - 读取本地文件src/update/runtime-verifier.js:44
manifest = JSON.parse(await fs.readFile(packagePath, 'utf8')); - 读取本地文件src/update/runtime-verifier.js:54
const stat = await fs.stat(cliEntry); - 执行外部命令固定命令src/process/process-tree.js:8
execFile('taskkill', args, { windowsHide: true, timeout: 10000 }, (err, stdout, stderr) => { - 写入本地文件src/update/npm-installer.js:33
await fs.mkdir(stagingRoot, { recursive: true }); - 写入本地文件src/update/npm-installer.js:34
await fs.writeFile(`${stagingRoot}/package.json`, '{"private":true}\n', 'utf8');
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 一键启动桌面应用
- 系统托盘常驻
- 进程生命周期管理
把 DeepSeek Harness(npx @deepseek-ai/dsh web)封装成 Windows 桌面应用的 Electron 宿主:一键启动、系统托盘常驻、进程生命周期管理、NSIS 一键安装。
README
由 DeepSeek 最新模型翻译生成DeepSeek Harness Desktop
把 DeepSeek Harness(npx @deepseek-ai/dsh web)封装成 Windows 桌面应用的 Electron 宿主程序。
一键启动、系统托盘常驻、进程生命周期管理、打包成安装程序 —— 不需要命令行,双击图标即可使用。
Version
License
Platform
Electron
Node
✨ 这是什么?
DeepSeek Harness Desktop 是一个 Windows 桌面宿主程序。它不修改、不重写 DeepSeek Harness 本身,只在外面套一层 Electron 桌面外壳:
- 启动时自动在后台运行 npx @deepseek-ai/dsh web
- 等待 Harness 就绪后,自动在窗口中加载页面
- 管理窗口 / 系统托盘 / 进程生命周期
- 打包成 NSIS 一键安装程序
你只需要双击桌面图标,剩下的交给它。
🚀 特性
- 🚀 一键启动:双击图标,自动拉起 Harness,无需打开命令行手动执行 npx。
- 📋 系统托盘常驻:点窗口右上角 × 不是退出,而是最小化到托盘;托盘菜单提供「打开 / 隐藏窗口」「重新启动 Agent」「在浏览器中打开」「退出」。
展开完整文档(README 剩余 1 节)
DeepSeek Harness Desktop 把 DeepSeek Harness(npx @deepseek-ai/dsh web)封装成 Windows 桌面应用的 Electron 宿主程序。 一键启动、系统托盘常驻、进程生命周期管理、打包成安装程序 —— 不需要命令行,双击图标即可使用。 Version License Platform Electron Node ✨ 这是什么? DeepSeek Harness Desktop 是一个 Windows 桌面宿主程序。它不修改、不重写 DeepSeek Harness 本身,只在外面套一层 Electron 桌面外壳: - 启动时自动在后台运行 npx @deepseek-ai/dsh web - 等待 Harness 就绪后,自动在窗口中加载页面 - 管理窗口 / 系统托盘 / 进程生命周期 - 打包成 NSIS 一键安装程序 你只需要双击桌面图标,剩下的交给它。 🚀 特性 - 🚀 一键启动:双击图标,自动拉起 Harness,无需打开命令行手动执行 npx。 - 📋 系统托盘常驻:点窗口右上角 × 不是退出,而是最小化到托盘;托盘菜单提供「打开 / 隐藏窗口」「重新启动 Agent」「在浏览器中打开」「退出」。 - 🔁 单实例锁:重复双击只会唤醒已有窗口,不会启动第二份 Harness 或第二个托盘图标。 - ♻️ 复用已运行的 Harness:若 127.0.0.1:3080 上已经有一个 Harness,直接复用,退出时不会误杀它。 - 🧹 精准进程清理:只清理自己 spawn 出来的进程树(taskkill /pid /T),绝不 taskkill /IM node.exe,避免误杀其它 Node 程序。 - 🔍 智能就绪检测:通过 HTTP 签名(DeepSeek Harness + window.__DSH_BOOT__)判断端口上跑的到底是不是真正的 Harness,而不是「端口开了就算数」。 - 🖥️ 启动页 + 错误页:本地 splash 页面实时显示启动状态;环境缺失 / 端口被占用 / 启动超时都有清晰的中文错误提示。 - ⚡ 启动优化:热启动窗口可见 .exe(见 Releases)。 2. 双击运行安装向导(NSIS,可选安装目录)。 3. 安装完成后,桌面与开始菜单会生成「DeepSeek Harness」快捷方式。 前置要求:本机已安装 Node.js(含 npm / npx),且 npx 在系统 PATH 中。 程序本身不捆绑 Node 运行时,运行时会调用系统里的 npx。 🎯 使用方式 | 操作 | 行为 | | 双击桌面图标 | 显示启动页,后台拉起 Harness,就绪后自动打开 | | 点窗口右上角 × | 缩小到系统托盘(不是退出) | | 左键单击 / 双击托盘图标 | 显示窗口 | | 托盘 →「重新启动 Agent」 | 停止并重新拉起 Harness | | 托盘 →「在浏览器中打开」 | 用系统默认浏览器打开当前 Harness 地址 | | 托盘 →「退出」 | 真正退出,并清理自己启动的 Harness 进程 | ⚙️ 工作原理与关键行为 - 端口:DeepSeek Harness Web 默认监听 127.0.0.1:3080(不是 13080)。桌面端从 stdout 解析实际 URL,仅当解析不到时才回退到 3080。 - 启动时序:先显示窗口(本地 splash),再在后台异步检查环境并拉起 Harness —— First Paint ≠ Harness Ready,窗口显示不等待 Harness 就绪。 - URL 检测:解析 dsh 输出的 dsh web: http://127.0.0.1:3080 这一行,兼容 127.0.0.1 / localhost。 - 复用 vs 独占:启动时探测 3080,区分三种状态 —— 真 Harness(复用)、被别的程序占用(报错)、空闲(拉起新进程)。只有自己 spawn 的进程会在退出时被清理。 - 进程清理:taskkill /pid /T(定向整树清理),先优雅停止,1.5s 后仍在则强杀,最多等 6s。 - 日志:位于 %APPDATA%\deepseek-harness-desktop\logs\,包含 application.log(应用日志)、harness.log(Harness stdout/stderr)、boot.log(启动时间线)。 🏗️ 架构 Electron Main (src/main.js,仅装配) ├─ AppLifecycle (lifecycle/) —— 编排启动/退出/崩溃恢复/单实例 ├─ HarnessProcessManager (process/) —— 唯一 spawn/stop/restart + 状态机 + ownership │ └─ ProcessTree (process/process-tree.js) —— taskkill 定向树清理 ├─ HarnessHealthChecker (health/) —— HTTP 轮询 + Harness 签名校验 ├─ MainWindow (window/) —— BrowserWindow 安全配置 + 页面切换 + hide-on-close ├─ TrayManager (tray/) —— 托盘 + 动态菜单 └─ utils/ —— logger / paths / url-detector / npx-resolver / boot-timeline 设计原则:main.js 只做装配,各 Manager 各司其职;跨模块通过少量回调 / 事件通信,不引入 IPC 总线、DI 容器或状态库。 完整启动流程: 双击图标 → 单实例锁(重复启动仅唤醒已有窗口) → Electron Ready → 移除默认菜单 → 创建 BrowserWindow (show:false, 深色背景) → 后台:异步 checkToolchain(node/npm/npx 是否存在) → loadFile(starting.html)(本地 splash) → ready-to-show(首帧)→ show() ← 正常路径 → 或 did-finish-load + 300ms → show() ← 冷启动 fallback ═════════ 用户已看到窗口 ═════════ → 异步 probe(3080) ├─ 已有 Harness → 复用(external) → loadURL └─ 无 → spawn npx @deepseek-ai/dsh web → waitUntilReady → loadURL → DeepSeek Harness UI 📁 目录结构 ├── src/ # 主进程源码 │ ├── main.js # 装配入口(轻量) │ ├── process/ │ │ ├── harness-process-manager.js # 唯一 spawn/stop/restart + 状态机 + ownership │ │ └── process-tree.js # taskkill 定向树清理 │ ├── health/ │ │ └── harness-health-checker.js # HTTP 轮询 + Harness 签名校验 │ ├── window/ │ │ └── main-window.js # BrowserWindow + 显示时序 + hide-on-close │ ├── tray/ │ │ └── tray-manager.js # 系统托盘 + 动态菜单 │ ├── lifecycle/ │ │ └── app-lifecycle.js # 启动/退出/崩溃恢复编排 │ └── utils/ # logger / paths / url-detector / npx-resolver / boot-timeline ├── renderer/ # 启动页 + 错误页 (HTML/CSS) ├── assets/ # icon.ico / icon.png / tray.png / source/favicon.svg ├── scripts/generate-icons.js # 图标生成 ├── docs/ # 设计文档、调试报告、性能报告 ├── test/ # 单元测试 ├── electron-builder.yml # 打包配置(NSIS) └── package.json 🖥️ 环境要求 | 依赖 | 要求 | | 操作系统 | Windows | | Node.js | ≥ 18(本机实测 v24.18.0),含 npm / npx,且在系统 PATH 中 | | 网络 | 首次运行需通过 npx 拉取 @deepseek-ai/dsh | 🧰 开发 bash npm install # 安装依赖(含 electron) npm run icons # 从官方 favicon.svg 生成 ico/png npm start # 开发模式运行 npm run dist # 打包 Windows 安装程序(NSIS) 打包产物在 dist/,安装程序为 NSIS 一键安装,含桌面与开始菜单快捷方式。 🔍 故障排查(FAQ) | 现象 | 原因 | 解决 | | 首次启动提示「未找到必要的运行环境」 | 缺少 Node.js / npm / npx,或不在 PATH | 安装 Node.js 并确认 npx 在系统 PATH 中 | | 提示「端口 3080 已被其他程序占用」 | 3080 上跑的进程不是 Harness | 关闭占用该端口的程序,或托盘「重新启动 Agent」 | | 提示「启动超时」 | Harness 未在 45s 内就绪 | 检查网络(首次需拉取 dsh),再点「重新启动 Agent」 | | 提示「启动后意外退出」 | dsh 进程启动后崩溃 | 查看 %APPDATA%\deepseek-harness-desktop\logs\harness.log | | 找不到日志 | 日志在用户目录下 | 打开 %APPDATA%\deepseek-harness-desktop\logs\ | 📝 更新日志(Changelog) 更新规范:每次发布新版本时,在下方最顶部新增一个 ## [x.y.z] - YYYY-MM-DD 区块,用下面三个小节记录改动: - ✨ 新增功能 —— 本次新增的能力 / 特性 - 🐛 修复 Bug —— 本次修复的问题 - 🔧 其他 —— 性能优化、依赖升级、文档等 版本号遵循 SemVer(主.次.修订),格式参考 Keep a Changelog。日常开发可先把改动写进顶部的 [Unreleased] 区块,发布时再归并到具体版本号。 [Unreleased] ✨ 新增功能 🐛 修复 Bug 🔧 其他 [1.0.0] - 2026-08-16 首个发布版本。 ✨ 新增功能 - Electron 桌面宿主:自动启动 npx @deepseek-ai/dsh web、等待就绪、加载页面。 - 系统托盘:动态菜单(打开 / 隐藏窗口、Agent 状态、重新启动 Agent、在浏览器打开、退出)。 - 启动页(splash)+ 错误页,启动状态实时更新,环境缺失 / 端口占用 / 超时均有清晰中文提示。 - 单实例锁:重复双击仅唤醒已有窗口,不重复启动。 - 复用已运行的 Harness(external ownership,退出不误杀)。 - 启动时间线诊断(Boot Timeline,写入 boot.log 并镜像到 application.log)。 - NSIS 一键安装包(含桌面 / 开始菜单快捷方式)。 - 图标自动生成脚本(从官方 favicon.svg 生成 ico/png)。 🐛 修复 Bug - 修复 Windows 11 25H2 下安装目录渲染器崩溃导致的整块黑屏:sandbox:false(保留 nodeIntegration:false + contextIsolation:true 作为主隔离边界)。 - 修复首次双击图标无窗口:窗口可见性不再被首帧锁死,新增页面加载完成后 300ms fallback。 - 修复需要第二次双击才出现窗口:随上一条修复消除,二次启动退化为纯唤醒。 - 修复 checkToolchain() 同步阻塞主进程 230–330ms 的问题:改为异步并后置到窗口创建之后。 - 移除默认的 File/Edit/View/Window 菜单。 🔧 其他 - 冷启动首帧仍受环境因素影响约 2–3s(渲染器冷启动 + Windows Defender 首次扫描 + 软件渲染冷编译),已用 fallback 让窗口壳提前出现,内容随后绘制。 - 补充调试与性能报告文档(docs/debug/、docs/performance/)。 🛡️ 安全说明 - 渲染器进程始终 nodeIntegration:false + contextIsolation:true,无 preload,无远程导航。 - 渲染器只加载本地内容(file:// splash + localhost Harness);外部链接一律交给系统默认浏览器。 - 进程清理仅针对自己 spawn 的进程树,绝不 taskkill /IM node.exe。 注:为修复 Win11 25H2 安装目录下的渲染器崩溃,渲染器启用了 sandbox:false(正确性修复,非性能优化)。上述 nodeIntegration:false + contextIsolation:true 仍是主要隔离边界,详见 docs/debug/startup-root-cause.md。 📄 许可证 MIT © GehrmannMerlin 本项目只是 DeepSeek Harness 的桌面宿主,DeepSeek Harness 及其图标版权归其各自所有者所有。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
GehrmannMerlin/DeepSeek-harness-Desktop
双击图标即可启动并常驻托盘管理进程
相关插件 · 桌面端
Codex 任务面板chuspeeism/dashi-taskboard
现代化可灵活嵌入的任务面板,支持 Codex、DeepSeek Harness
★ 3,409已汉化DSH
71.7
多智能体自进化开发平台Prism-Shadow/penguin-harness
统一、稳定的 Agent 自进化框架全自动优化:任意模型 · 任意算法 · 任意 Benchmark
★ 3,125已汉化DSH
71.1
桌面宠物PC2005-cloud/dsh-pet
DSH 桌面宠物:一行命令装好即用的透明动画小桌宠,支持多开、大小位置随心配置;还内置 DIY 素材链,能用 AI…
★ 5,465已汉化DSH
71
多端 Agent 工作台GCWing/OpenBitFun
OpenBitFun 是一个高度可定制的开源 Agent 工作台,让任务按你的方式持续推进。
★ 3,457已汉化DSH
70.8
DSH Desktopanywhere-labs/dsh-desktop
为 DeepSeek Harness DSH 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。
★ 34,710已汉化DSH
70.7
桌面宠物伴侣OpenPetsHQ/openpets
桌面伴侣平台,带宠物、插件,还能选配本地智能体集成。
★ 1,378已汉化DSH
70.2
这是你的仓库?认领条目