DSH Maestro Supervisor:DSH Web 恢复守护进程

在 DSH Web 环境中,进程崩溃或网络波动会导致会话中断,系统重启后状态难以恢复。DSH Maestro Supervisor 是一个守护进程与插件组合,用于自动检测 DSH Web 的崩溃,回滚到已知良好的状态(LKG),并恢复中断的会话。

该插件由 ddtcorex 维护,采用 MIT 许可证。它通过一个独立于 pnpm 树的系统级守护进程来保证存活,同时作为 DSH Web 内部的插件来处理会话恢复和浏览器重载。

核心功能

1. 崩溃检测与 LKG 回滚

守护进程运行在 dsh web 进程树之外,通过 Systemd 管理或手动启动。它每 3 秒轮询一次 Web 服务端口。当检测到服务不可用或崩溃时,守护进程会尝试将系统回滚到最近一次已知的良好快照(LKG)。

  • 存储位置:LKG 快照存储在 ~/.dsh/.supervisor/lkg/ 目录下。
  • 验证机制:快照文件通过 SHA256 校验。
  • 回滚触发:检测到崩溃后,守护进程会等待 60 秒防抖,然后执行回滚。

2. 自动恢复中断会话

当 DSH Web 重启后,插件会自动扫描并恢复中断的会话和未完成的轮次(open turns)。

  • 扫描范围:扫描最近 5 分钟内(默认配置)的会话日志。
  • 恢复逻辑:查找包含中断标记(reason.kind === 'interrupted')的会话,或查找未闭合的轮次,并尝试通过 RPC 重新连接或恢复上下文。
  • 客户端行为:浏览器端插件会在离线、WebSocket 断开或页面可见性变化时,每 1 秒尝试获取头部信息,成功后自动刷新页面。

3. 健康报告

崩溃或回滚操作完成后,守护进程会生成一份健康报告。报告包含系统状态摘要、Git Diff 以及最近的日志片段。

安装与启用

1. 构建插件

如果从源码安装,需要执行构建命令。注意客户端构建需要 build-client.mjs 包装器,直接使用 tsc 会导致客户端文件不完整。

pnpm --dir packages/dsh-maestro-supervisor install
pnpm --dir packages/dsh-maestro-supervisor build
pnpm --dir packages/dsh-maestro-supervisor verify

2. 添加到 DSH Web Profile

将插件添加到 Web 配置文件中。该包声明了 dsh.client,浏览器端会自动加载。

dsh plugin --profile web add @ddtcorex/dsh-maestro-supervisor
pnpm --dir ~/.dsh/profiles/web install

前置检查:在将插件添加到活跃配置的 bundles 之前,必须确保 dry-boot 通过。这能捕获加载时失败(如 lib/index.js 缺失、构建缓存陈旧等)。

DSH_HOME=$(mktemp -d) pnpm --dir deepseek-harness dsh web --port 0 &
# 等待启动成功并 curl 200,然后 kill

3. 安装守护进程

为了在进程树崩溃时存活,建议安装 Systemd 守护进程。

bash packages/dsh-maestro-supervisor/scripts/install-systemd.sh
systemctl --user daemon-reload
systemctl --user enable --now dsh-web-supervisor

如果不使用 Systemd,可以在前台手动运行守护进程进行调试。

node packages/dsh-maestro-supervisor/lib/index.js daemon

配置

插件的自动恢复行为通过配置文件控制,优先级从高到低依次为:Cordis 配置 > 环境变量 > Supervisor 配置文件 > Maestro 设置 > 默认值。

配置文件位于 ~/.dsh/.supervisor/config.json。

{
  "autoResumeEnabled": true,
  "autoResumeWithin": 5
}
配置项 类型 默认值 说明
autoResumeEnabled boolean true 是否启用自动恢复。设为 false 时仅通知。
autoResumeWithin number/string 5 恢复窗口,单位为分钟或 5m 格式。

使用方法

守护进程管理

node packages/dsh-maestro-supervisor/lib/index.js status
node packages/dsh-maestro-supervisor/lib/index.js logs --tail 50
node packages/dsh-maestro-supervisor/lib/index.js daemon

手动回滚

当需要强制回滚到最新 LKG 时:

node packages/dsh-maestro-supervisor/lib/index.js rollback --latest

RPC 接口(Loopback)

守护进程通过 Loopback RPC 接口提供服务,用于手动扫描和恢复特定会话。

扫描中断会话:

curl -s http://127.0.0.1:3080/dsh-maestro-supervisor-resume/scan -X POST \
  -H 'content-type: application/json' \
  -d '{"type":"client-request","rpcId":"r1","method":"scan","payload":{"withinMs":300000}}'

恢复指定会话:

curl -s http://127.0.0.1:3080/dsh-maestro-supervisor-resume/resume -X POST \
  -H 'content-type: application/json' \
  -d '{"type":"client-request","rpcId":"r2","method":"resume","payload":{"ids":["session-id"]}}'

注意事项

  1. 构建依赖:src/ 目录有任何修改后,必须运行 pnpm build。客户端构建依赖 build-client.mjs,直接使用 tsc 无法生成正确的客户端 bundle。
  2. 文件位置:LKG 快照存储在用户目录下的 .supervisor 文件夹中。
  3. 权限:守护进程以用户权限运行,若需 Telegram 通知需在 Systemd 配置中取消相关环境变量的注释。
  4. 生态说明:DSH 插件目录与 DeepSeek 或幻方官方无隶属关系,仅作为社区资源索引。

链接

  • 插件目录:[catalog_url]
  • GitHub 仓库:[github_url]
羽毛球分组比赛记分
小程序二维码

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

小夜