dsh-auto-update
DeepSeek Harness(cordis)插件:让 harness 更新它自己。
它定期检查 npm 上 @deepseek-ai/dsh 是否有比当前安装更新的版本;发现更新后自动下载
tarball 并暂存(stage);等 harness 进程退出时,由分离的辅助进程执行 npm install -g,
把全局安装替换成新版本;可选地按原启动参数自动重启 dsh。Web 界面右下角默认只显示一个
「检查更新」小胶囊(点击展开完整面板),面板内显示版本状态,并提供「检查更新」「更新并重启」
「取消暂存」。
工作原理
- 安装发现 —— 通过
process.argv[1](npm shim 启动的…/node_modules/@deepseek-ai/dsh/lib/bin.js) 推导全局安装根目录;也可用config.installRoot显式指定。若 harness 是从源码 (pnpm dsh)运行的,则自动更新不可用并会在日志中说明。 - 版本检查 —— 调用
npm view @deepseek-ai/dsh@<distTag> version --json,复用你配置的 registry / 镜像 / 代理。内置极简 semver 比较(支持1.2.3-rc.1这类预发布版本)。 - 暂存 ——
npm pack下载精确版本的 tarball 到$DSH_HOME/updates/,写入pending-update.json(含 from/to、安装根、进程 pid、是否重启等)。此阶段不触碰运行中的安装。 - 应用 —— 在 harness 的
process.on('exit')里分离启动bin/apply-update.js: 等待旧进程真正退出(Windows 上运行中的进程会锁住 sharp/koffi/node-pty 等原生模块文件, 所以必须在退出后安装)→npm install -g <tarball>→ 校验安装版本 → 记录结果 → 按需用dsh <原参数>重启。
安装
在 profile 目录安装插件(与 dsh-session-stats-panel 一致):
corepack pnpm --dir "%USERPROFILE%\.dsh\profiles\web" add "C:\Users\baiyec\Desktop\Harness\plugins\dsh-auto-update"
或直接从 GitHub 安装(利用随包发布的 dsh.bundle 清单,插件会自动注册并激活):
dsh plugin add github:a1113622001/dsh-auto-update
手动安装时,需要把仓库根目录下的
cordis.patch.yml作为 bundle patch 注册到 harness,插件才会随 harness 自动启动。dsh plugin add已内置该 bundle,因此 无需手动维护(详见下面的 yaml 片段,它正是cordis.patch.yml的内容)。
然后在 %USERPROFILE%\.dsh\profiles\web\cordis.patch.yml 追加:
# dsh-auto-update: 让 harness 自我更新(检查 npm → 暂存 → 退出时应用)
- insert:
- id: auto-update
name: 'dsh-auto-update'
config:
distTag: latest
checkOnStart: true
checkIntervalMinutes: 240
autoStage: true
applyOnExit: true
relaunch: false
保存后运行中的 harness 会热加载宿主插件(cordis.patch.yml 被 watch),浏览器刷新一次页面
即可在右下角看到「检查更新」胶囊(默认收纳,点击展开面板)。
配置
| 字段 | 默认 | 说明 |
|---|---|---|
distTag |
latest |
跟踪的 npm dist-tag(如 latest / next) |
registry |
"" |
npm registry 覆盖;留空使用你配置的 registry |
checkOnStart |
true |
启动时检查一次 |
checkIntervalMinutes |
240 |
周期检查间隔(分钟);0 关闭周期检查 |
autoStage |
true |
发现更新后自动下载并暂存 |
applyOnExit |
true |
harness 退出时执行分离的应用进程 |
relaunch |
false |
应用后按原启动参数自动重启 dsh(面板上的「更新并重启」始终会重启) |
installRoot |
"" |
显式指定 harness 安装根目录(自动发现失败时用) |
updateDir |
"" |
更新文件目录;默认 $DSH_HOME/updates(C:\Users\<你>\.dsh\updates) |
行为细节
- 安全默认:默认只「暂存 + 退出时应用」,不会在会话中途杀进程。要全自动闭环,把
relaunch设为true,或点面板上的「更新并重启」。 - 面板按钮:
/autoUpdate是仅回环(loopback)的 RPC channel,浏览器通过POST /autoUpdate/<endpoint>调用status/check/stage/cancel/applyRestart。 - 手动触发:
applyRestart会先强制检查、必要时补暂存,然后写relaunch: true到 manifest,响应返回后 ~0.8s 退出进程,由退出钩子启动应用进程并自动重启。 - 崩溃容错:如果进程被强杀(无
exit事件),暂存的 manifest 会保留;下次启动插件会 恢复它并重新检查,之后照常应用。 - 更新历史:
$DSH_HOME/updates/update-history.jsonl记录每次应用的结果;update-result.json是最近一次的结果。
验证 / 手动测试
# 1) 插件语法
node --check plugins\dsh-auto-update\lib\index.js
node --check plugins\dsh-auto-update\lib\updater.js
node --check plugins\dsh-auto-update\bin\apply-update.js
# 2) 宿主 RPC 已挂载(harness 运行中)
curl -s -X POST http://127.0.0.1:3080/autoUpdate/status -H "content-type: application/json" -d '{"type":"client-request","rpcId":"t1","method":"status","payload":{}}'
# 3) 强制检查
curl -s -X POST http://127.0.0.1:3080/autoUpdate/check -H "content-type: application/json" -d '{"type":"client-request","rpcId":"t2","method":"check","payload":{}}'
已知限制
- 仅支持 npm 全局安装的 harness(
dshCLI 装在%APPDATA%\npm)。源码运行 (pnpm dsh/ 开发 checkout)不会被更新。 - 应用在退出后进行:若从未优雅退出(如直接杀进程、断电),更新会顺延到下次退出。
- Windows 上原生模块(sharp/koffi/node-pty)在进程退出后仍可能让文件句柄延迟释放,导致
npm install -g偶发EBUSY。helper 会等到记录在案的进程真正退出,再重试若干次(带退避), 因此不会因一次句柄未释放而失败。 npm install -g需要写入 npm 全局目录与缓存目录的权限(普通用户权限即可)。- 若把插件源码目录移走,已暂存 manifest 里记录的
helper路径会失效;重新检查即可重新暂存。
No comments yet. Be the first to write one.