dsh-plugin-desktop-control
September 2, 2026 · View on GitHub
DeepSeek Harness 的 cordis 插件:在 DSH 里用 /desktop 命令打开并控制独立的 Electron 桌面外壳。
命令
| 命令 | 作用 |
|---|---|
/desktop open | 用当前 DSH web 地址打开桌面窗口(含自动聚焦已有实例) |
/desktop auto on / auto off | 管理桌面应用的开机自启(写共享配置,桌面应用约 5 秒内应用) |
/desktop update | 请求桌面应用检查更新(桌面应用轮询到后触发 electron-updater) |
/desktop stop | 请求桌面应用停止由它启动的本地 DSH 服务(没有可停的服务时桌面端会提示) |
/desktop notify <文本> | 请求桌面应用弹一次系统通知;支持 --silent(无声)与 --title <标题>(自定义标题,默认「DSH 通知」) |
/desktop status | 回显桌面应用的地址 / 自启 / 可执行路径 |
自动通知(turn 结束 / 审批等待)
0.3.0 起插件监听 DSH 的 session/event 事件流,把两类高价值时机自动转成系统通知
(走与 /desktop notify 相同的共享配置通道,无需手动敲命令):
| 事件 | 通知 | 默认 |
|---|---|---|
turn/end(reason=error / blocked / max-tokens) | 「DSH 回合出错/受阻/输出截断」,带会话短 id、轮次与错误摘要 | 开(problems 档) |
turn/end(reason=completed) | 「DSH 回合完成」,静默无声 | 关(all 档才开) |
approval/asked | 「DSH 等待审批」,带工具名与原因 | 开 |
档位在 DSH「设置 → 插件 → 插件配置 → desktop-control」里调整:
notifyTurn:off/problems(默认,仅异常)/all(完成也通知,静默不响铃)notifyApproval:审批等待通知开关(默认开)
aborted(用户主动取消)与 interrupted(崩溃恢复合成)不通知。
通知通道为单槽:一条通知被桌面应用取走前,后续自动通知会在插件内排队
(每 2s 重试,积压超过 60s 丢弃);手动 /desktop notify 直接占用槽位。
桌面应用勿扰时段内的通知会被外壳静默丢弃(按既有勿扰设计)。
运行机制
插件运行在 DSH 进程内,与独立 Electron 桌面应用通过共享配置文件通信:
- 路径:
$DSH_HOME/desktop-shell.json(或DSH_DESKTOP_CONFIG环境变量显式指定) - 字段:
url/autoLaunch/updateRequest/serviceStopRequest/notifyRequest/desktopExe
/desktop notify 写入 notifyRequest(唯一 id + 标题 + 正文),桌面应用轮询到后弹一次
系统通知并清空该字段(应用重启不补弹启动前的请求);应用处于勿扰时段时静默丢弃。
/desktop open 通过 ctx.webServer.port 拿到当前 DSH web 的监听端口,把它作为 --url 传给桌面应用(同时写进共享配置),桌面应用据此直接连到当前实例,不重复启动后端。
安装(写进 DSH profile)
插件是纯 JS 单文件,可通过 dsh plugin 装进某个 profile 的 node_modules,再在 cordis.patch.yml 里 include:
# 1. 把本目录作为本地依赖装进当前 profile
dsh plugin --profile web add file:/path/to/dsh-plugin-desktop-control
# 2. 在 profile 的 cordis.patch.yml 里加入该插件条目
# (或用 dsh 提供的 include 语法把包名列入插件树)
cordis.patch.yml 追加一条:
- id: desktop-control
name: dsh-plugin-desktop-control
重启 DSH 后,在 Web UI 输入框里输 /desktop status 验证加载成功。
前置条件
/desktop open依赖桌面应用已运行过一次(打包版),把自身可执行路径写进共享配置的desktopExe。开发模式(desktopExe 指向 electron.exe)不支持open。- 桌面应用与 DSH 需共享
DSH_HOME(从 DSH 里被 spawn 时会继承)。
发布状态
当前状态:测试期私密发布。
package.json标记了"private": true, 不会(也不应)发布到公共 npm;dsh plugin add用本地路径即可。 转入稳定后再移除private并npm publish。