dsh-auto-update:给 DeepSeek Harness CLI 的安全升级方案

前言

DeepSeek Harness(DSH)CLI 本身没有内置的 update 子命令。升级主程序需要手动运行 npm install,而且一旦在服务运行时原地覆盖安装,旧进程会紧握旧模块,新版本启动失败时也无法回退。这个插件的前提只有一条:永不原地升级正在运行的实例。

这是什么

这是 Wonderow666 维护的一个 DSH 插件,用于从网页设置页检查、安装并回滚 @deepseek-ai/dsh 的更新。新版本会装到独立目录,先通过配置冒烟验证,再切换启动指针,失败时自动回滚。插件运行在当前 dsh 进程权限下,安装前建议检查源码与许可证。

核心能力

  • 旁路安装:新版本装到 <installBase>\dsh-install-<version>,与当前实例隔离。
  • 健康检查与自动回滚:切换指针后由宿主之外(WMI 拉起)的进程重启,失败则回退指针并写入 last-result.json(status: "rolled-back")。
  • 安装目录可配置:支持在设置页浏览/输入目录,支持迁移当前安装到新目录,失败时指针与目录一起回滚。
  • 网页端管理:设置页“载具更新”卡片提供版本检查、安装、回滚、目录配置与自动更新开关。

安装与启用

推荐从 GitHub 安装:

dsh plugin --profile web add github:Wonderow666/dsh-auto-update

或从本地目录安装:

dsh plugin --profile web add link:C:\path\to\dsh-auto-update

安装后需在 profile 的 bundles 里启用:

{
  "dsh": { "profile": { "bundles": [ "...", "dsh-auto-update" ] } }
}

最后重启一次 web 宿主让插件加载。之后的升级无需再手动重启。

配置

插件通过环境变量与 profile 配置来约定目录结构与启动方式:

变量 默认 说明
DSH_AUTO_UPDATE_LAUNCH_CMD (空) 切换版本后重启 web 宿主的脚本;未配置则不允许升级
DSH_AUTO_UPDATE_LAUNCHER_DIR %DSH_HOME%\auto-update\launcher 启动指针 current-root.txt 所在目录
DSH_AUTO_UPDATE_BOOT_LOG (空) 启动日志路径;配了才能在卡片上显示“起不来”的具体原因
DSH_HOME ~/.dsh DSH 数据根;安装目录默认在它旁边
DSH_AUTO_UPDATE_INSTALL_BASE (空) 安装目录的兜底默认值,会被 install-base.txt 覆盖

示例:

setx DSH_AUTO_UPDATE_LAUNCH_CMD "C:\tools\start-dsh-web.cmd"
setx DSH_AUTO_UPDATE_LAUNCHER_DIR "C:\tools\dsh-launcher"
setx DSH_AUTO_UPDATE_BOOT_LOG "C:\tools\start-dsh-web.log"

profile 配置(cordis.patch.yml):

- id: dsh-auto-update
  name: dsh-auto-update
  config:
    enabled: true
    channel: latest
    intervalHours: 6
    autoApply: false
    registry: ""

运行时修改(设置页开关、接口调用)落到 %DSH_HOME%\auto-update\config.json,优先级高于 patch 里的默认值。

启动脚本契约

插件只负责切换指针,起进程这一步交给你自己的脚本。examples/start-dsh-web.cmd 是一份可直接改的模板:

  • 指针只写版本号(如 0.2.1-rc.2),脚本自己拼出安装目录。
  • 读不到指针时,按 dsh-install-* 目录名倒序回退到最新的完整安装。
  • 一定要把 stdout/stderr 落盘(模板写同目录 web-run.out.log,并自行轮转)。
  • 用了自定义安装目录时,脚本还要读同目录的 install-base.txt 决定去哪个目录找 dsh-install-<版本>,读之前先执行 chcp 65001。

安装目录(可改)

默认安装目录是 %DSH_HOME% 的上一级(例如 ...\w),每个版本装在 <安装目录>\dsh-install-<版本> 里。设置页的「安装目录」区块可以把它换到别的盘:

  • 浏览…:弹出系统的选目录窗口,选完直接把路径填进输入框。服务绑定在 127.0.0.1 时是 Windows 原生对话框;从手机或别处访问时对话框出现在运行 dsh 的那台机器的屏幕上,这时手动输入或粘贴路径即可。
  • 输入框旁边的提示会实时预览落点:将安装到 <安装目录>\dsh-install-<当前版本>。你填/选的路径里出现 Windows 禁止的字符(" * ? < > |)会立刻标红并禁用两个写入按钮。中文目录名可以。
  • 改到这里:只写配置,不动正在跑的安装;之后 /apply 装的新版本会落在新目录。
  • 把当前安装迁过去:整体复制(robocopy)→ 自检(版本号 + --dump-config 冒烟)→ 写 install-base.txt → 切指针 → 重启 → 健康检查 + 版本核对。任何一步失败,指针和 install-base.txt 会一起回滚。
  • 恢复默认位置:删掉 install-base.txt。

契约(<指针目录>\install-base.txt,默认 %DSH_HOME%\auto-update\launcher\):

D:\dsh-installs
  • 只有一行、UTF-8(无 BOM)的绝对路径、无换行。启动脚本读这个文件之前必须切到 UTF-8 代码页(chcp 65001),否则 cmd 会按 OEM 代码页解码,中文目录名变成乱码后静默指向空目录。
  • 文件不存在 = 用默认安装目录。
  • 迁移后旧目录不会自动删(它就是回滚路径),确认新版稳定后自己清理。
  • 指针存的是版本号而不是路径,所以“同一版本在两个目录里都有”时按 install-base.txt → 默认目录的顺序找,再退到该目录下最新的完整安装。

限制:自定义目录必须是绝对路径、不含 " * ? < > |、不以空格或点结尾,磁盘剩余空间需 ≥ 安装体积的 1.2 倍(0.2.x 每个版本约 300–700 MB)。

接口

全部在 /dsh-auto-update/api 下。写操作必须带 x-dsh-auto-update: 1 头。

方法 路径 说明
GET /status 当前/最新版本、通道、可用更新、上次结果、挂起任务、canRestart
GET /health 存活探针
POST /check 查 registry 的 latest/next/alpha,写 state.json
POST /apply 后台安装,body 可带 {"version":"x.y.z"},默认最新版
POST /rollback 回到 previous-root.txt 记录的版本
POST /config 改 autoApply / intervalHours / channel / registry,落 config.json
POST /install-base 设置安装目录,body {"base":"D:\\dsh-installs"};传 "" 恢复默认位置(只影响以后的新版本)
POST /migrate 把当前安装复制到新目录并重启过去,body {"base":"..."};失败自动回滚指针与目录

示例:

$base = "http://127.0.0.1:3080/dsh-auto-update/api"
curl.exe -s "$base/status"
curl.exe -s -X POST "$base/check" -H "x-dsh-auto-update: 1"
curl.exe -s -X POST "$base/apply" -H "x-dsh-auto-update: 1" -H "content-type: application/json" -d "{}"
curl.exe -s -X POST "$base/rollback" -H "x-dsh-auto-update: 1"
curl.exe -s -X POST "$base/install-base" -H "x-dsh-auto-update: 1" -H "content-type: application/json" -d '{"base":"D:\\dsh-installs"}'
curl.exe -s -X POST "$base/migrate" -H "x-dsh-auto-update: 1" -H "content-type: application/json" -d '{"base":"D:\\dsh-installs"}'

适用场景与注意

适合需要频繁升级 @deepseek-ai/dsh 的 DSH / 智能体开发场景,尤其是需要避免原地覆盖、保证升级可回退的情况。插件以当前 dsh 进程权限运行,安装前建议检查源码与许可证。注意:Windows Only(PowerShell 5.1 + cmd),依赖 WmiPrvSE.exe 进行进程交接,以宿主之外的重启保证切换可靠性。

短结尾

这个插件在网页端提供了一套完整的安全升级流程:旁路安装、健康检查与自动回滚,让 DSH 主程序升级不再依赖手动 npm install。安装与配置见上方代码块与说明。目录页与 GitHub 链接见下方。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye