前言¶
DeepSeek Harness(DSH)桌面版是常駐進程:改插件、改配置、內存上漲或偶發卡頓時,往往需要關掉再打開。對正在跑任務的 Agent 來說,這有個結構性矛盾——執行重啓的就是 Agent 自己,進程一關,當前會話隨之結束,沒法在「關自己」的同時把宿主再拉起來。
手動重啓 DSH 當然可行,但只適合你在電腦前、且不要求重啓後自動接着幹。若希望 Agent 在無人值守時排上重啓、重啓完成後回到原會話繼續,就需要把「重啓宿主」做成可被工具調用的動作。下面介紹社區插件 dsh-self-restart(維護者 NOOBnoob163,分類:工作流),它面向 Windows 桌面版,用脫離進程的助手關應用、再拉起,並在成功後向原會話投遞喚醒消息。
這是什麼¶
一句話定位:把「重啓 DSH 宿主」做成多個會話可併發複用的動作——一次關、一次拉,排隊中的會話各自拿回自己的 reason,各自決定是否續接。
| 項 | 說明 |
|---|---|
| 倉庫 | NOOBnoob163/dsh-self-restart |
| 目錄頁 | SkillHub 插件頁 |
| 平臺 | 僅 Windows 桌面版(WMI、taskkill / 窗口消息等實現) |
| 許可證 | MIT(見倉庫 package.json) |
| 當前版本 | 1.6.0(以倉庫 package.json 爲準) |
插件以 DSH bundle 形式發佈(package.json 含 dsh.bundle.patch 與 cordis.patch.yml)。「重啓後醒來」依賴 DSH 自帶的 sessionController 正式服務,無需額外實驗 bundle。
核心能力¶
兩個 Agent 工具¶
| 工具 | 作用 |
|---|---|
restart_self |
排一次延時重啓:等會話真正空閒後,由脫離進程的助手關閉 DSH、重新拉起並驗證端口;成功後按名單向各會話投遞喚醒消息 |
restart_status |
查看待執行重啓、忙閒、上次結果、本機重啓耗時估計;可從隊列「下車」或取消整趟重啓 |
典型流程如下:
- Agent 調用
restart_self(可帶reason等參數,見倉庫 README)。 - 其他會話可在等待期間加入同一趟重啓(同一計劃最多 8 人,
queueMaxMembers默認 8)。 - 助手在所有人都不忙後執行一次關、一次拉,並驗證端口。
- 插件逐條向各會話投遞喚醒消息,各會話攜帶各自的理由獨立繼續,互不阻塞。
併發複用,而不是各重啓各的¶
多個會話可以同時把任務掛到同一次重啓上:整臺機器只中斷一次,喚醒時每人各拿各的 reason;同一趟裏 A 可 resume: true、B 可 resume: false,逐人判斷。喚醒投遞是逐條進行的,投遞完成後各會話並行執行,不是「A 跑完再輪到 B」。
兩種退出方式不要混用:
| 調用 | 影響 |
|---|---|
restart_status(leave: true) |
隻影響當前會話:從叫醒名單移除;若你是最後一人,整趟不發車 |
restart_status(cancel: true) |
作廢整趟計劃上所有人的待執行重啓 |
僅自己不想被叫醒時用 leave;不要用 cancel 誤傷其他會話。
空閒判定與等待策略¶
重啓前分兩段:先等本會話連續靜默 idleSeconds(默認 12 秒);再視配置判斷其他會話是否在 othersWindowSeconds(默認 120 秒)內仍有活動。本地窗口、IM 私聊(默認 waitForImDirect: true)會視爲「有人在用」;IM 羣聊默認不算。默認下若私聊會話很多,可能長期等不到空檔,這是 README 明確提到的調參點。
默認 maxWaitMinutes: 0 表示一直等(另有 12 小時硬上限);超過 notifyAfterMinutes(默認 20 分鐘)仍未發車可觸發外部通知鉤子(需自行配置 noticeCommand)。另有保險絲進程,降低「關掉了卻沒人拉起來」的風險。
什麼時候不需要它¶
- 只想手動重啓一次 → 直接重啓 DSH 即可。
- 不跑長任務、不在意會話被打斷 → 不必裝。
- 非 Windows 桌面版 → 當前實現不可用。
安裝與啓用¶
插件在當前 DSH 進程權限下運行;安裝前請自行審閱倉庫源碼與 MIT 許可證。社區目錄 SkillHub 與 DeepSeek / 幻方無官方從屬關係,安裝來源以你信任的倉庫爲準。
方式一:插件管理(推薦)¶
讓 Agent 使用 DSH 自帶的 plugin_manager 工具(路徑爲 bundle 目錄的絕對路徑):
plugin_manager(action="install_bundle", target="<本目錄的絕對路徑>")
install_bundle 會完成裝包與選中 bundle。README 明確禁止用 shell 手工拷貝目錄、手改 profile 的 package.json / cordis.patch.yml 或在 profile 裏跑 pnpm 來模擬安裝。
方式二:本地開發 workspace 鏈接¶
在 profile 的 package.json 中登記依賴並選中 bundle:
{
"dependencies": { "dsh-self-restart": "workspace:*" },
"dsh": { "profile": { "bundles": [ "dsh-self-restart" ] } }
}
在 profile 目錄安裝依賴後重啓 DSH;倉庫提供 deploy.ps1 用於源碼與實際加載位置的同步(Windows 開發場景)。
依賴方面:使用 Node 內置模塊;@deepseek-ai/schemastery 由 DSH 宿主提供(peerDependencies)。engines.node 要求 >=22。
配置要點¶
默認值定義在 lib/index.js 的 Config schema;覆蓋時在自己的 profile 的 cordis.patch.yml 裏寫同名 id 的 config:
- id: self-restart
config:
idleSeconds: 12
notifyAfterMinutes: 20
常用項包括:enabled、idleSeconds、othersWindowSeconds、maxWaitMinutes、queueMaxMembers、wakeMessage、waitForImDirect、waitForAllSessions 等;完整表格見 GitHub README「配置」一節。
外部通知不內置渠道,僅在你配置的 noticeCommand 下通過環境變量(如 DSH_SR_EVENT、DSH_SR_TEXT)傳遞事件;通知失敗不影響重啓本身。
典型用法(Agent 側)¶
排重啓並說明理由(參數名與可選字段以 README 爲準):
restart_self(reason="改完插件要驗證")
查看狀態、名單與是否仍在隊列中:
restart_status()
僅從本趟移除自己:
restart_status(leave: true)
取消整趟(會影響所有排隊會話,調用前先 restart_status() 看清名單):
restart_status(cancel: true)
排隊時會話標題前會出現 ♻️ 前綴;上次重啓失敗的會話會短暫顯示 ⭕(約 2 小時後消失)。UI 上提供「不等了,立刻重啓」(跳過等家務,寫 force.flag)與「打斷 / ✕」(整趟取消,寫 cancel.flag),與 leave / cancel 語義對應關係見 README。
適用場景與注意¶
適合:你不在電腦前,仍希望 Agent 在需要時自行排重啓,並在重啓後回到原會話繼續,而不是停在某個報錯狀態。
務必記住:
- 僅 Windows 桌面版;換平臺需另一套實現。
- 同一趟重啓會等所有成員空閒,人越多越難湊空檔;誤用
cancel會打掉別人的計劃。 - 插件執行
noticeCommand時使用 shell,只配置你信任的命令;payload 僅作環境變量,不會被當作命令執行。 - 喚醒消息投遞爲「至多一次」設計,避免同一重啓觸發兩次續接導致重複勞動。
結尾¶
dsh-self-restart 把「重啓宿主」從手工操作變成工作流裏的可編排動作,並在 Windows 上兼顧多會話合併重啓與醒後續接。細節、邊界 case 與狀態文件位置見倉庫 README。
- 目錄頁:https://www.skillhub.cn/plugins/NOOBnoob163/dsh-self-restart
- GitHub:https://github.com/NOOBnoob163/dsh-self-restart