dsh-auto-shutdown:會話級「任務完成後自動關機」開關

前言

用 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)在瀑布不可用時(例如手動重載插件)作爲降級路徑,並在任一會話重新有動作時立刻取消倒計時。

三級可反悔

  1. 冷靜期(默認 120 秒):所有目標會話都空閒後開始倒計時,按鈕顯示如 118 秒後關機,點一下即可取消。倒數期間任一會話重新開始工作,倒計時自動作廢。
  2. 系統倒計時(默認 20 秒):冷靜期結束後執行 shutdown.exe /s /f /t 20(是否 /f 由配置 force 控制)。按鈕變爲紅色 正在關機 18 秒,點擊相當於 shutdown.exe /a 撤銷。
  3. 真正關機。

判定範圍(可配置)

默認 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-test body {"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
羽毛球分组比赛记分
小程序二维码

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

小夜