dsh-startup-guard:在 DSH 启动前修复会话日志、预检插件组合并隔离崩溃源

前言

DSH 的扩展能力依赖大量第三方插件组合而成。一个插件包缺失、cordis.patch.yml 中的条目失效、client 产物不可用,或者宿主插件在启动阶段抛出运行时错误,都可能在启动时把 dsh web 卡住。

dsh-startup-guard 是一个面向 DeepSeek Harness 的启动守卫插件。它在启动前检查会话日志、插件清单、bundle 解析、patch 组合、client 产物和宿主 apply(),把可修复的问题先处理掉,并把高风险插件隔离起来。

这是什么

dsh-startup-guardaokamoaki 维护,许可证为 MIT。

它的一句话定位是:在启动前修复会话日志、预检插件组合、执行宿主插件冒烟测试,并隔离崩溃源,避免「插件损坏 / 日志损坏」把 DSH 卡死在启动。

这个插件不是替代 DSH 本身,而是在 DSH 插件体系内提供一个启动前检查与兜底层。

核心功能

下面介绍它已核实的几项能力。

会话日志修复

它可以修复 session.jsonl[.zstd] 中的 seq 损坏、torn 尾帧和过期缓存,并在修复前备份原件。

适合的场景是:本地 ~/.dsh 中的会话日志已经出现异常,但不想直接删除整份日志,先做一次可回溯的修复。

插件清单与源码快照

它会为 profile 的 package.jsoncordis.patch.yml、pnpm 清单以及 link 插件源码生成快照,并记录 host/client/patch 指纹。

这一步的作用是把当前插件组合固定下来,后续回滚或排查时有可比较的基线。

bundle 预检与回滚

它会校验第三方 bundle 目录是否可解析。缺失时会回滚到可解析快照,并把坏清单另存为 package.json.broken

这适合处理插件包安装后目录不完整、路径解析失败、或 package.json 与真实 bundle 不一致的问题。

组合预检与自动禁用

它会检测 entry id 重复、name 不可解析和 YAML 致命形态。

name 失效的 row,它可以自动禁用;在 strict 模式下,会写块标记并让启动器拒绝启动。

client 产物校验

它会校验 client 产物中的 exports['./client']__ModuleLoader__.load 注册,并在 vm 沙箱中执行加载,同时检测重复 client id。

这一步针对的是“插件能安装,但 client 产物不可用”的情况。

宿主 apply() 冒烟

它会在子进程和 mock Cordis 环境中执行第三方插件的 apply(),识别启动即抛出的错误,并按指纹缓存结果。

这一步用于发现宿主插件在启动早期就抛异常的运行时问题。

崩溃隔离

它会基于崩溃标记或启动标记触发全量冒烟。是否自动禁用冒烟失败插件,还要看崩溃标记是否在场、插件是否显式声明 smoke 为 true,或是否属于客户端产物损坏。

这个机制在纯 dsh web 场景下也会生效。

安装与启用

先安装插件:

dsh plugin --profile web add dsh-startup-guard

如果要从 GitHub 源码安装,可以用:

dsh plugin --profile web add github:aokamoaki/dsh-startup-guard

安装后,重启 dsh web 即自动生效。

运行环境方面,package.json 要求 Node >=22.13,并声明 peerDependency:

"@deepseek-ai/cordis": "^4.0.1"

配置文件位于:

~/.dsh/dsh-startup-guard.json

该配置可选,缺省使用默认值。

模式包含 reportfixstrict,其中 fix 是默认模式;strict 会写块标记并让启动器拒绝启动。

典型用法

首次启动

首次启动后,它会执行以下动作:

1、扫描并修复会话日志;
2、快照当前插件清单;
3、执行宿主冒烟和客户端校验;
4、写入运行报告。

报告文件位于:

~/.dsh/dsh-preflight-report.json

本地干跑

如果只是想看检查结果,可以先运行:

node guard-sessions.mjs --dry-run

如果要在 strict 模式下检查:

node guard-sessions.mjs --mode strict

调用核心入口

它也可以通过核心 API 调用:

import { runGuard } from 'dsh-startup-guard/lib/guard-core.mjs';

const r = await runGuard(home, { dryRun: true });

runGuard 是核心入口,传入 home 目录和运行参数,返回本次 guard 的执行结果。

运行数据与恢复

运行数据会写入 ~/.dsh,包括:

dsh-preflight.log
dsh-preflight-state.json
dsh-preflight-report.json
dsh-crash-state.json
dsh-boot-state.json
dsh-preflight-block.json
repair-backups/
plugin-snapshots/

其中,repair-backups/ 用于保存修复或禁用前的原文件备份;plugin-snapshots/ 用于保存插件清单和源码快照。

如果发生误禁用,可以删除对应 profile 的 cordis.patch.yml 中的 disabled 条目。原 patch 已备份到 repair-backups/

自动禁用策略

这里需要注意它的禁用边界:

1、单独的冒烟失败不会自动禁用;
2、崩溃标记在场,且冒烟失败时,对应插件可被自动禁用;
3、插件显式声明 smoke 为 true 时,冒烟失败可被自动禁用;
4、客户端产物损坏则照常自动禁用。

这个策略比较谨慎:冒烟跑在 mock 环境,失败既可能是真实错误,也可能是插件依赖真实 DSH 服务导致的环境缺口。

适用场景与注意

适合以下使用者:

1、日常维护 dsh web profile 的人;
2、组合多个第三方 DSH 插件的开发者;
3、希望把会话日志损坏、patch 失效、bundle 解析失败、client 产物问题从“启动即崩”变成“启动前检查 + 可回滚”的人。

使用前需要确认:

1、许可证为 MIT;
2、README 声明与 DeepSeek 官方无关;
3、插件以当前 dsh 进程权限运行,安装前应检查源码与许可证;
4、不要把它理解成 DSH 官方应用商店或官方发行渠道的一部分;
5、目录页 URL 未在已核实资料中确认,建议以 GitHub 仓库为准。

链接

GitHub 仓库:

https://github.com/aokamoaki/dsh-startup-guard

安装命令:

dsh plugin --profile web add dsh-startup-guard
羽毛球分组比赛记分
小程序二维码

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

小夜