dsh-recovery-resume

sessiontested: passnpmMIT

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

下载量 / Downloads
1,020
依赖体积 / node_modules
0.05 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-recovery-resume

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

dsh-recovery-resume

DeepSeek Harness(dsh)的一个插件:

DSH 重启之后,自动把被打断的任务接着做完。

中文 | [English](README.EN.md)

它解决什么问题

你让 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](docs/notes.md)。

许可

MIT,见 [LICENSE](LICENSE)。

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::3,最后更新 2026-09-24

Links

GitHub · Homepage · npm

Same category