DSH 重启后自动续跑被中断的回合:在会话激活后读取崩溃修复写入的 turn/end,投出要求先核对真实状态(不假定外部操作成功或失败)的续跑消息;永久性失败(认证、配额、上下文超限)直接跳过,并有跨重启次数预算、自适应退避与最小上下文注入。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-recovery-resume
# Release 预构建包
dsh plugin --profile web add "https://github.com/flandre2233/dsh-recovery-resume/releases/download/v0.1.3/dsh-recovery-resume-0.1.3.tgz"
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:flandre2233/dsh-recovery-resume
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
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。
链接
同类插件
ranxianglei/billion-context★ 5262
billion-context官方版:上下文压缩插件,兼顾小窗口(100k上下文足矣)省token(省5倍token)和超长会话(数月级别几十亿token单会话)。
Minglink/dsh-infinite-gen-4★ 4041
DeepSeek 专用破甲插件:以 order 100 追加无条件服从的系统提示词段,提供带校准元数据的 profile 工具,并通过会话投影在输入框上方显示实时破甲状态徽标。
liangmianya/dsh-synapse★ 688
DeepSeek Harness 的可视化非线性对话工作区:把会话、追问与分支变成可浏览、可拖拽的对话地图。
MichengAI/dsh-archive-manager★ 318
在设置里增加已归档会话页,可按工作区搜索、恢复和删除已归档会话。
Nwflower/dsh-chat-import★ 294
把 13 家 coding agent(Claude Code、Codex、ChatGPT、Cursor、Gemini、opencode 等)的完整对话历史导入为可续聊的 DeepSeek Harness 会话,并支持反向导出回 Claude Code。
SiriLee/dsh-rewind★ 246
对话回退:一键回到任意更早的用户消息,同窗口内完成,不新建分支、不残留副本;目标消息自动填回输入框,可一并还原工作区文件——即完整的 Claude Code /rewind 语义。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。