dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH 版本守卫:记录插件版本与配置快照,插件冲突导致 DSH 崩坏后可脱离 DSH 进程回退到上一个可用版本 · Out-of-process rollback for DeepSeek Harness plugins
插件冲突导致 DSH 打不开时,用它退回上一个可用版本。
Many users break their DSH installation by installing a conflicting plugin: the
window never opens, or it opens and immediately exits. dsh-version-guard
records plugin versions and configuration snapshots so a broken install can be
rolled back — including from a page that runs outside DSH, so it still works
when DSH itself will not start.
DSH 的插件装在 profile 目录里,由 package.json 的 dsh.profile.bundles
决定启动时加载哪些。装了一个有问题的插件之后:
dsh-version-guard 的做法是把这个死锁拆开:
| 部分 | 位置 | 作用 |
|---|---|---|
| 宿主插件 | lib/host/index.js | 写启动记录、成功启动后自动打回退点、把恢复页的 HTTP 接口挂到 DSH 上 |
| 设置页 | lib/client/client.js | 在 DSH 设置里加一页「版本守卫」,内嵌上面那个恢复页 |
| 离线恢复页 | lib/recovery/ + lib/bin/version-guard.js | 脱离 DSH 进程运行的恢复服务,DSH 起不来时唯一的入口 |
| 共享核心 | lib/core/ | 快照、恢复、版本识别、插件启停、pnpm 调用;两个前端共用同一套逻辑 |
设计上最要紧的一点:恢复能力不放在恢复对象里面。离线恢复页不 import 任何
@deepseek-ai/*代码,只依赖 Node 与 profile 目录,因此插件把 DSH 搞坏时它照样能用。
在 DSH 可用时,使用官方插件命令安装到实际使用的 profile(下面以 web 为例):
dsh plugin --profile web add github:skyjjgw/dsh-version-guard
安装后重启 DSH。仓库已包含可直接运行的 lib/,无需额外构建,也未发布到 npm。
请在发生故障前保存本仓库副本,方便直接运行其中的 dsh-version-guard.cmd
或 node lib/bin/version-guard.js;离线入口的使用不依赖 DSH 成功启动。
把整个 dsh-version-guard 目录放到 DSH 的插件目录,例如:
E:\dsh\plugins\dsh-version-guard
以 E:\dsh\data\profiles\web-enhanced 为例,编辑该目录下的 package.json:
{
"dependencies": {
// 新增这一行;用 link: 指向上面的目录,源码改动会立刻生效
"dsh-version-guard": "link:E:/dsh/plugins/dsh-version-guard"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
// 新增这一行;这一行才是真正决定启动时加载它的地方
"dsh-version-guard"
]
}
}
}
然后在 profile 目录里同步依赖:
cd /d E:\dsh\data\profiles\web-enhanced
pnpm install --ignore-scripts
重启 DSH。设置里会出现「版本守卫」一页。
用
link:而不是复制,是为了避免「插件目录里的源码」和「profile 里实际加载的 那份」两份代码不一致 —— 那正是这类工具最容易出的问题。
把 dsh-version-guard.cmd 放到顺手的位置(桌面即可)。它自己会去找 DSH 自带的
Node 运行时,所以不要求用户装 Node。
dsh-version-guard.cmd(推荐)打开浏览器里的离线恢复页,点「一键救援」。它会:
package.json、cordis.patch.yml、pnpm-lock.yaml 等配置文件写回去;pnpm install。然后关闭页面,重新启动 DSH。
dsh-version-guard.cmd --rescue --dry-run :: 先看看会退回哪一版,不改任何东西
dsh-version-guard.cmd --rescue :: 直接回退
dsh-version-guard.cmd --status :: 查看各插件版本与启动健康状况
dsh-version-guard.cmd --list :: 列出所有 profile
如果不想整体回退,在恢复页的「当前插件版本」里找到可疑的那个,点「停用」。
停用会像官方插件管理器一样,在 profile 的 cordis.patch.yml 中写入对应入口的
disabled: true。它不会删除依赖、修改 bundles 或删除任何文件,随时可以
「恢复启用」,官方管理器与版本守卫看到的是同一份状态。
pnpm install --ignore-scripts。回退点的内容是决定 profile 是什么的那些文件:
| 文件 | 说明 |
|---|---|
package.json | 依赖版本 + dsh.profile.bundles 加载列表 |
cordis.patch.yml | 用户补丁层(插件的启停与配置覆盖) |
pnpm-lock.yaml | 实际解析到的版本 |
.dsh-market/state.json 由插件市场拥有,不属于 profile 组合真源,版本守卫不会
快照或回写它。版本守卫也不再维护私有停用列表;插件启停唯一以
cordis.patch.yml 为准。
不复制 node_modules。 它可以从 package.json + pnpm-lock.yaml 用 pnpm
重新装出来,复制它只会让快照大到无法管理。所以「配置回退」和「依赖同步」是两步,
恢复页会在需要时明确提示第二步。
不碰会话、密钥、设置。 回退点只覆盖上面这几个文件。
package.json。Windows 上 rename 被占用时会重试,最后才退回原地写。.. 与绝对路径,防止越出 profile 目录。--ignore-scripts,
避免在救援这个最不该出意外的时刻执行第三方安装脚本。都在 profile 目录下的 .dsh-version-guard/:
.dsh-version-guard/
├── boot.json 启动记录:上次是否走完、连续失败次数
├── guard.lock 并发写锁
└── snapshots/ 回退点,默认保留最近 30 个
└── snap-<时间>-<类型>.json
删掉整个 .dsh-version-guard/ 目录不会影响 DSH 启动,只是会丢掉回退点。
「DSH 打不开」这件事本身没法在坏掉的进程里报告,所以用的是启动记录:
关键点是第 2 步不只判断端口是否被监听:端口通了不等于界面能用。
dsh.client 约定。本插件的客户端是按
window.__ModuleLoader__.load({ id, factory }) 这个 classic script 约定写的,
顶层不能用 import/export(那会让插件页整体加载失败)。/dsh-version-guard/*),
而不是 typert/remote。这样不需要维护一份严格的类型描述文件,代价是它没有
网关的计量与取消能力。cordis.patch.yml。版本守卫写入对应入口的
disabled 覆盖,不删除 dependencies 或 dsh.profile.bundles,因此不会出现
一个界面显示启用、实际宿主仍未加载的双真源状态。宿主插件必须知道「当前这个 DSH 进程用的是哪个 profile」,因为它要把启动记录和 回退点写进那个 profile。判断顺序是:
--profile <名称>;DSH_PROFILE;profile;第 1 项排在第 2 项前面是有原因的:实测中 DSH 启动
--profile web-enhanced 时,环境里仍带着 DSH_PROFILE=desktop。若先信环境变量,
在多 profile 的机器上就会把回退点写进另一个 profile —— 用户以为被保护了,
实际用的那个 profile 一直没被记录。这个顺序有专门的回归测试
(test/profile-detect.test.js)。
恢复页打不开
dsh-version-guard.cmd --status
它只依赖 Node。如果连它都报「找不到 Node 运行时」,用 --NodePath 指定:
.\dsh-version-guard.ps1 -NodePath "D:\node\node.exe" -Status
回退之后 DSH 还是打不开
说明问题不在配置层。在恢复页里逐个「停用」社区插件(从最近装的那个开始), 每次停用后重启 DSH 试一次。全停用之后仍然打不开,那就是 DSH 应用本身或 环境问题,与插件无关。
回退后提示「还需要同步依赖」
点恢复页里的「立即同步依赖」,或者命令行:
dsh-version-guard.cmd --install
设置里没有「版本守卫」
宿主插件没有加载。检查 profile 的 dsh.profile.bundles 里是否有
dsh-version-guard,以及 node_modules 里能不能找到它。注意:即使这一页不出现,
离线恢复页依然可用。
npm test
npm run verify
测试覆盖 profile 识别优先级、官方格式的插件启停、市场状态不进入快照以及回退隔离;
包约定检查覆盖 exports、dsh.bundle、dsh.client、classic script、相对 import、
Cordis 补丁与路由挂载。GitHub Actions 会在 Node 22 和 24 上运行两组检查。
MIT