Vai al contenuto principale
F

dsh-recovery-resume

flandre2233/dsh-recovery-resume

Resumes turns interrupted by a DSH host restart: hooks agent activation (once a session is live), reads the crash-repair turn/end, and sends a continuation that requires verifying real-world state first rather than assuming a side effect succeeded or failed. Permanent failures (AUTH, QUOTA, context overflow) are skipped, with a cross-restart budget, adaptive backoff and a minimal-context payload.

Installazione

dsh plugin --profile web add github:flandre2233/dsh-recovery-resume

README

dsh-recovery-resume

DeepSeek Harness(dsh)的一个插件: DSH 重启之后,自动把被打断的任务接着做完。

中文 | English

它解决什么问题

你让 agent 干活,干到一半 DSH 重启了(崩溃、升级、手动重启都算)。 重启后会话还在,但那个被打断的任务不会自己继续——要等你再发一条消息,它才会动。

装了这个插件,DSH 重启后它会自动发一条消息,让 agent 接着做。

这条消息不是简单一句"继续"。重启可能正好发生在下载或推送的半路上, 所以消息会要求 agent 先检查实际做到了哪一步,再从对的地方接着做: 不许想当然地认为成功了,也不许想当然地认为失败了。

安装

dsh plugin --profile web add github:flandre2233/dsh-recovery-resume

装完重启一次 DSH,插件才会生效。

不需要装任何依赖,也不需要编译。

什么时候会自动续跑

下面几条全部满足才会动手,否则什么都不做:

  • 上一个任务是被意外打断的(中断、出错、或输出太长被截断),而不是正常结束
  • 打断之后你还没发过新消息,也没有开始新任务
  • 打断发生在 15 分钟以内(太久以前的就不翻旧账了)
  • 这个会话已经重新打开了

如果失败的原因重试也没用,就不续跑,比如 API key 无效、余额用完、对话太长超出上限。 这些情况重试只会白白花钱。哪些错误算"值得重试",用的是 DSH 官方自己的判断标准。

如果会话里有一个进行中的目标(goal),插件还会让它继续推进, 效果和你在界面上点"继续"一样。你手动暂停的目标,插件绝不会动。

防止失控

最怕的情况是:"重启 → 续跑 → 又崩 → 又重启 → 又续跑……",无限循环地花钱。 所以有三道保险:

保险规则
1同一个会话,DSH 每启动一次最多续跑 1 次
2连续续跑 3 次都没有进展,就停下来不再自动续跑,等你处理(记录保存在 $DSH_HOME/recovery-attempts.json,重启也不会清零)
3两次续跑之间要等一段时间:第 1 次之后等 10 分钟,第 2 次之后等 20 分钟

只要续跑之后任务确实往前推进了,这些计数就会清零——保险只针对"反复失败",不影响正常使用。 触发上限时插件只写日志,不做任何别的事。

怎么确认它在工作

先看插件有没有被加载:

dsh --profile web --dump-config | grep -A2 recovery-resume

插件的日志会打印在运行 dsh web 的那个终端窗口里。 如果你是用某个启动器(比如桌面版 app)打开 DSH 的,日志会在启动器保存的地方, 常见的是 ~/.dsh/host.log——这个文件是启动器生成的,手动运行 DSH 时不存在。

grep dsh-recovery-resume ~/.dsh/host.log   # 如果你的启动器会写这个文件

触发续跑时,日志长这样:

dsh-recovery-resume: agent 创建 id=session-… status=idle
dsh-recovery-resume: ★ 发现未处理的中断(reason=interrupted turnSeq=8451 lastTool=bash)
dsh-recovery-resume: 续跑消息已入队 session-…
dsh-recovery-resume: 已重新武装 goal …

大多数时候什么都不会发生,这是正常的。 下面这些日志也都是正常情况,不是出故障了:

日志意思
无需续跑(尾部没有未处理的非人为中断)上次是正常结束的,或者你已经接着聊过了
跳过 …(上次失败是永久性的…)失败原因是 key 无效、余额不足之类,重试没用
跳过 …(本次进程已续跑 1 次)第 1 道保险在起作用
冷却中(…还需 N 秒)第 3 道保险在起作用
一行日志都没有插件没被加载,先用上面的 --dump-config 查一下

测试

npm test    # 85 个用例,不需要装依赖,也不需要 DSH 在运行

也可以单独跑某一个:node tests/logic.test.mjs(Windows 上也能跑)。

已知限制

  • 只在 DSH 0.1.6-alpha.1 + macOS 13(Intel)上实际验证过。插件用到的是 DSH 的内部接口, 升级 DSH 之后请重新跑一遍测试。
  • "15 分钟以内"这个时间是写死的,目前不能改。
  • 插件不判断任务其实是不是已经做完了。如果重启前刚好做完,agent 会多检查一轮, 这是预期行为(消息本来就要求它先检查)。
  • 子代理(subagent)的会话不处理。

设计思路、参考的 DSH 源码位置和实测记录见 docs/notes.md。

许可

MIT,见 LICENSE。

Plugin correlati