前言¶
在 DeepSeek Harness (DSH) 的插件化开发体系中,服务重启是常见场景。重启往往会导致当前会话中断、正在进行的任务丢失。为了解决这个问题,本文介绍一个工作流插件,它在检测到 DSH 服务重启后,会自动向主 agent 投递一条信息性消息。这条消息包含中断时长和上次活跃会话的摘要,交由 agent 自主决定是继续之前的工作,还是启动新的任务,而非命令式地强制恢复。
这是什么¶
dsh-resume-on-restart 是一个 DSH 插件,由用户 nickkkkkk123123 维护。它解决的核心问题是“DSH 重启后的会话与工作丢失”。通过在重启时投递状态摘要,让 agent 在重启后能够基于上下文做出合理的决策。
核心功能¶
插件主要包含以下能力:
- 重启检测:通过读取 marker 文件(记录上次进程 pid 和启动时间)来判断当前 DSH 是否发生了重启。
- 信息性消息:检测到重启后,投递包含“检测到重启 + 中断时长 + 上次活跃会话”的摘要消息。这属于信息提示,不强制 agent 执行特定动作。
- 活动追踪:在 DSH 运行期间,通过监听 cordis 事件(如
agent/session-start、agent/pre-step)来记录最近活跃的会话,供重启后的消息使用。 - 兼容 DSH Desktop:插件仅依赖 cordis 上下文 (
agents服务),不导入任何@deepseek-ai/dsh-*内部包,因此可以在 DSH Desktop 的打包环境(如 app.asar)中正常运行。
安装与启用¶
安装前请确保已安装 DeepSeek Harness CLI。安装时需指定本地路径。
# 将插件安装到桌面 profile(DSH Desktop 默认使用 desktop profile)
dsh plugin --profile desktop add <本目录路径>
# 安装完成后,重启 DSH Desktop 即可生效
配置说明¶
插件的配置通过 cordis.patch.yml 文件管理。以下是关键配置项及其默认值:
| 配置项 | 默认值 | 说明 |
|---|---|---|
enabled |
true |
插件总开关。 |
stateDir |
.resume-on-restart |
marker 文件和状态文件的存放目录(相对于 DSH_HOME)。 |
target |
primary |
消息投递的目标,默认为主 agent (primary),也可指定为特定的会话 ID。 |
wakeup |
true |
是否在投递消息后真正唤醒目标 agent。设为 false 则仅注入消息。 |
notice |
'' |
附加在消息末尾的自定义提示文本。 |
shutdownGraceMs |
600000 |
关闭前的宽限窗口(毫秒),在此期间被标记为活跃的会话会被视为任务相关。 |
ignoredSessionPrefixes |
['head-'] |
需要忽略的会话 ID 前缀(例如多代理架构中的根会话)。 |
运行逻辑¶
DSH 启动时的执行流程如下:
- 读取 Marker:读取
~/.dsh/.resume-on-restart/marker.json,获取上次的pid和lastBootAt。 - 判定重启:将当前进程的
pid与 marker 中的pid进行比对,如果不一致则判定为发生重启。 - 更新 Marker:写入新的 marker 文件,更新为当前的
pid和启动时间。 - 投递消息:若判定为重启,插件会轮询等待主 agent 出现(最长等待 20 秒),随后投递信息性消息。消息格式通常如下:
[resume-on-restart] 检测到 DSH 服务已重启。
上次运行于 ...,本次于 ... 重启完成。
中断约 X 秒。
重启前最近活跃的会话:<session-id>
如需继续之前的工作,或启动新任务,请自主决定下一步。
适用场景与注意¶
- 适用场景:需要长时间运行 DSH Desktop 并希望从意外重启中恢复工作流的用户。
- 权限注意:插件以当前 DSH 进程的权限运行,请确保安装的来源可信。
- 源码检查:在安装任何社区插件前,建议查阅其源码与许可证(本项目为 MIT 许可证)。
结尾¶
这个插件通过轻量级的状态追踪和消息投递机制,解决了 DSH 重启后的上下文丢失问题。它不替代 agent 的逻辑,而是提供决策依据,符合 DSH “一切皆插件”的架构理念。
插件目录:dsh-resume-on-restart
源码仓库:GitHub