前言¶
用 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>。
觸發與放行順序¶
- 解析屬主會話:必要時
resume後再投遞,避免提示丟失。 - 向 agent 投遞巡檢詢問(要求不打擾用戶、不請求確認,只能報活或沉默)。
- 按活躍度循環:任一 agent 自上次巡檢有
session.seq推進則繼續等;全部無推進則進入寬限;若有待用戶回答的提問則單獨計時;總時長不超過maxHoldMinutes(到頂 fail-open 放行)。 - 放行則執行命令,成功後任務自動結束;被報活則重排下一週期。
報活方式¶
- 調用
deadman_hold工具; - 在工作目錄創建
.deadman-hold-<name>(子代理無該工具時可用); - 在插件數據目錄
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,重啓不丟;逾期任務會在下次巡檢立刻處理。
典型用法¶
- 在無人值守場景(夜間編譯、訓練、批量渲染、雲實例跑批)中,由 agent 調用
deadman_arm,指定例如若干分鐘後首次檢查、週期、以及「無人推進時」執行的命令(如關機腳本)。 - 任務仍在推進時,主代理或子代理定期
deadman_hold,或依賴全局 seq 推進自動順延。 - 任務正常結束且不再需要看門狗時,可在佈防會話用
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。