dsh-interrupted-resume:DSH 进程重启后的会话自动续跑

前言

DSH 进程在运行中重启、崩溃或被强杀时,正在执行的任务会停在半路。重启后,这些会话不会自动继续,需要手动介入,而且因为不知道中断前做到哪一步,很容易重复执行副作用操作。

dsh-interrupted-resume 插件在 DSH 重启后自动识别被强制中断的会话,注入一条带状态核对要求的继续指令,让会话能够安全地从中断点恢复。

定位

这是一个专注于「dsh 进程重启 / 崩溃 / 强杀」这一单一场景的轻量插件,代码量约 600 行,零外部依赖。它不处理运行期错误、限流、超时等其他中断类型,也不提供 GUI 面板、统计面板或自适应退避策略。

为什么轻量是有价值的:重启崩溃这个场景的判据是确定且不可伪造的——interrupted 是 session repair 在冷读时合成的,agent loop 从不实时发出,所以它只意味着「进程没了」,不会误判成限流或模型错误。

核心功能

触发条件(四层,全满足才续)

  1. 最近 12 小时内有过人类提示词
  2. 最后一条 turn/end.reason.kind === "interrupted",或该会话有被打断的子代理
  3. 距中断 ≥ 30 秒(quietMs)
  4. 1 小时滑动窗口内自动续 < 30 次(距上次续跑超 1 小时则计数归零)

子代理场景

派出的子代理随父代理一起被重启终止。插件能正确恢复两种情况:

  • 子代理已完成后重启:按 interrupted 续父会话
  • 子代理运行中被重启:按「有中断的子代理」续父会话

注入的消息

重启可能发生在副作用操作中途,所以注入文本强制要求先核对状态:

[自动续跑 · 由 dsh 重启触发]

上一轮(turn N)因 dsh 进程重启被强制中断,没有正常结束。

请按以下顺序继续:
1. 先核对当前实际状态(工作区文件、git 状态、后台任务/子进程、已执行的外部操作),确认中断前哪些步骤真的完成了;
2. 从中断处继续推进原任务;
3. 不要去重做可能已产生副作用的操作(写文件、提交、推送、删除、发布、部署等)——若无法确认其是否已执行,先核实再决定;
4. 如果核对后仍然无法判断状态,停止操作并向我报告现状与疑点。

安装与启用

# 从 npm 安装
dsh plugin --profile web add dsh-interrupted-resume

# 或本地源码(开发/定制)
dsh plugin --profile web add /path/to/dsh-interrupted-resume

安装后重启 dsh:插件在启动 5 秒后开始首轮扫描。

配置

{
  promptWindowMs: 12 * 60 * 60 * 1000,  // 候选窗口
  startupDelayMs: 5_000,               // 启动后延迟多久开始扫
  quietMs: 30 * 1000,                  // 中断后静置多久才续
  maxAttemptsPerSession: 30,           // 滑动窗口内最多自动续几次
  attemptResetMs: 60 * 60 * 1000,      // 距上次续跑超这么久,计数归零
  enabled: true,
  dryRun: false,                       // true = 只记日志不注入
}

可观测性

所有痕迹写在自己的状态目录(跟随 DSH_HOME):

$DSH_HOME/interrupted-resume/
├── resume.log    # 每轮扫描/判定/注入的完整链路
└── ledger.json   # 每会话的续跑次数与最后处理的 turn

典型日志:

defer session-xxx: interrupted 12s ago (< quietMs 30s), will retry in 18s
scan done: 1 sessions, 1 in window, 0 resumed, 1 deferred
resumed session-xxx: turn 1, attempt 1
scan done: 1 sessions, 1 in window, 1 resumed

已知限制

  • 每个进程生命周期内只处理「启动时能看到的」中断;插件中途热加载不追溯
  • 如果模型在续跑后再次中断,第 2 次仍会续,第 3 次起放弃(maxAttemptsPerSession)
  • lastPromptAt 语义是最后一条人类提示词时间,不是最后活动时间

适用场景

适合需要在 DSH 进程重启后自动恢复任务的开发者。插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。

结尾

dsh-interrupted-resume 用单一、确定的重启场景切入,避免了复杂错误分类和退避策略的复杂性。它让会话在中断后能够安全恢复,减少手动干预。

  • 目录页:https://www.skillhub.cn/plugins/ptrel1/dsh-interrupted-resume
  • GitHub:https://github.com/ptrel1/dsh-interrupted-resume
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye