前言¶
在使用 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将会话移交到新会话
注意事项¶
-
插件以当前 DSH 进程权限运行,安装前应检查源码与许可证(MIT)。
-
配置项修改后需要刷新页面或重启 DSH 才能生效。
-
插件会创建状态文件保存检查点信息,确保有足够的磁盘空间。
-
如果会话恢复失败,可以手动调用
continuum_recover_now重新尝试。
结语¶
dsh-autorestart 通过「等待空闲 + 自动恢复」的机制,将重启从「进度丢失」变成「可恢复事件」,让长时间运行的智能体任务更加可靠。对于需要频繁重启或升级 DSH 的开发者,这是一个值得添加到工作流中的实用工具。
- 目录页:https://www.skillhub.cn/plugins/Eason-22/dsh-autorestart
- GitHub:https://github.com/Eason-22/dsh-autorestart