dsh-host-restart:重啓 DSH 並自動續跑當前會話

前言

在 DeepSeek Harness(DSH)裏改宿主插件、cordis.patch.yml 或依賴包後,往往必須重啓進程新代碼纔會被加載。Cordis 按 URL 緩存已 import 的模塊,lib/*.js 這類改動尤其繞不開一次重啓。問題是:手動殺進程再拉起會掐斷正在進行的對話,用戶還要重新交代上下文。

常見做法是關窗口、刷新頁面或自己寫腳本拉進程,但會話恢復和續接消息通常要另做一套。下面介紹社區插件 dsh-host-restart(維護者 liuyun847,npm 包名 dsh-host-restart,當前 v0.8.0,MIT 許可證):在宿主側註冊模型工具 restart_dsh 與人工指令 /restart,把「殺當前實例 → 拉起新進程 → 恢復發起會話並注入固定續接句」合成一步。

這是什麼

dsh-host-restart 是 DSH 宿主插件(分類:工作流),通過 cordis.patch.yml 向宿主註冊工具與命令。它不做業務邏輯擴展,只解決「重啓後接着聊」:重啓前可選調用同 profile 下 dsh-host-sl 提供的 slHandoff.saveAll 刷新 SL 工作表;重啓後由 sessionController.resolveAgent 掛回發起會話,並注入固定文案 dsh已重啓,繼續(v0.5.0 起工具無參數、文案不可配)。

實現上依賴 Windows 上的 PowerShell 驅動腳本 dsh-restart.ps1(WMI 脫離 dsh 進程樹啓動),README 中的時序與排障均以 Windows + web 或 Electron 桌面宿主 爲準。社區目錄 SkillHub 標註該插件可安裝;SkillHub 爲社區站點,與 DeepSeek / 幻方無官方從屬關係。DSH 生態本身是「一切皆插件」,安裝前建議在 GitHub 閱讀源碼與許可證,並理解插件以 當前 dsh 進程權限 執行重啓與寫盤操作。

核心功能

兩條入口,同一套流程

v0.7.0 起除模型工具外,用戶還可在輸入框直接敲 /restart。兩條入口共用執行體 performRestart(會話校驗 → 活動檢測 → 交接保存 → 寫標記 → 起驅動腳本),差別僅在於失敗/成功文案前綴。/restart 走官方 commands 服務註冊;若服務缺席,只記日誌,不影響 restart_dsh 工具。

模型側調用形式爲無參工具:

restart_dsh()

工具返回會要求模型 立刻結束本輪輸出;整輪重啓在 README 實測中約 11 秒(看門狗不在、自行拉起)到 26 秒(看門狗換手),模型側描述裏亦提到約 20–40 秒 量級,需預留等待。

重啓前:告知,不攔截

v0.4.0 起,檢測到其它會話仍有「在飛」活動(本會話本輪在跑、名下子代理在跑、名下後臺作業未結算)時 不再拒絕重啓,只在日誌與工具返回裏點名會話 id、原因及交接是否存盤,然後照常執行。代價是:被打斷會話裏進行中的那一步工具調用無法救回。

重啓前:可選 SL 交接(v0.8.0 契約)

若已裝載 dsh-host-sl,首次調用重啓入口時會探測 slHandoff 服務,並調用:

saveAll({ all: true, noteSessionId, session })

服務側最多刷新約 5 秒,本插件最多等待 7 秒;v0.8.0 會等待提交結果並在返回文案中報告實際會話 ID 與刷新完整度。job-only 會話不入表、不承諾由 SL 恢復;服務缺席、失敗或超時 不阻斷重啓。

重啓後:恢復會話與注入

插件在新進程 apply 後讀 $DSH_HOME/storages/dsh-restart/pending.json,延遲默認 4 秒(bootDelayMs),再恢復 sessionId 對應會話。

若 dsh-host-sl 的待續標記裏已有本會話未處理條目,本插件 讓位,由對方的【sl 交接續跑】注入(正文開頭含「dsh 已重啓」);約 10 秒 後兜底複查,若對方未接手且會話仍非 running,再補註入同一句固定文案。無交接記錄時直接 followup("dsh已重啓,繼續")。

web 宿主與 Electron 桌面端(v0.6.0)

維度 web 宿主 Electron 桌面端
殺進程 命中本實例的 node + dsh\lib\bin.js 同一安裝路徑下 整棵 DeepSeek Harness.exe 進程樹
拉起 看門狗換手或腳本自行 node bin.js 舊進程退乾淨後冷啓動同一 exe
會話續跑 與桌面端相同(標記 + resolveAgent + 注入) 同上

桌面端只殺 同一 exe 安裝路徑 下的實例,避免誤傷其它安裝。

硬邊界(調用會被拒絕或需知悉)

  1. 僅主會話:session.header.origin === 'subagent' 或拿不到會話 id 時拒絕,不寫標記、不重啓。
  2. 只殺本實例:驅動腳本身份解析失敗(退出碼 4)時一個進程都不殺。
  3. 在飛子代理與後臺作業會被硬殺,結果丟失;job-only 會話不會自動恢復。
  4. 模型工具描述要求:僅當用戶明確要求重啓時使用。

安裝與啓用

README 未給出單獨的 dsh plugin add … 一行命令;安裝可走社區目錄頁(當前展示 v0.8.0、來源 GitHub):

安裝完成後,在 DSH Web 側欄「插件」頁 →「已安裝」區 打開 dsh-host-restart 卡片總開關(寫入 dsh.profile.bundles)。卡片內還有行級開關,可在 profile 的 cordis.patch.yml 裏對 restart-dsh 寫 disabled: true 覆寫。

注意:修改 lib/*.js 後必須再經歷一次 dsh 重啓才加載新模塊;因此 v0.7.0 的 /restart 也要等「下一次重啓之後」纔可用。包內 cordis.patch.yml 的 config 段可選,例如 bootDelayMs、staleMs、restartScript 等;非法值會 fail loud、不註冊工具。

卸載示例(README 回滾流程,<profile> 換成你的 profile 名,如 desktop):

node <工作區>\dsh\dsh-plugin-manager\dshpm.mjs remove dsh-host-restart --profile <profile>

若 pnpm remove 報供應鏈策略錯誤,可在 profile 目錄執行:

pnpm remove dsh-host-restart --config.minimum-release-age=0

典型用法

1. 改完插件代碼後讓模型重啓

在對話中明確說明需要重啓 DSH 以加載新代碼,由模型調用 restart_dsh()。調用成功後模型應停止本輪輸出;約十餘秒到半分鐘內,同一會話應收到續跑消息(固定句或 SL 交接句),無需手動刷新或重述上下文。

2. 用戶直接重啓

在輸入框發送:

/restart

行爲與工具一致,但不向模型發送「請立刻結束本輪迴復」類提示。

3. 與 dsh-host-sl 協同

若 profile 中同時啓用 dsh-host-sl,重啓前會自動嘗試 saveAll;重啓後若存在未處理的 SL 交接條目,續跑由 SL 插件主導,避免同一輪出現兩條衝突的 user 消息。僅裝 restart、不裝 SL 時,仍走固定 dsh已重啓,繼續 注入。

4. 本地開發與驗證

維護者在 README §7 中給出的流程包括:在 profile 的 plugins\dsh-host-restart 下改源碼、跑測試、覈對硬鏈接/哈希、再發起一次重啓。測試套件在倉庫內爲:

node --test "test/*.test.mjs"

(README 記錄 v0.7.0 時爲 131/131 用例全綠。)

適用場景與注意

適合誰

  • 頻繁改 DSH 宿主插件、cordis.patch.yml 或本包自身代碼,又不想每次手動殺進程、丟會話的開發者。
  • 已在 Windows 上使用 DSH web 或官方 Electron 桌面端,並願意讓模型或 /restart 代勞重啓的用戶。

使用前請確認

  • 插件會 終止當前 DSH 實例(桌面端爲整應用樹),權限與當前用戶一致;安裝前請閱讀 GitHub 倉庫 源碼與 MIT 許可證。
  • 重啓窗口內不要依賴未落盤的子代理或後臺 job 結果。
  • 驅動腳本與日誌默認落在工具目錄(如 dsh-restart.log、pending.json);web 自起路徑會寫 dsh-last-url.txt(帶 token 的 URL,清 cookie 時可取用)。

結尾

dsh-host-restart 把 DSH 開發裏高頻的「重啓換代碼」和「會話續跑」綁成一步:restart_dsh 與 /restart 共用同一流程,可選銜接 dsh-host-sl 的工作表與交接注入,並區分 web 與桌面兩種殺進程/拉起語義。需要安裝說明與版本信息可看 SkillHub 目錄頁;機制細節、配置項與排障以 GitHub README 爲準。

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

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

小夜