前言¶
在 DeepSeek Harness(DSH)里同时开着多个会话、Goal 或后台任务时,常见做法是逐个窗口去停回合,或在进程重启后手动找会话续写。这些做法分散、容易漏项,且崩溃后很难知道「上次到底跑到哪」。dsh-pause-resume 把暂停与恢复收进会话头同一个按钮:按一次写下计划并停掉当前进程里该停的一切,重启后再按一次按 README 描述的步骤把可恢复项接回来。
这是什么¶
dsh-pause-resume 由维护者 regrevia 发布,在 SkillHub 上归类为工作流插件。定位用 README 里的一句话概括:DeepSeek Harness 会话头上的一个按钮——停掉正在跑的内容、把小型计划写到磁盘,重启后同一按钮把该接的工作接回来。
插件以当前 DSH Host 进程权限运行;安装前请自行阅读 GitHub 源码 与 MIT 许可证。当前资料中的版本为 v0.6.11,要求 dsh >= 0.2.0-rc.1(见 package.json 的 engines 字段)。
核心功能¶
会话头按钮与四种状态¶
按钮图标即唯一状态指示,没有计数器、面板、徽章或 toast。README 约定:
- ⏸ — 有工作正在运行,按下可停止。
- ▶ — 已停止,或上次进程留下待恢复项,按下可恢复。
- ↻ — 某回合自行结束(非手动暂停),按下可继续未完成部分。
- ⏸(变暗)— 无需停止、恢复或继续。
需要人查看结果时,tooltip 会用一句话说明,图标含义不变。
暂停与恢复覆盖哪些工作¶
下面表格来自 README 的「What it restores」,概括暂停与恢复行为:
| 工作类型 | 暂停时 | 恢复时 |
|---|---|---|
| 有未完成回合的会话 | 取消回合并记录会话 | 挂载会话,再发一条可见的续写消息 |
| 已 armed 的 Goal | 以当时 revision 暂停 | 调用 goals.resume 用同一 revision;Goal 驱动自行继续 |
| 仅承载该 Goal 的会话 | 记录,不额外停止 | 挂载后由恢复的 Goal 接管 |
| 运行中的后台 job | 终止并记录 | 仅记录:job 是 live 进程不可回放,续写消息会点名并在仍需要时由回合重启 |
| 正常结束的会话 | 不改动 | 不改动,且从不写入计划 |
| 已结束 / 终端会话 | 不改动 | 不改动 |
| 日程(schedule) | 不改动 | 不改动 |
日程不会被暂停:schedule 服务没有 disable,只有 delete;插件不会为暂停而删日程。暂停期间若日程触发仍会开回合,但若磁盘上已有待恢复计划,按钮仍显示 ▶,应先完成恢复。
恢复的三步逻辑¶
恢复并不声称「工作从未中断」,对每个条目 README 描述为三步:
- Mount:经 Harness resume 路径挂载已停会话,保留 agent preset;已挂载则跳过。
- Continue:仅当暂停时确实取消了回合时,通过
sessionController.prompt发送一条普通用户消息续写;request id 由计划与会话派生,重复恢复具备幂等性,消息出现在 transcript 中。 - Re-arm Goal:用暂停时的 revision 重新 armed;若暂停期间 Goal 已被修改,则跳过该项(
skipped)。
子 agent 会话无法由该流程单独挂载,需由父会话处理;对应行会作为 attention 报告一次,不会当作失败反复重试而长期占住计划。
崩溃恢复(非手动暂停)¶
手动按下会写 snapshot;崩溃则依赖心跳文件 running.json 记录当前有 open turn 的会话及写入进程 id。替换心跳前,上一进程记录会转成 pending.json 中的 crash plan,因此多次重启仍可能自动出现 ▶,无需再按暂停。
crash 记录弱于手动暂停:只能证明会话存在,不能证明重启后 turn 仍 open。恢复时会挂载并探测 live turn;仍 running 则 continue,idle 则不 prompt。无法读清状态的行记为 unknown,计划保留、按钮仍为 ▶,下次再试。子 agent、正常结束会话等规则与 README「Crash, not just a press」一节一致。
自行停止的回合(↻)¶
提供商报错重试耗尽、或模型 hit max-tokens 等情况下,回合会在无人按暂停时结束。这类情况重启 alone 无法修复,插件用独立账本 continue.json,按钮显示 ↻ 而非 ▶。候选条件包括:最新 turn 以 error 或 max-tokens 结束且之后无新 turn;根会话、非 subagent;且结束原因不是 completed、aborted、interrupted、blocked。
按下后按可见行批量续写(README 写为 two at a time),最多 40 行;失败行留在账本中等待下次按 ↻。在新会话里发消息会「接管」并清除等待行。续写仅在按下后发生,不会在插件加载、定时器或上一批失败后自动触发。
渐进式恢复(默认关闭)¶
批量恢复多个长会话会同时打出多条上游模型请求。restoreProgressive 默认为 false,走普通恢复路径。在共享网关、自建代理容量有限或批量恢复触发限流/超时时,可打开渐进恢复:按 lineage 深度分波启动,并可选注册 llm/stream 中间件做请求池(容量、冷却等见配置表)。开关在按下恢复时读取;恢复进行中按暂停会立即中断当前批次并写回计划。
可选配置项(均可省略):
| Key | Default | Meaning |
|---|---|---|
restoreProgressive |
false |
启用分阶段恢复 |
restoreCapacity |
1 |
恢复开始时允许的模型并发 |
restoreMaxCapacity |
2 |
健康门限可提高的上限 |
restoreCooldownMs |
40000 |
连续失败后的冷却 |
restoreStartGapMs |
3000 |
恢复启动间隔(加 jitter) |
/state 在存在计划时会报告 restore 下的 progressive 与队列等字段;按钮仍只显示图标。
磁盘状态¶
状态目录为 $DSH_HOME/pause-resume/,包括 snapshot.json、pending.json、running.json、continue.json 等;写入采用 temp + fsync + rename,不放在插件包内。
安装与启用¶
README 给出的安装方式如下。也可在 Harness 插件管理器中用包名安装 bundle。
plugin_manager install_bundle dsh-pause-resume
SkillHub 目录页 提供「发送给 DeepSeek Harness 安装」入口(社区站点,与 DeepSeek / 幻方无官方从属关系)。SkillHub 与 package.json 均标注当前版本 v0.6.11。
配置项全部可选;插件不持有凭证。远程访问 Host 需显式配置 allowRemote,默认仅本地同源请求且需插件 header。
典型用法¶
- 在 DSH Web 会话头找到 pause-resume 按钮。有任务在跑时图标为 ⏸。
- 需要整体停下当前 Host 上可停的 turn、Goal 与 job 时,按 ⏸。插件先把计划落盘,再执行取消与暂停(README 保证:计划写失败则不会停任何东西)。
- 重启 DSH 或进程崩溃后,若图标为 ▶,按一次完成恢复;查看 transcript 中的续写消息与 tooltip 摘要。
- 若图标为 ↻,表示有回合自行以 error / max-tokens 等结束,按 ↻ 继续可见行;auth、quota 等不可重试错误会标为
blocking,仍会在列表中显示。 - 批量恢复遇网关限流时,在 Host 插件配置中设置
restoreProgressive: true及相关容量项,再按 ▶ 恢复。
适用场景与注意¶
适合:需要在维护、升级或重启 Host 前一次性停掉多路 Agent 工作,并在重启后按同一计划恢复会话续写、Goal 与 job 记录;希望在崩溃后依靠 running.json / pending.json 自动出现恢复入口;需要单独处理「非暂停导致的 turn 中断」时用 ↻ 账本。
注意:
- 后台 job 恢复时是记录 + 由续写回合按需重启,不是回放原进程。
- Schedule 不会被暂停;暂停窗口内触发的 schedule 仍可能产生新回合。
- Subagent 会话需通过父会话 attention,不能当作普通会话 mount。
- 插件路由默认同源 + 插件 header;
allowRemote需主动开启。 - 安装与启用前请审查源码与 MIT 许可证;插件能力受当前 DSH 版本与 Host 模型栈约束,README 对网关并发上限等边界有诚实说明。
结尾¶
dsh-pause-resume 把「停一切」和「接回来」收敛到会话头一个按钮,用手动计划、崩溃心跳与 continue.json 三条线区分暂停、崩溃与自行中断,恢复步骤在 transcript 中可见、可重试。目录与说明见 SkillHub:regrevia/dsh-pause-resume,源码与完整 README 见 GitHub:regrevia/dsh-pause-resume。