dsh-deadman:DeepSeek Harness 的死手開關

前言

DeepSeek Harness (DSH) 的理念是「一切皆插件」。在智能體開發中,我們經常需要運行無人值守的長任務,例如夜間編譯、模型訓練或批量渲染。

Dsh 內置的 dsh-schedule 機制雖然可以投遞消息,但它是被動的:它會投遞一條消息讓模型決定幹什麼,但如果模型進程掛掉或額度耗盡,內置機制往往無法及時止損。

我們需要一種主動的機制:定期巡檢”還有人活着幹活嗎”,如果沒人報活,就直接執行 shell 命令來收掉資源。這就是 dsh-deadman 插件要解決的問題。

插件介紹

dsh-deadman 是 DeepSeek Harness (DSH) 的死手開關(deadman switch)插件,由用戶 0gl20shk0sbt36 維護。

它的核心邏輯是:佈防後定期巡檢,如果沒有人”報活”,就執行你預先指定的命令。這適合那些”活兒幹完/掛掉了,自動關機”的場景。

安裝與啓用

該插件要求 DSH 版本 0.2.0-rc.2(依賴精確鎖定)。在 Web / 桌面端,安裝後需在插件頁啓用 dsh-deadman。

在 CLI 中安裝(以 profile web 爲例):

dsh plugin --profile web add github:0gl20shk0sbt36/dsh-deadman

卸載命令:

dsh plugin --profile <name> remove dsh-deadman

注意:
1. 必須裝在長期運行的 profile(如 web)裏纔有意義。調度器活在 dsh 進程內,如果是 headless 的一次性進程,進程退出後沒人巡檢。
2. 安裝前請檢查源碼與許可證。
3. 插件以當前 dsh 進程的權限運行,執行的命令完全由佈防方指定。

核心功能

插件提供了三種工具命令和斜槓命令。

工具命令

  1. deadman_arm
    - 作用:佈防。設置任務名稱、執行命令、首次巡檢時間、週期時間等。
    - 機制:首次在 after_minutes 後巡檢;被報活則按 interval_minutes 重排;執行成功一次即自動收工。

  2. deadman_hold
    - 作用:報活。告訴插件”我還在幹活”,跳過本輪執行。
    - 特性:任何會話都能報活(Fail-safe 語義)。

  3. deadman_disarm
    - 作用:撤防。僅佈防會話或其直接子代理可用;其他會話需顯式 force=true,且會被記入日誌。

斜槓命令

  • /deadman:在當前會話佈防。
  • /deadman all:在全部會話佈防。
  • /deadman cancel <name>:取消指定任務。

工作原理

插件通過”活躍度”而非”狀態”來判定是否執行命令。

  1. 解析屬主會話:先獲取會話。如果會話沒打開,會嘗試恢復,避免消息掉進黑洞。
  2. 投遞巡檢詢問:向 agent 發送消息,要求對方二選一:報活或保持沉默。
  3. 巡檢循環與判定:
    - 任一 agent 自上次巡檢有新事件(session.seq 推進)⇒ 還在推進,繼續等。
    - 全部無推進 ⇒ 開始計寬限 holdWindowSeconds。
    - 有”待用戶回答的提問”(userQuestions 投影裏 state === 'open')⇒ 單獨計時,最長 questionBlockSeconds 後放行。
    - 從觸發時刻起的總上限 maxHoldMinutes,到頂一律放行(Fail-open)。
  4. 執行命令:放行後執行命令。成功後任務自動收工並通知屬主。

報活通道

  1. 使用 deadman_hold 工具。
  2. 在當前工作目錄建標記文件 .deadman-hold-<name>。
  3. 在插件數據目錄 hold/ 下建以任務名命名的文件。

配置項

配置寫在 profile 的 cordis.patch.yml 裏:

- 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/)

適用場景與注意

適用場景

  • 夜間編譯、訓練、批量渲染等長任務。
  • 需要防止模型掛掉或額度耗盡後資源未被釋放的場景。

注意事項

  1. 長期運行依賴:調度器活在 dsh 進程內。在 headless 一次性進程里布防,進程退出後沒人巡檢(除非之後有長駐實例啓動時把它載入)。
  2. 單寫者假設:tasks.json 是普通 JSON 文件,多進程同時寫會互相覆蓋。不要在多進程裏同時佈防。
  3. 權限控制:報活無權限限制(誰都能喊停),但撤防有權限限制。
  4. 數據持久化:重啓不丟,但已執行的任務記錄在 tasks.json 中。

結語

dsh-deadman 提供了與 dsh 內置 dsh-schedule 互補的能力:不依賴模型處理,直接執行命令,並具備”報活閘門”機制。它適合作爲無人值守任務的”死手開關”。

插件目錄:https://www.skillhub.cn/plugins/0gl20shk0sbt36/dsh-timer-task
GitHub:https://github.com/0gl20shk0sbt36/dsh-timer-task

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

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

小夜