dsh-restart-handoff:改完需重啓時自動重啓並把對話接回原會話

前言

在 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。

重啓前後行爲

  1. 交接話:重啓前把「接下來怎麼做」存盤;重啓約 2.5 秒後,插件通過 resolveAgent(sessionId) 與 prompt({ mode: "queue", content: [交接話] }) 投回原會話。正文由模型撰寫,插件只搬運;缺省、超時(2 分鐘)或拿不到會話 id 時,兜底爲一句:🔄 DSH 已重啓完成,繼續未完成的工作。
  2. 不打斷當前輪:默認等本輪迴答結束、結果落盤後再重啓;可配合「等所有任務都做完再重啓」等待其它會話 idle。
  3. 防連環重啓:冷卻時間、嘗試次數上限、pending.json 10 分鐘有效期等,避免無限重啓循環。

權限與併發

只有主會話可發起工具重啓或接受自動重啓;子代理、子會話、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。

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

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

小夜