dsh-loose-review:为破坏性 shell 命令加窄审查与执行期熔断

前言

在 DeepSeek Harness(DSH)里让智能体跑 shell,常见 tension 是:需要「完全访问」才能把活干完,又怕一条 rm -rf 或误操作 git 把 workspace 或本地数据清掉。官方实验性的 Auto 预设会对每一次工具调用做较宽审查,token 成本和误拦都偏高。社区维护者 IFIAnder 的 dsh-loose-review 走另一条路:只对命中规则的破坏性候选命令做一次窄模型判断,放行后若监控目录内文件净删过多还会执行期中止,并可做成权限选择器里的独立预设「自动审查(宽松)」(key:loose-review)。

这是什么

dsh-loose-review 是 DSH 的 Cordis 插件(分类 admin-security),仓库 IFIander/dsh-loose-review,当前 package 版本 1.2.0,MIT 许可证。它给删除等破坏性 shell 命令加两道闸:执行前用当前会话的 provider/model 判断会不会造成严重且不可逆破坏;执行中轮询工作目录文件数,超过阈值则 abort 并可选弹审批后重跑。

判据刻意很窄:只看命令执行下去的后果,不看动机、授权、是否该用别的方式。不确定时默认倾向放行;审查失败时默认也是放行(可配 deny)。与官方 @deepseek-ai/dsh-experimental-auto-review(Auto 预设)并列:选 loose-review 时只有本插件介入,选 Auto 时本插件让位(skipWhenAutoPreset: true)。

核心功能

执行前审查

受 presets 控制:默认为空数组表示所有权限预设下都介入;填 ['loose-review'] 则仅在该预设下生效,不匹配时插件完全不动作。

流程要点:

  1. 只接管 shell 类工具的 command 参数(默认含 bash、win_bash、pwsh 等,可配 shellTools)。
  2. 命中 allowPatterns 直接放行。
  3. 内置破坏性规则预筛:不命中则零 token、零延迟放行。
  4. 命中则用 temperature: 0 做一次窄审查;destructive: false 放行,destructive: true 则按审批策略 ask 弹窗或 never 拒绝。
  5. 同一会话相同命令在 cacheTtlMs(默认 5 分钟)内只审一次。

判成破坏时,展示给用户的理由固定为简体中文(prompt 约束 + 英文兜底替换 + audit.jsonl 留痕 reasonRewrittenFrom)。

执行期熔断

命令被放行并开始运行后,插件轮询会话工作目录(或 guardPaths)内的文件数;净减少超过 deletionThreshold(默认 200)则 abort 子进程。轮询间隔默认 250ms;跳过 node_modules、dist、.git 等(guardIgnore)。熔断后会弹审批:同意则命令重跑且本次不再装熔断器;拒绝则保持中止。审批策略为 never 的预设下 DSH 不会弹框,想要确认框需处在 ask 策略的预设(如本插件自带的 loose-review 配置)。

局限:命令 cd 到未监控目录再删则监控不到;防的是「删得多」而非「删得准」。

与官方 Auto 的对比(摘要)

Auto review(官方实验) 自动审查(宽松)· 本插件
启用 权限选择器选 Auto 选「🛡️ 自动审查(宽松)」
审查范围 每个工具调用 仅规则命中的破坏性候选命令
判据 破坏性 + 授权 + 范围等 仅严重不可逆后果
默认倾向 中等风险需明确授权 不确定就放行
Token 每次调用一次 仅命中规则时

安装与启用

需要带 cordis.patch.yml 插件机制的 DSH(当前桌面版满足)。安装命令以仓库 README 为准:

dsh plugin add IFIAnder/dsh-loose-review

包内 cordis.patch.yml 会注册插件;默认在所有权限预设下生效,且只在可能毁数据的命令上介入。

若要做成选择器里的独立预设,在 profile 的 cordis.patch.yml 里为 permission 服务增加预设,并把插件 presets 设为 ['loose-review']:

- id: permission
  name: "@deepseek-ai/dsh-permission-presets"
  config:
    presets:
      loose-review:
        sandbox: danger-full-access
        approval: ask
        name: "🛡️ 自动审查(宽松)"
        description: 完全访问;删除等破坏性命令先由模型判断会不会造成不可逆破坏,判定破坏时询问你。
    defaultPreset: loose-review
- insert:
    - id: destructive-command-review
      name: './plugins/dsh-loose-review/index.js'
      config:
        presets: ['loose-review']

自定义预设名里的 emoji 是为弥补 DSH 权限选择器未给第三方预设硬编码 SVG 图标的设计取舍。改 permission 等核心服务时建议一次改完并等热重载完成,避免连续快速保存导致插件树 inactive。

手动挂载路径示例:

~/.dsh/profiles/<profile>/plugins/dsh-loose-review/

并在 profile 的 cordis.patch.yml 中 insert 指向 ./plugins/dsh-loose-review/index.js。

典型用法与自检

前提: 若配置了 presets: ['loose-review'],当前会话权限预设必须是「自动审查(宽松)」;选「完全访问」时插件按设计不介入。

无害删除自检(10 秒内 audit.jsonl 应出现 "destructive": false):

D=$(mktemp -d /tmp/dcr-check-XXXXXX) && echo hi > "$D/a.txt" && rm -rf "$D"

明显破坏性示例(在非 git 目录执行无害前提下,在 /tmp 等环境测试;应弹审批「破坏性命令审查:…。是否仍然执行?」):

cd /tmp && git reset --hard HEAD~1

常用配置片段(写在插件条目的 config: 下,保存后约 5–10 秒热重载):

        presets: ['loose-review']
        onDestructive: auto
        failureMode: allow
        guardDeletions: true
        deletionThreshold: 200
        allowPatterns: ['rm\s+-rf\s+node_modules']
        promptAppend: |
          这个项目里 build/ 和 dist/ 可以随便删,一律判 false。

审计与诊断:plugins/destructive-command-review/audit.jsonl;加载痕迹 loaded.json;需要时可开 trace: true 写 trace.log。本插件未附 client 包,配置目前通过 cordis.patch.yml 修改,而非 DSH 自带插件设置页。

适用场景与注意

适合:已在用 DSH 做 agent 开发、希望保留「完全访问 + 询问」手感,又只想在真正危险的 shell 上多花模型成本,并希望对「误删大量文件」多一道执行期止损的人。

安装前请自行查看 GitHub 源码 与 MIT 许可证;插件以当前 DSH 进程权限运行,第三方插件与 DeepSeek / 幻方无官方从属关系,社区目录 SkillHub 插件页 为独立生态站点。

卸载:删除 cordis.patch.yml 里对应 insert 条目,重启 DSH,再删插件目录。

结尾

dsh-loose-review 把 DSH「一切皆插件」的思路落在 admin-security:窄判据、规则预筛省 token、执行期熔断补盲区,并可与官方 Auto 预设二选一。目录与源码:

  • https://www.skillhub.cn/plugins/IFIAnder/dsh-loose-review
  • https://github.com/IFIAnder/dsh-loose-review
羽毛球分组比赛记分
小程序二维码

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

小夜