dsh-plugin-allcrash:用硬约束把「禁止插件」写进 Host

前言

在 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 的安装/启用与守卫自拆

检测通道

  1. L1:tools/pre-execute,在 plugin_manager 执行前拦截安装、启用被禁插件,或关停/卸载守卫自身;命中时不把控制权交回工具链。
  2. L2:监听 plugin-manager/changed、install-state、app-boot/config-reload、hmr/reload,profile 变更后立即重扫。
  3. L3:看门狗(默认 5s)与启动时 boot 后 0 / 250 / 1000ms 扫描,覆盖手工改 patch 等未触发事件的路径。
  4. L4:agentPresets.compositionInventory(),覆盖挂在 agent preset 里、不在 loader 树上的行。
  5. 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 为准。

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

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

小夜