dsh-autorestart:重启不打断工作流

前言

在使用 DeepSeek Harness(DSH)开发智能体时,经常会遇到需要重启 DSH 或升级插件的场景:无论是系统维护、插件热更新,还是进程崩溃,重启往往意味着当前对话的进度丢失,需要手动输入「continue」才能继续。对于长时间运行的对话或拥有持久化目标(goal)的会话,重启尤其麻烦——如果会话持有 create_goal,重启后该目标会处于「disarmed」状态,自动继续的流程会中断。

dsh-autorestart 是一个 DSH 工作流插件,它的核心作用是让「重启」变成一个可恢复的事件:重启前等待所有对话空闲,重启后自动恢复会话并注入延续消息,从而让工作流无缝衔接。

插件定位

  • 名称:dsh-autorestart
  • 维护者:Eason-22
  • 分类:工作流
  • 版本:0.3.3
  • 许可证:MIT
  • 语言:JavaScript

插件通过等待所有对话进入空闲状态、在重启时自动恢复会话,解决了「重启 = 进度丢失」的痛点。它不仅适用于普通对话,还能处理带有持久化目标的会话,确保重启后目标能被重新激活。

核心功能

等待空闲再重启

插件会在重启前检查两个条件:
1. 所有对话都进入空闲状态
2. 主机保持安静超过 settleMs(默认 6000ms)

只有同时满足这两个条件,才会执行重启。这避免了在对话仍在处理时强行重启导致进度丢失。

自动恢复会话

重启完成后,插件会自动恢复被中断的会话:
- 有持久化目标的会话:插件会重新激活目标,让目标轮驱动继续下一轮
- 无目标的会话:插件会注入一条延续消息,让会话从上次中断处继续

多请求合并

多个会话可以同时请求重启,这些请求会被合并为一次重启,所有请求者都会在重启后被唤醒,而不会只恢复最后一个请求者。

安全防护

插件设置了两个安全门:
1. 主机检查:确保没有对话处于忙碌状态
2. 辅助进程检查:在杀死进程前再次检查对话是否忙碌

这样可以避免在重启过程中出现新的对话被意外终止。

状态可见性

浏览器界面会显示重启状态:
- 输入栏左侧显示「pending restart」胶囊
- 侧边栏会话标题旁显示呼吸动画的小圆点
- 点击胶囊可查看详情

安装与启用

从 npm 安装:

dsh plugin install dsh-autorestart

从源码安装:

git clone https://github.com/Eason-22/dsh-autorestart.git
cd dsh-autorestart
dsh plugin --profile desktop add /absolute/path/to/dsh-autorestart

或者使用 DSH 内置的插件管理器:

plugin_manager install_bundle  target = <absolute path to the package>

安装后,主机端插件立即生效,但浏览器端界面(胶囊和小圆点)需要刷新页面或重启 DSH 后才会加载。

典型用法

插件注册了 6 个工具,供智能体调用,同时也对用户可见。

1. 请求优雅重启

continuum_restart:请求重启,等待所有对话空闲并静默一段时间后重启,重启后当前会话自动恢复。

参数:
- reason(string):记录在检查点和日志中的原因
- resume(boolean,默认 true):是否自动恢复会话
- defer_seconds(number):在第一次空闲检查前额外等待的秒数
- parkGoals(boolean,默认 true):是否在重启前禁用目标驱动的会话

2. 查看重启状态

continuum_status:只读快照,显示:
- 是否有重启挂起
- 哪些会话被检查点保存
- 每个阻塞会话的阻塞原因
- 被禁用的目标
- 每个会话的最后恢复操作
- 会话移交信息
- 状态文件路径
- 检测到的重启环境

参数:
- include_sessions(boolean,默认 true):是否包含每个会话的检查点条目

3. 取消重启

continuum_cancel_restart:取消挂起的重启,释放所有请求者的延续请求。如果没有挂起的重启,则无操作。

4. 禁用会话目标

continuum_park_goal:禁用会话的目标,使其不再阻止重启。当前轮次会正常完成,目标会在重启后重新激活。

参数:
- sessionId(string,可选):默认为调用会话的 ID

5. 立即恢复

continuum_recover_now:立即执行恢复操作,而不是等待下一次重启。报告每个会话的操作和原因。

参数:
- sessionId(string,可选):默认为所有等待恢复的会话

6. 会话移交

continuum_handoff:将对话超过模型上下文窗口的会话移交到新会话,携带目标对象、记录的原因和有界的对话尾部。

参数:
- sessionId(string,可选):默认为调用会话的 ID
- maxChars(number,默认 20000):对话尾部的字符预算

配置项

默认配置位于 cordis.patch.yml 的 insert 行。要覆盖配置,在 ~/.dsh/profiles/<profile>/cordis.patch.yml 中添加 - id: dsh-autorestart 行(注意:这是替换整份配置,不是合并)。

主要配置项:

配置项 默认值 说明
enabled true 关闭整个插件
stateFile '' 检查点文件路径。空表示 <DSH_HOME>/storages/dsh-autorestart/state.json
resumeOnBoot true 启动时是否自动恢复被中断的会话
recoveryDelayMs 6000 启动后等待多久再恢复,确保会话存储和模型就绪
maxSessions 4 每次启动最多恢复的会话数
maxResumeAttempts 2 每个会话的最大恢复尝试次数(跨多次启动)
deferPollMs 3000 等待对话空闲时的轮询间隔
deferSoftMs 300000 软截止时间:对话仍忙碌超过此时间会发出警告
deferHardMs 900000 硬截止时间:对话仍忙碌超过此时间会发出警告。只有 forceRestartWhenBusy 为 true 时才强制重启
deferPolicy auto auto = 硬截止后按 forceRestartWhenBusy 决定是否强制重启;wait = 永远等待
forceRestartWhenBusy false 是否允许在对话仍运行时强制重启。默认 false 永不中断会话
restartMode app app = 重启 DSH 桌面应用;command = 运行 restartCommand
restartCommand '' 自定义重启命令

适用场景与注意

适用场景

  • 长时间运行的智能体任务:需要定期重启 DSH 或升级插件
  • 多会话工作流:多个会话同时运行,重启后需要全部恢复
  • 带有持久化目标的会话:目标需要在重启后继续驱动轮次
  • 上下文窗口受限的场景:使用 continuum_handoff 将会话移交到新会话

注意事项

  1. 插件以当前 DSH 进程权限运行,安装前应检查源码与许可证(MIT)。

  2. 配置项修改后需要刷新页面或重启 DSH 才能生效。

  3. 插件会创建状态文件保存检查点信息,确保有足够的磁盘空间。

  4. 如果会话恢复失败,可以手动调用 continuum_recover_now 重新尝试。

结语

dsh-autorestart 通过「等待空闲 + 自动恢复」的机制,将重启从「进度丢失」变成「可恢复事件」,让长时间运行的智能体任务更加可靠。对于需要频繁重启或升级 DSH 的开发者,这是一个值得添加到工作流中的实用工具。

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

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

小夜