前言¶
在 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'] 则仅在该预设下生效,不匹配时插件完全不动作。
流程要点:
- 只接管 shell 类工具的
command参数(默认含bash、win_bash、pwsh等,可配shellTools)。 - 命中
allowPatterns直接放行。 - 内置破坏性规则预筛:不命中则零 token、零延迟放行。
- 命中则用
temperature: 0做一次窄审查;destructive: false放行,destructive: true则按审批策略ask弹窗或never拒绝。 - 同一会话相同命令在
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