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 鏈接見下方。

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

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

小夜