前言¶
在 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 安裝路徑 下的實例,避免誤傷其它安裝。
硬邊界(調用會被拒絕或需知悉)¶
- 僅主會話:
session.header.origin === 'subagent'或拿不到會話 id 時拒絕,不寫標記、不重啓。 - 只殺本實例:驅動腳本身份解析失敗(退出碼 4)時一個進程都不殺。
- 在飛子代理與後臺作業會被硬殺,結果丟失;job-only 會話不會自動恢復。
- 模型工具描述要求:僅當用戶明確要求重啓時使用。
安裝與啓用¶
README 未給出單獨的 dsh plugin add … 一行命令;安裝可走社區目錄頁(當前展示 v0.8.0、來源 GitHub):
- 目錄頁:https://www.skillhub.cn/plugins/liuyun847/dsh-host-restart
- 源碼與說明:https://github.com/liuyun847/dsh-host-restart
安裝完成後,在 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 爲準。