- ホーム
- プラグイン
- セッションとメッセージ
- dsh-recovery-resume
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.
インストール
dsh plugin --profile web add github:flandre2233/dsh-recovery-resumeREADME
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。