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」里调整:

  • notifyTurnoff / 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 用本地路径即可。 转入稳定后再移除 privatenpm publish