msilita/dsh-graceful-restart ↗★ 0
dsh-graceful-restart
DSH(DeepSeek Harness)优雅重启/关闭/启动守护插件:启动方式不变(dsh web),自动套壳拉起正式实例;等轮次结束后优雅重启并唤醒智能体继续;启动失败自动回滚新增插件(多版本成功基线、官方 CLI);页面自动刷新;设置菜单可调快照版本数。
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:msilita/dsh-graceful-restart说明文档
阅读完整 README ↗dsh-graceful-restart
DeepSeek Harness(dsh)的优雅重启 / 关闭 / 启动守护插件。
用户启动方式完全不变(dsh web)。插件自动"套壳":第一代进程阻止自身启动(占用非正式端口)并拉起正式实例(继承同一控制台),随后常驻为隐形 launcher——负责重启时的换代、启动失败的自动回滚,以及向正式实例传递重启 / 关闭请求。
无常驻看门狗(第一代只响应显式请求)、无外部工具、无轮询、无多余常驻进程。
做了什么
1. 优雅重启(等当前轮次结束)
restart_harness 工具或 /restart 命令触发后,插件不会立刻杀进程,而是等待所有 agent 轮次结束(当前回复完整落盘)再优雅退出,由第一代在同一控制台拉起新一代——不丢工作。
2. 重启后自动唤醒继续
重启前把活跃会话 id 写入 marker;新一代启动后轮询等待会话恢复,然后自动 steer() 唤醒智能体继续之前的工作。唤醒时的继续提示优先级:
restart_harness 的 continuePrompt 参数(智能体触发时指定)> settings.yaml 默认值 > 内置默认
3. 关闭与撤销
shutdown_harness//shutdown:等轮次结束后关闭整个进程树(第一代一并退出),不重启cancel_harness_action:撤销已安排但尚未执行的重启 / 关闭(触发后发现不需要了,随时改变主意)
4. 启动守护:失败自动回滚(核心)
每次 spawn 前记录插件清单快照(profile package.json 的 dependencies);第二代启动失败(退出码非 0,或宽限期 20 秒内退出)时:
- 对比当前清单与最近一次成功基线 → 找出"该基线之后新增"的插件
- 逐个
dsh plugin remove(官方 CLI,同步清理 bundles)→ 自动重试 - 仍失败 → 逐级回溯更早的成功基线(多版本 history),再卸掉下一批增量
- 连续回滚达上限后保持第一代存活,明确提示手动处理
成功基线保留多个版本(设置菜单可调 snapshotKeep,1–10,默认 3):第 N 次回滚使用第 N 个旧基线。启动成功(存活超宽限期)后新基线入列,与最新相同则不重复记录。
误判保护:Ctrl+C、显式关闭、显式重启都不触发回滚——只有意外启动失败才会。
5. 页面自动刷新(无轮询)
每个 DSH 进程的代际 ID = 进程启动时刻 startedAt。页面加载时把 ID 存入 localStorage;每次连接恢复(ws 重连成功)时查一次 /status 对比:
- ID 不同(或缺失)→ 页面状态可能过时 → 自动刷新一次(先更新持久化值防循环)
- ID 相同(ws 抖动)→ 不动
覆盖:wrapper 重启、手动完整重启(dsh web)、守护回滚(服务真空期有短窗口重试)、页面一直开着、DSH 关闭很久后重新打开。不依赖轮询,只在连接事件时动作。
6. 设置菜单
设置页新增 "优雅重启" 页签(settings.section):
- 快照保留版本数(1–10,默认 3)——成功基线保留几个版本,回滚逐级回溯用
设想的场景
| 场景 | 行为 |
|---|---|
| 长任务进行中需要重启(升级配置、装插件) | 等轮次结束再退出,不打断当前回复;重启后自动唤醒继续 |