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
羽毛球分组比赛记分
小程序二维码

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

小夜