前言¶
在 DSH 桌面版裏開發或調試插件時,宿主經常在改動生效前返回 application: "restart-required"。常見做法是手動退出 App、再打開,然後憑記憶把「剛纔改到哪、下一步做什麼」重新說一遍。普通重啓只恢復進程,不會保留上下文裏的「爲什麼重啓」和「重啓後第一步」。
下面介紹社區插件 dsh-restart-handoff(維護者 Saolence,分類:客戶端)。它在需要重啓時替你完成退出與重開,並把模型寫好的交接話作爲同一會話的下一條消息投遞回來。
這是什麼¶
dsh-restart-handoff 面向 DSH 桌面版(Electron) 與 macOS:重啓 helper 使用 osascript 退出 App、open -n 重開。純 web / CLI 宿主調用相關能力時會得到 status: "unsupported"。
插件在 GitHub 開源(Saolence/dsh-restart-handoff),許可證 MIT;社區目錄頁見 skillhub.cn。DeepSeek Harness 生態強調「一切皆插件」;SkillHub 等目錄爲獨立社區站點,與 DeepSeek / 幻方無官方從屬關係。
核心功能¶
三種觸發方式¶
| 觸發源 | 誰發起 | 什麼時候 |
|---|---|---|
| 自動 | 宿主監聽 plugin_manager 工具結果 |
結果裏出現 restart-required |
| 工具 | 主會話調用 restart_handoff |
主動寫入交接話並排程重啓 |
| 手動 | 設置 →「重啓交接」→ 現在重啓 | 立即重啓(不續跑,不寫 pending) |
自動路徑與工具路徑同時排隊時,後到的請求會讓位(日誌 hand-off request dropped);已有排程時返回 already-scheduled / already-deferred。
重啓前後行爲¶
- 交接話:重啓前把「接下來怎麼做」存盤;重啓約 2.5 秒後,插件通過
resolveAgent(sessionId)與prompt({ mode: "queue", content: [交接話] })投回原會話。正文由模型撰寫,插件只搬運;缺省、超時(2 分鐘)或拿不到會話 id 時,兜底爲一句:🔄 DSH 已重啓完成,繼續未完成的工作。 - 不打斷當前輪:默認等本輪迴答結束、結果落盤後再重啓;可配合「等所有任務都做完再重啓」等待其它會話 idle。
- 防連環重啓:冷卻時間、嘗試次數上限、
pending.json10 分鐘有效期等,避免無限重啓循環。
權限與併發¶
只有主會話可發起工具重啓或接受自動重啓;子代理、子會話、teammate 調用 restart_handoff 返回 status: "not-root"。重啓會打斷所有正在跑的任務,因此插件用 api-session/status 與 agent/status 維護「正在跑的會話」名單;名單非空時不進入倒計時,面板可顯示等待 N 個會話結束。
客戶端設置¶
設置 →「重啓交接」:常用開關包括「需要重開時自動幫我重啓」「等所有任務都做完再重啓」「重啓後自動接着做」(均默認開)。側欄賬號行上方有僅圖標的 ↻ 按鈕,手動重啓需確認與 3 秒倒計時,且不續跑。
配置與狀態文件位於 ~/.dsh/restart-handoff/(如 settings.json、pending.json、gate.json、history.jsonl);完整文本日誌爲 ~/.dsh/restart-handoff.log。
安裝與啓用¶
前提:DSH 桌面版。安裝前建議自行查閱倉庫源碼與 MIT 許可證;插件以當前 DSH 進程權限運行。
從 Release 的 tarball 安裝(README 示例版本 0.1.0):
plugin_manager: { action: "install_bundle", target: "/絕對路徑/saolence-dsh-restart-handoff-0.1.0.tgz" }
從 npm 安裝(發佈後):
plugin_manager: { action: "install_bundle", target: "@saolence/dsh-restart-handoff" }
從本地倉庫目錄安裝:
plugin_manager: { action: "install_bundle", target: "/絕對路徑/dsh-restart-handoff" }
package.json 聲明瞭 dsh.bundle.patch,bundle 自帶的 cordis.patch.yml 會自動插入 restart-handoff。停用或啓用:
plugin_manager: { action: "set_plugin", target: "include:restart-handoff", enabled: false }
注意:改包本體不會熱重載;若 profile 爲符號鏈接,改完 index.js / client.js 需 toggle 一次或重啓宿主才生效。
典型用法¶
工具 restart_handoff¶
主會話在已知改動需重啓時,可主動調用(next_step 已移除,請用 continuation):
{
"reason": "換了側邊欄插件",
"continuation": "## 爲什麼重啓\n…\n## 剛纔做到哪\n…\n## 下一步\n…",
"delay_ms": 1500
}
工具立即返回、不阻塞本輪。常見返回:deferred(掛起,回合結束再重啓)、scheduled、already-deferred / already-scheduled、not-root、cooldown / disabled / unsupported。排隊成功時返回含 mustStopNow: true 與 waitFor: "turn-end",模型應只回復「已排定重啓」並停手,避免同一回合繼續調工具(否則記 late-tool 警告)。完成證據是重啓後到達的那段交接話,不會從工具同步返回「重啓完成」。
自動路徑¶
當主會話的 plugin_manager 結果含 restart-required 時,宿主會用 steer 請模型寫交接話並調用 restart_handoff;2 分鐘無迴音則按提示照常重啓。
適用場景與注意¶
適合:在 macOS 上使用 DSH 桌面版、頻繁改插件或宿主模塊、希望重啓後同一會話自動收到「下一步」說明的開發者。
邊界(來自 README):
restart_handoff工具只出現在新創建的會話;裝插件前已打開的會話拿不到該工具,需新開會話或使用面板 / 自動觸發。- 僅 macOS、僅桌面宿主;重啓後 GUI 端口可能變化,以 App 打印地址爲準。
- 重啓無法續跑 shell 等進程內狀態,交接話描述的是「從哪繼續」,不是恢復當時內存裏的句柄。
- 手動「現在重啓」不寫
pending.json,不會自動投遞交接話。 - 安裝與使用前請閱讀 GitHub 倉庫 與 Release,勿在未審源碼的情況下盲目安裝第三方插件。
結尾¶
dsh-restart-handoff 把「檢測到 restart-required → 安全退出 → 重開 → 同會話續寫上下文」串成一條可配置的路徑,減少手工重啓與重複解釋。目錄頁:https://www.skillhub.cn/plugins/Saolence/dsh-restart-handoff;源碼與文檔:https://github.com/Saolence/dsh-restart-handoff。