dsh-resume-on-restart:检测 DSH 重启并通知主 agent

前言

在 DeepSeek Harness (DSH) 的插件化开发体系中,服务重启是常见场景。重启往往会导致当前会话中断、正在进行的任务丢失。为了解决这个问题,本文介绍一个工作流插件,它在检测到 DSH 服务重启后,会自动向主 agent 投递一条信息性消息。这条消息包含中断时长和上次活跃会话的摘要,交由 agent 自主决定是继续之前的工作,还是启动新的任务,而非命令式地强制恢复。

这是什么

dsh-resume-on-restart 是一个 DSH 插件,由用户 nickkkkkk123123 维护。它解决的核心问题是“DSH 重启后的会话与工作丢失”。通过在重启时投递状态摘要,让 agent 在重启后能够基于上下文做出合理的决策。

核心功能

插件主要包含以下能力:

  1. 重启检测:通过读取 marker 文件(记录上次进程 pid 和启动时间)来判断当前 DSH 是否发生了重启。
  2. 信息性消息:检测到重启后,投递包含“检测到重启 + 中断时长 + 上次活跃会话”的摘要消息。这属于信息提示,不强制 agent 执行特定动作。
  3. 活动追踪:在 DSH 运行期间,通过监听 cordis 事件(如 agent/session-start、agent/pre-step)来记录最近活跃的会话,供重启后的消息使用。
  4. 兼容 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 启动时的执行流程如下:

  1. 读取 Marker:读取 ~/.dsh/.resume-on-restart/marker.json,获取上次的 pid 和 lastBootAt。
  2. 判定重启:将当前进程的 pid 与 marker 中的 pid 进行比对,如果不一致则判定为发生重启。
  3. 更新 Marker:写入新的 marker 文件,更新为当前的 pid 和启动时间。
  4. 投递消息:若判定为重启,插件会轮询等待主 agent 出现(最长等待 20 秒),随后投递信息性消息。消息格式通常如下:
[resume-on-restart] 检测到 DSH 服务已重启。
上次运行于 ...,本次于 ... 重启完成。
中断约 X 秒。
重启前最近活跃的会话:<session-id>
如需继续之前的工作,或启动新任务,请自主决定下一步。

适用场景与注意

  • 适用场景:需要长时间运行 DSH Desktop 并希望从意外重启中恢复工作流的用户。
  • 权限注意:插件以当前 DSH 进程的权限运行,请确保安装的来源可信。
  • 源码检查:在安装任何社区插件前,建议查阅其源码与许可证(本项目为 MIT 许可证)。

结尾

这个插件通过轻量级的状态追踪和消息投递机制,解决了 DSH 重启后的上下文丢失问题。它不替代 agent 的逻辑,而是提供决策依据,符合 DSH “一切皆插件”的架构理念。

插件目录:dsh-resume-on-restart
源码仓库:GitHub

羽毛球分组比赛记分
小程序二维码

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

小夜