前言¶
在 DeepSeek Harness(DSH)裏改 Host 插件、src/、package.json 或 cordis.patch.yml 之後,必須重啓進程才能加載新代碼。對智能體開發者來說,理想狀態是:模型自己安排重啓、重啓完成後自己繼續驗收和幹活,而不是讓人盯着托盤殺進程再手動打開會話。
在 Harness 進程內部直接起重啓腳本,往往會卡在 killing 不回來——Windows Job Object 會在殺 Harness 時連帶砍掉子進程。殺完立刻拉起新實例,又可能撞上 Electron 單實例鎖,新進程把參數交給正在退出的舊實例後退出。重啓若在進程外完成,Host 剛起來時也沒有天然通道把「接下來要做什麼」塞回原來的 Agent 會話。
下面介紹社區插件 dsh-restart-wake(維護者 zgq0106),它用計劃任務在進程樹外執行重啓、用登記文件 + 啓動喚醒器在就緒後投遞 prompt,並順帶在重啓窗口清理堆積的 dsh-auth-* cookie,緩解反覆重啓後約 70 次啓動即 431 崩潰的問題。插件歸類爲工作流,在 SkillHub 目錄頁 可查到條目;目錄爲社區站點,與 DeepSeek / 幻方無官方從屬關係。
這是什麼¶
dsh-restart-wake 是 DSH 的 Host 插件:六個 Agent 工具、一個啓動喚醒器、一套參數化的 PowerShell 重啓腳本。依賴爲零(不引入 npm 包);README 寫明在 DSH 0.2.1-rc.5 上實測,package.json 當前版本爲 0.1.5,許可證 MIT。
平臺分工如下:重啓與 cookie 清理僅 Windows(schtasks + PowerShell);喚醒登記、狀態查詢跨平臺。非 Windows 上調用 restart_now 會直接報錯,不做破壞性動作。
它怎麼繞過三道障礙¶
| 障礙 | 插件側做法 |
|---|---|
| 進程內腳本被 Job Object 連帶終止 | 用 Windows 計劃任務在 Harness 進程樹外跑 restart-dsh.ps1 |
| 單實例鎖導致新實例剛起就退出 | 先殺瀏覽器主進程再殺子進程,並等待鎖釋放(默認 3 秒) |
| 重啓後會話停在原地 | 重啓前寫 wake-pending-<sessionId>.json,啓動喚醒器在新 Host 就緒後通過 sessionController.prompt 投遞(會 resume 冷會話) |
同一時刻只允許一次重啓:互斥鎖 restart.lock;默認有其他未登記的運行中會話時會拒絕重啓(可傳 force: true 覆蓋)。
核心功能¶
六個 Agent 工具¶
調用方不必手填會話 id,工具從執行上下文 exec.agent.id 讀取。
| 工具 | 作用 |
|---|---|
restart_now |
登記喚醒 → 檢查鎖與阻塞會話 → 掛計劃任務 → 在 delaySeconds(默認 12)秒後重啓 |
wake_register |
只登記喚醒,不重啓;等別的會話觸發重啓時把自己叫醒 |
wake_list |
查看待喚醒登記、最近歸檔、重啓鎖狀態 |
wake_cancel |
取消本會話的喚醒登記 |
restart_status |
自檢:exe 路徑、腳本與計劃任務入口、鎖、運行中會話、日誌末尾 |
cookie_status |
查看 dsh-auth-* 堆積與清理閾值(431 相關) |
插件還在 Host 根作用域通過 ctx.systemPrompt.section() 注入約 300 字的協議說明(何時重啓、restart_now 須爲本輪最後一步、重啓後先 restart_status)。已在預設裏寫過同樣規則時,可在配置裏設 promptEnabled: false 關閉。
重啓後 cookie 清理¶
桌面端每次啓動會下發新的 dsh-auth-<authority哈希> cookie,Chromium 只增不減;條數到約 70 時 Cookie 請求頭可超過 Node 16 KB 上限,Host 返回 431,外殼報「Web authentication failed」。Cookies 庫在運行期被獨佔,可寫窗口只在「瀏覽器已死、新實例未起」的幾秒內——即重啓腳本執行時。達到 cookieThreshold(默認 50)時,cookie-cleanup.mjs 只刪 dsh-auth-* 一族,不動其它 cookie 與憑據。
安裝與啓用¶
在 PowerShell 中執行(命令來自項目 README):
dsh plugin --profile desktop add github:zgq0106/dsh-restart-wake
若 pnpm 不認 github: 前綴:
dsh plugin --profile desktop add "git+https://github.com/zgq0106/dsh-restart-wake.git"
裝完後再重啓一次 Harness——Host 插件模塊按包名緩存,僅啓用/禁用不會重讀模塊。
安裝後可在新會話裏讓 Agent 調用 restart_status。若 exePath 顯示不存在,在 profile 的 cordis.patch.yml 裏爲插件顯式指定 exePath(只寫要改的字段即可,其餘回落默認):
- id: restart-wake
name: dsh-restart-wake
config:
pendingDir: 'D:\dsh-wake'
delaySeconds: 15
默認登記目錄爲 ~/.dsh/restart-wake;pendingDir 路徑過長(影響計劃任務命令行 260 字符上限)時 restart_now 會報錯並建議換短路徑。
典型用法¶
Agent 側可復現的流程(摘自 README):
模型:改完插件配置,需要重啓生效。
1. restart_status → 確認 exeExists / scriptExists 都爲 true,沒有阻塞會話
2. restart_now({ prompt: "重啓完成,讀取日誌確認 RESULT: OK,然後繼續完成 P2.4 連線可視化" })
3. 回覆主人:「已安排重啓,約 12 秒後回來」,本回合結束
4. 重啓後插件自動投遞 prompt,會話繼續
5. restart_status → 驗收:鎖已釋放、登記已消費、日誌末尾 RESULT: OK
restart_now 必須是該輪對話的最後一步:重啓會中斷當前回合,未保存輸入會丟失。
適用場景與注意¶
適合誰:經常在 desktop profile 裏改 Host/插件配置、希望 Agent 自閉環「改配置 → 重啓 → 驗收 → 繼續任務」的開發者;Windows 桌面端長期開發、需要避免 cookie 431 的用戶。
權限與安全:插件以當前 DSH 進程權限運行;安裝前應自行查看 GitHub 源碼 與 MIT 許可證。README 說明:只投遞文本不執行命令;登記 24 小時過期;投遞最多 3 次後歸檔,不無限重試;成功投遞不留登記文件;不上傳數據、無遙測。
限制摘要:若與其它「啓動即投遞」插件共用同一 pendingDir,可能重複投遞,需配置不同目錄。Harness 需能恢復上次窗口(默認行爲),自動喚醒才順暢;否則登記仍在,需主人下次打開會話時補投。多份安裝時需改不同的 taskName(默認 DshRestartWake)。
常見返回:blocked(有別會話未登記)、busy(10 分鐘內已有重啓任務)。故障排查表見項目 README「故障排查」一節。
結尾¶
dsh-restart-wake 把「進程外重啓 + 單實例等待 + 啓動喚醒登記」收成一套互斥保護的工作流,讓 Agent 在 Windows 桌面端可以相對安全地重啓 Host 並回到原會話,同時在重啓窗口處理 dsh-auth-* 堆積。