dsh-restart-wake:讓 Agent 安全重啓 Harness 並在重啓後自動回到原會話

前言

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

桌面端每次啓動會下發新的 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-* 堆積。

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

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

小夜