前言¶
用 DeepSeek Harness(DSH)跑長任務時,常見做法是盯着 Web GUI,等對話、後臺 job、子代理都停下來了再關電腦。若開了多個會話,還要自己記「哪一個還沒跑完」。手動關機容易誤關正在寫的會話,或者任務早結束了卻空等。
下面介紹社區插件 dsh-auto-shutdown(維護者 ypx01):在每個會話標題欄右側加一個開關,由 harness 用與會話歸檔相同的空閒判據判斷「是否還有活」;條件滿足後走冷靜期與系統關機倒計時,並預留撤銷路徑。插件僅支持 Windows,以當前 DSH 進程權限執行關機命令;安裝前建議閱讀源碼與 MIT 許可證。
這是什麼¶
dsh-auto-shutdown 是 DSH 的 per-session 自動關機開關:默認關;打開後,當「本會話以及所有同樣打開開關的會話」上的工作都執行完,再進入關機流程。多個會話都開時,必須全部完成纔會關機,任一還在跑就繼續等。
開關狀態不落盤,DSH 重啓後全部復位爲關,避免重啓後誤觸發關機。
- 目錄頁:https://www.skillhub.cn/plugins/ypx01/dsh-auto-shutdown
- 源碼:https://github.com/ypx01/dsh-auto-shutdown
- 版本(package.json):0.1.0
- DSH 兼容:
>=0.2.0-rc.0;Node>=20
開關行爲¶
| 開關 | 行爲 |
|---|---|
| 關(默認) | 任務全部執行完後什麼都不做 |
| 開 | 本會話及所有也開了開關的會話上的活全部執行完 → 倒計時 → 電腦自動關機 |
| 多個會話都開 | 必須全部會話都完成才關機;任何一個還在跑就等 |
新建會話默認是關。
如何判斷「任務執行完了」¶
插件不猜、也不靠數事件,而是直接問 harness,與會話歸檔拒絕「還有活」時使用同一接口:
await ctx.waterfall('workspace/session-activity', { sessionId }, () => [])
// [] => 這個會話沒活幹了
判據彙總四類活動源:turn(正在跑的一輪對話)、job(後臺任務)、subagent(子代理)、schedule(定時/計劃中的執行)。子代理未結束、後臺 job 仍在運行,不會被誤判爲完成。
事件訂閱(session/event / api-session/status)在瀑布不可用時(例如手動重載插件)作爲降級路徑,並在任一會話重新有動作時立刻取消倒計時。
三級可反悔¶
- 冷靜期(默認 120 秒):所有目標會話都空閒後開始倒計時,按鈕顯示如
118 秒後關機,點一下即可取消。倒數期間任一會話重新開始工作,倒計時自動作廢。 - 系統倒計時(默認 20 秒):冷靜期結束後執行
shutdown.exe /s /f /t 20(是否/f由配置force控制)。按鈕變爲紅色正在關機 18 秒,點擊相當於shutdown.exe /a撤銷。 - 真正關機。
判定範圍(可配置)¶
默認 requireGlobalQuiet: true:除開了開關的會話外,其它任何在線會話(含子代理會話)也必須空閒纔會關機,避免「A 會話觸發關機卻把 B 會話正在寫的稿子關掉」。若只關心已開開關的會話,將其設爲 false。
安裝與啓用¶
插件目錄示例:D:\deepseek-workspace\plugins\dsh-auto-shutdown。
用 plug-in manager 安裝本地目錄(軟鏈,改源碼後重載插件即生效):
plugin_manager { action: "install_bundle", target: "D:\\deepseek-workspace\\plugins\\dsh-auto-shutdown" }
裝完後刷新 Web GUI(地址以 dsh web 啓動時打印爲準,形如 http://127.0.0.1:6673),會話標題欄右側應出現「自動關機」按鈕。
非 Windows 環境會顯示「僅支持 Windows」並拒絕開啓。
配置¶
在 cordis.patch.yml 的 config 中設置,也可在 profile 組合裏覆蓋:
| 鍵 | 默認 | 說明 |
|---|---|---|
countdownMs |
120000 |
冷靜期毫秒數(最小 1000) |
shutdownGraceSeconds |
20 |
調用 shutdown /t N 的 N,期間可 /a 撤銷 |
requireGlobalQuiet |
true |
是否要求所有在線會話都空閒 |
force |
true |
是否加 /f 強制結束阻止關機的程序 |
dryRun |
false |
只演練不真關機,日誌記錄將要執行的命令 |
ignoreKinds |
[] |
不想讓某類活動阻止關機時填寫,如 ["schedule"] |
debug |
false |
同時輸出到 stdout |
logFile |
.dsh/auto-shutdown.log |
日誌路徑;填 null 關閉落盤 |
日誌默認路徑:%USERPROFILE%\.dsh\auto-shutdown.log(JSON 行,含 arm/disarm/倒計時/下發命令/撤銷等)。
典型用法與自檢¶
日常使用:在需要「跑完就關電腦」的會話標題欄打開「自動關機」;冷靜期內可隨時點按鈕取消;系統關機倒計時階段點紅色按鈕可撤銷。
離線測試(不發真關機):
node D:\deepseek-workspace\plugins\dsh-auto-shutdown\test\state-machine.test.mjs
node D:\deepseek-workspace\plugins\dsh-auto-shutdown\test\client-smoke.test.mjs
運行時探測(<port> 爲 dsh web 打印的端口):
GET http://127.0.0.1:<port>/api/auto-shutdown/probe— 只算判定,不改狀態。關注blocking/otherBusy(誰在忙、哪一類活動);空表示可隨時關機。stats.clientAlive表示最近 15 秒內瀏覽器是否在輪詢/state。POST http://127.0.0.1:<port>/api/auto-shutdown/self-testbody{"realShutdown":false}— 驗證 spawn 鏈路(跑cmd /c exit 7,返回 exitCode 7 即正常)。
常用 HTTP 接口(供本機 UI,無鑑權,勿暴露到公網):
| 方法 | 路徑 | 用途 |
|---|---|---|
| GET | /api/auto-shutdown/state?sessionId= |
全量狀態 |
| GET | /api/auto-shutdown/probe |
只算判定 |
| POST | /api/auto-shutdown/set |
{sessionId, armed} |
| POST | /api/auto-shutdown/cancel |
撤銷倒計時 / shutdown /a |
| POST | /api/auto-shutdown/self-test |
{realShutdown} 驗證下發鏈路 |
適用場景與注意¶
適合:夜間或外出前在 Windows 上掛 DSH 批任務,希望「所有已開開關的會話都 idle 後再關機」,且需要冷靜期與 /a 兩級撤銷。
務必注意:
- 插件以當前 DSH 進程權限運行;
spawn-process會執行系統關機命令,安裝前應檢查源碼與許可證。 - DSH 進程必須保持運行;退出 DSH 即放棄本次自動關機。
requireGlobalQuiet: false時,其它會話若仍在跑長任務,到點仍會關機;true時若某會話長期「一直有活」,會一直不關機,可用probe查看阻塞原因。- 開關不持久化是刻意設計;重啓後自動關機風險更高,目前未接
ctx.storageDomain。
DSH 生態是「一切皆插件」;SkillHub 等社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-auto-shutdown 把「會話是否還有活」交給 harness 的 session-activity 瀑布,與歸檔邏輯一致,並在多會話、全局安靜、子代理與 job 等邊界上做了可配置與可撤銷的關機鏈路。需要細節與 issue 時見 GitHub README,安裝與分類信息見 SkillHub 目錄頁。
- https://www.skillhub.cn/plugins/ypx01/dsh-auto-shutdown
- https://github.com/ypx01/dsh-auto-shutdown