前言¶
在 DSH(DeepSeek Harness)里,profile 的插件清单往往靠约定或人工核对:某几个包不许装、不许启用。漏检一次,被禁插件仍可能通过 Web 市场、CLI 或手工改 composition 进入运行环境。下面介绍社区 Host 插件 dsh-plugin-allcrash(维护者 YV3507),它在配置名单命中时让 Host 进程立刻退出并留下崩溃报告,把「口头禁止」变成机器执行的守卫。设计思路参考 Minecraft Forge 模组 allcrash;在 SkillHub 上归类为 admin-security。
这是什么¶
dsh-plugin-allcrash 是 Cordis bundle 形态的 DSH Host 插件:名单里的插件一旦被加载、被启用、已安装,或正被尝试安装,在默认 mode: crash 下会触发 Host 崩溃并生成报告。实现上零依赖(仅 Node 内建模块),Windows / macOS / Linux 共用同一份代码;判定逻辑与崩溃链路分离,便于单测与隔离子进程端到端验证。
运行环境需以 @deepseek-ai/dsh-app-boot 的 boot() 启动 Host(DSH Desktop 与 dsh CLI 均适用)。崩溃优先走 boot 安装的 fail-loud;若未安装,插件内置 3 秒兜底 process.exit(1) 仍会结束进程。
核心功能¶
与 Forge allcrash 的对应¶
| 原型(Forge) | 本插件(DSH) |
|---|---|
config/allcrash-common.toml 的 crash_mod |
${DSH_HOME}/allcrash.json 的 crash_plugin |
| 模组加载时抛异常 | 未捕获异常 → fail-loud → process.exit(1) |
crash-reports/crash-*.txt |
${DSH_HOME}/crash-reports/allcrash-<本地时间>-<pid>.txt |
| 服务端下发名单、拦截客户端 | tools/pre-execute 拦截 plugin_manager 的安装/启用与守卫自拆 |
检测通道¶
- L1:
tools/pre-execute,在plugin_manager执行前拦截安装、启用被禁插件,或关停/卸载守卫自身;命中时不把控制权交回工具链。 - L2:监听
plugin-manager/changed、install-state、app-boot/config-reload、hmr/reload,profile 变更后立即重扫。 - L3:看门狗(默认 5s)与启动时 boot 后 0 / 250 / 1000ms 扫描,覆盖手工改 patch 等未触发事件的路径。
- L4:
agentPresets.compositionInventory(),覆盖挂在 agent preset 里、不在 loader 树上的行。 - L5(可选):
plugin-manager/install-log,监听 pnpm 输出(需开启crash_on_install_log)。
判定同时比对包名/路径、loader 行 id、插件声明名(fiber.runtime.name),任一命中即算。
响应模式¶
全局或条目级 mode 取更严格者:
| 值 | 可拦截动作(安装/启用/拆守卫) | 已加载的插件 |
|---|---|---|
crash(默认) |
崩 Host | 崩 Host |
deny |
拒绝工具调用,Host 存活 | 退化为 warn |
warn |
告警并放行(dry-run) | 告警 + 审计 |
warn 命中时写 ${DSH_HOME}/.allcrash/would-crash-<时间>-<pid>.txt,不写进 crash-reports/(该目录表示「真的崩过」)。
配置与防绕过¶
- 名单与审计日志作用域为 DSH_HOME(同机各 profile 默认共用);某 profile 需不同名单时,可在 composition 行写
config(行配置优先级更高,改后需重启)。 - 删配置文件不会关守卫:曾读到有效名单后文件消失,会沿用上次名单、写回文件并告警;停用请显式
"crash_plugin": []。 - 解析失败时沿用上一次有效配置并告警,不会静默退回占位符名单。
安装与启用¶
从 GitHub 安装(live profile 安装后立即生效,startup profile 需重启):
plugin_manager action=install_bundle target=github:YV3507/dsh-plugin-allcrash
dsh plugin --profile <profile> add github:YV3507/dsh-plugin-allcrash
从本地目录安装(开发/自用):
plugin_manager action=install_bundle target=<本目录绝对路径>
dsh plugin --profile <profile> add <本目录绝对路径>
安装后清单中应出现 dsh-plugin-allcrash(enabled)。首次运行会在 ${DSH_HOME}/allcrash.json(默认 ~/.dsh/allcrash.json)生成默认配置;默认名单为占位符 ["example-plugin"],此时不会触发崩溃。
仓库 package.json 当前版本为 1.1.0,要求 Node >=20,许可证 MIT。
典型用法¶
1. 编辑禁止名单¶
改动 ${DSH_HOME}/allcrash.json 中的 crash_plugin,下一次扫描(默认 ≤ 5 秒)生效,无需重启 Host。示例结构:
{
"crash_plugin": [
"example-plugin",
"dshmarket@1.66.0",
"bad-plugin@<2.0.0",
{ "name": "risky-plugin", "version": ">=2.0.0", "mode": "deny", "reason": "2.x 会改数据格式" }
],
"mode": "crash",
"crash_on_install_attempt": true,
"guard_self_removal": true,
"watch_interval_ms": 5000,
"audit_log": true
}
名字可写包名、loader 行 id 或声明名;支持 name@version 与 semver 近似约束(= > >= < <= ^ ~ 等,不支持 || 与 - 区间)。版本拿不到时不算命中(fail-open),并在审计里记 policy-note;装完后的扫描会拿到确切版本再判。
2. 先用 warn 试名单¶
把全局 mode 设为 warn,观察 .allcrash/would-crash-*.txt 与 watch.log 里的 would-crash,确认命中对象后再改为 crash 或 deny。
3. 在 composition 里覆盖配置¶
需要某 profile 专用名单时(优先级高于全局 json,修改后需重启):
- insert:
- id: allcrash
name: 'dsh-plugin-allcrash'
config:
crash_plugin: ['dshmarket']
4. 崩溃后排查¶
默认 mode: crash 时,Host(Electron utility process)退出后 Desktop 可能提示 DSH Host exited (1); restart the application to reconnect。报告路径为 ${DSH_HOME}/crash-reports/allcrash-<本地时间>-<pid>.txt,内含 Detected、Plugin tree、Environment、Recovery 等段;审计可 grep ${DSH_HOME}/.allcrash/watch.log 中的 CRASH、would-crash、DENY。
适用场景与注意¶
适合谁:需要在团队或自用机器上把「绝不允许出现的插件」写成可审计、可拦截策略的管理员;与 DSH「一切皆插件」生态配合,用 Host 侧守卫补人工检查的缺口。
使用前请知悉:
- 插件以当前 DSH Host 进程权限运行,安装前请阅读 GitHub 源码 与 MIT 许可证,自行评估风险。
deny拦不住「已经加载」的被禁插件,此时仅warn或改回crash并卸掉违规插件。crash_on_install_log默认false;不经plugin_manager的安装通道需按需开启并了解 README「已知行为」说明。- SkillHub 目录页与 GitHub 由社区维护,与 DeepSeek / 幻方无官方从属关系;星标等元数据以各站点当时展示为准。
结尾¶
dsh-plugin-allcrash 把禁止插件名单变成 L1–L5 多层检测与可选 crash/deny/warn 响应,并在默认 crash 模式下用 fail-loud 与崩溃报告固定违规现场。若要查阅简介与分类,可打开 SkillHub 目录页;安装命令、配置字段与行为细节以 GitHub README 为准。