dsh-deadman:無人值守時的死手開關

前言

用 DeepSeek Harness(dsh)跑長任務時,常見矛盾是:到點關機會誤殺仍在推進的工作,一直開着又會在任務掛掉或沒人再看時白白佔資源。dsh 內置的 dsh-schedule 適合把提醒投回會話、由模型決定下一步,但在模型已不可用或額度耗盡時,它幫不上「直接收資源」這一環。下面介紹社區插件 dsh-deadman:佈防後定期問「還有人在推進嗎」,無人報活則執行你指定的 shell 命令,不經模型決策。

這是什麼

dsh-deadman 是 dsh 的 deadman switch(死手開關) 插件,維護者爲 0gl20shk0sbt36,在 SkillHub 目錄中歸類爲工作流。一句話:佈防後按週期巡檢是否仍有 agent 在推進;若沒有(且滿足放行條件),就執行佈防時寫死的命令——例如關機、停實例、發本地腳本。

與內置自動化對比如下(摘自官方 README):

dsh 內置 dsh-schedule dsh-deadman
到點做什麼 消息投回收件箱,由模型決定 直接執行 shell 命令
阻止機制 無 報活閘門:有人推進則順延
典型場景 日程提醒、叫醒會話 無人值守止損:活兒幹完或掛掉後自動收資源

兩者互補;死手開關針對的是「資源該收回、模型未必還能處理消息」的時刻。

核心功能

模型工具

工具 作用
deadman_arm 佈防:參數含 name、command、after_minutes、interval_minutes、description。首次巡檢在 after_minutes 後;被報活則按 interval_minutes 重排;執行成功一次即收工
deadman_hold 報活:「我還在幹活」,跳過本輪。任何會話都能報活(fail-safe)
deadman_disarm 撤防。僅佈防會話或其直接子代理默認可用;其他會話需 force=true,並記入日誌

任務名在進程內全局唯一;同名佈防會被拒絕並提示佔用會話。

斜槓命令:/deadman(本會話)、/deadman all(全部會話)、/deadman cancel <name>。

觸發與放行順序

  1. 解析屬主會話:必要時 resume 後再投遞,避免提示丟失。
  2. 向 agent 投遞巡檢詢問(要求不打擾用戶、不請求確認,只能報活或沉默)。
  3. 按活躍度循環:任一 agent 自上次巡檢有 session.seq 推進則繼續等;全部無推進則進入寬限;若有待用戶回答的提問則單獨計時;總時長不超過 maxHoldMinutes(到頂 fail-open 放行)。
  4. 放行則執行命令,成功後任務自動結束;被報活則重排下一週期。

報活方式

  1. 調用 deadman_hold 工具;
  2. 在工作目錄創建 .deadman-hold-<name>(子代理無該工具時可用);
  3. 在插件數據目錄 hold/ 下以任務名建文件(外部腳本或人工)。

多會話與併發

  • 每個任務綁定屬主會話,巡檢詢問主要投給屬主;默認 progressScope: global,整機仍有推進則所有看門狗順延;若只看屬主一夥,設 progressScope: owner。
  • 多個看門狗同時到期可併發執行各自命令;需串行時配置 serializeCommands。

安裝與啓用

要求 dsh 0.2.0-rc.2(peerDependencies 精確對齊;版本不匹配時 dsh 會拒絕安裝)。

# 本地路徑
dsh plugin --profile web add /path/to/dsh-deadman

# 或從 GitHub
dsh plugin --profile web add github:OWNER/dsh-deadman

將 OWNER 換爲倉庫所有者(如 0gl20shk0sbt36)。Web / 桌面端在插件頁啓用 dsh-deadman;CLI 卸載:dsh plugin --profile <name> remove dsh-deadman。

建議裝在長期運行的 profile(如 web):調度器活在 dsh 進程內,一次性 headless 進程退出後無人巡檢。從 GitHub 安裝時 pnpm 會按依賴自動解析;本地路徑安裝需在插件目錄先執行 pnpm install 生成 node_modules。

配置

在 profile 的 cordis.patch.yml 中覆蓋 bundle 默認值,例如:

- id: deadman
  config:
    holdWindowSeconds: 60
鍵 默認 說明
holdWindowSeconds 60 全部 agent 無推進後再等多久執行
checkIntervalSeconds 20 巡檢週期
maxHoldMinutes 30 從觸發起的總上限,到頂一律放行
questionBlockSeconds 600 待用戶提問卡住時的最長等待
onUndeliverable execute 屬主會話投遞不到時:execute / skip
progressScope global global 整機 / owner 僅屬主及直接子代理
serializeCommands false 多條動作命令是否串行
commandTimeoutSeconds 300 單條命令超時
dataDir $DSH_HOME/plugins/dsh-deadman 任務表 tasks.json 與 hold/

任務持久化在 tasks.json,重啓不丟;逾期任務會在下次巡檢立刻處理。

典型用法

  1. 在無人值守場景(夜間編譯、訓練、批量渲染、雲實例跑批)中,由 agent 調用 deadman_arm,指定例如若干分鐘後首次檢查、週期、以及「無人推進時」執行的命令(如關機腳本)。
  2. 任務仍在推進時,主代理或子代理定期 deadman_hold,或依賴全局 seq 推進自動順延。
  3. 任務正常結束且不再需要看門狗時,可在佈防會話用 deadman_disarm 或 /deadman cancel <name>;若命令已成功執行一次,任務也會自動收工。

README 未給出固定示例命令,實際 command 應爲你本機已審計、可信任的 shell 片段。

適用場景與注意

適合:需要「沒人再推進就自動執行止損動作」的長駐 dsh 實例;與 dsh-schedule 分工明確——前者提醒模型,後者直接動 shell。

務必知曉:

  • 動作命令完全由佈防方指定,插件以當前 dsh 進程權限運行;安裝前請閱讀源碼與 MIT 許可,只調度你信任的命令。
  • 默認 fail-open:無人報活即執行,這是死手語義;關鍵動作應設合理週期與寬限。
  • 單寫者:tasks.json 不宜多進程同時佈防;插件按單實例長期 profile 設計。
  • progressScope: owner 不含更深層孫代理;提問阻塞依賴宿主 userQuestions 投影,無投影時該閘門不生效。
  • 插件不聯網、不收集數據;數據僅寫本機 dataDir。

DSH 生態強調「一切皆插件」;SkillHub 目錄 爲社區站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-deadman 把「還有人在幹活嗎」變成可配置的週期巡檢與報活閘門,在無人值守長任務裏用 shell 命令收資源,而不依賴模型在線。目錄頁:https://www.skillhub.cn/plugins/0gl20shk0sbt36/dsh-deadman;源碼與完整說明:https://github.com/0gl20shk0sbt36/dsh-deadman。

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

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

小夜