dsh-task-heartbeat:用進度心跳檢測長任務是否卡住

前言

在 DeepSeek Harness(DSH)裏跑智能體或自動化工作流時,進程往往一直活着,但任務可能已經停在某一步:等 API、等用戶、或邏輯死循環。只看進程是否存活,無法區分「還在跑」和「已經卡住」。社區插件 dsh-task-heartbeat 把關注點放在任務進度:註冊長任務、在有意義的一步完成後打點(beat),當最後一次 beat 超過閾值時,把它列入 stalled 列表,而不是做簡單的存活探測。

這是什麼

dsh-task-heartbeat 是 DSH 生態中的工作流類插件,由 jerentpan-lab 維護(npm 作者名 jetpan)。倉庫與 npm 包同名,許可證 MIT,當前 package 版本 0.2.0。簡介原文:Task heartbeat for DeepSeek Harness: progress beats and stall detection, not mere liveness.

插件通過 Cordis patch(cordis.patch.yml)向 DSH 暴露一組工具,狀態持久化到本地 JSON 文件,適合配合定時任務做巡檢。

核心功能

README 中的設計動機寫得很直接:智能體可以 alive 但仍 stuck;若任務 15 分鐘沒有產生 beat,即使進程仍在運行,也應視爲 stalled。

插件提供的工具(名稱與參數以 README 爲準):

  • task_register:{ taskId, owner, expect?, ttlS? } — 註冊進行中的長任務;未傳 ttlS 時使用配置裏的默認閾值。
  • task_beat:{ taskId, note? } — 每完成一個有意義的步驟後打點,可選附 note。
  • task_check — 列出已超過 TTL 仍未 beat 的 stalled 任務。
  • task_list — 列出當前登記的任務。
  • task_done:{ taskId } — 標記任務結束。

taskId 僅允許 [A-Za-z0-9_-]{1,64};註冊時必須提供 owner。若同一 taskId 已在運行,需 force:true 才能重啓登記。

配置(0.2.0)

默認配置示例:

{ "stateFile": "~/.dsh/task-heartbeat.json", "defaultTtlS": 900 }
  • stateFile:心跳狀態文件路徑,默認 ~/.dsh/task-heartbeat.json;環境變量 DSH_TASK_HEARTBEAT_FILE 可覆蓋。
  • defaultTtlS:task_register 未指定 ttlS 時的默認 stall 閾值(秒),示例爲 900(15 分鐘)。

未知配置鍵或非法值會拋出可讀的 ConfigError;可參考倉庫中的 config.example.json。README 建議本地開發時運行 npm run verify 做測試與打包檢查。

性能方面,README 的 Bench 說明:每次 beat 是一次帶 fsync 的持久化寫入(作者在示例主機上約 97ms/beat),因此 beat 頻率應貼合任務自然步進,不宜無意義高頻調用。

安裝與啓用

從 npm 安裝(README 給出的命令):

dsh plugin --profile web add dsh-task-heartbeat

若要從 GitHub 源安裝,README 另給出:

dsh plugin --profile web add github:jerentpan-lab/dsh-task-heartbeat

安裝後,可在宿主機上每 5 分鐘跑一次檢查(README 以 Python heredoc 示意,實際需通過你的 DSH session / CLI 調用 task_check):

python3 - <<'PY'
# call task_check via your DSH session / CLI
PY

本地可運行演示:

node examples/demo.mjs

典型用法流程

下面介紹一種與 README 一致的用法順序,便於在長任務 Agent 流程裏落地。

  1. 任務開始時調用 task_register,傳入 taskId、owner,按需設置 expect(預期說明)和 ttlS(秒)。
  2. 每完成一個可對外說明的里程碑,調用 task_beat,必要時用 note 記錄當前階段。
  3. 由 cron 或調度器週期性調用 task_check,處理返回的 stalled 列表(告警、重試或人工介入)。
  4. 任務正常結束時調用 task_done。

狀態文件若損壞,插件會 quarantine(*.corrupt-*)並告警,工具仍可繼續工作;若系統時鐘回撥,會通過 monotonic clamp 避免年齡爲負。

常見問題(節選)

README 故障表中的典型項:

現象 原因 處理
ConfigError ... unknown key 配置鍵拼寫或不支持 對照 config.example.json
ConfigError ... defaultTtlS 非有限正數 使用秒數,如 900
taskId must match ... ID 含非法字符 僅用 [A-Za-z0-9_-]{1,64}
register: owner is required 未傳 owner 註冊時帶上 owner
could not acquire lock ... 其他進程持鎖超過 30s 重試;檢查陳舊鎖文件

適用場景與注意

適合:多步驟、耗時的 DSH 工作流;需要區分「進程還在」與「進度還在推進」的 Agent 任務;希望用固定間隔的 task_check 做 stall 巡檢的場景。

注意:

  • 插件在當前 DSH 進程權限下讀寫狀態文件與加鎖,安裝前請閱讀 GitHub 源碼 與 MIT 許可證,確認符合你的安全與合規要求。
  • DSH 採用「一切皆插件」的擴展方式;社區目錄 SkillHub 插件頁 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係,不要將其等同於官方應用商店。

結尾

dsh-task-heartbeat 把長任務的觀測從「進程是否存活」推進到「進度是否在 beat」:註冊、打點、按 TTL 列出 stalled,配置簡單,工具面清晰。需要細節、演示與 Bench 說明時,以倉庫 README 爲準。

  • 目錄頁:https://www.skillhub.cn/plugins/jerentpan-lab/dsh-task-heartbeat
  • GitHub:https://github.com/jerentpan-lab/dsh-task-heartbeat
羽毛球分组比赛记分
小程序二维码

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

小夜