前言¶
在 DeepSeek Harness(DSH)里跑 Agent,有时不得不把会话开到 danger-full-access:沙箱会限制 pwsh 等工具,完全权限则意味着没有硬边界,模型可能在一轮对话里连续写文件、执行命令、派发子代理,试错成本直接变成 token 和磁盘变更。DSH 自带沙箱负责「这件事能不能做」;本插件回答的是另一件事——「这一轮已经做了多少持久化操作」,并在额度用尽后提醒、注入停止指令,最后在硬上限处走审批通道索要用户确认。下面介绍 SteelUnion 维护的 dsh-confirm-gate(npm 包名 @sroada/dsh-confirm-gate,当前 v0.1.2),以及如何在 profile 里启用与调参。
这是什么¶
dsh-confirm-gate 是 DSH 运行时插件,维护者为 SteelUnion,在 SkillHub 插件目录 分类为 admin-security。它在工具派发层挂 tools/pre-execute、tools/post-execute 与 agent/pre-step,对每轮对话维护独立的持久化操作计数:前若干次只注入提醒,超过免确认额度后注入「立即停止」类指令,达到硬上限时返回 ask 索要 confirm。文档明确说明:这不是安全边界,而是成本边界与方向纠偏;防恶意模型或提示注入应依赖 DSH 的 sandbox 与审批通道,本插件与沙箱互补,在沙盒或只写工作区模式下会自动让位、不计数。
兼容性:在 DSH 0.2.0-rc.2 上开发并验证,peerDependencies 要求 @deepseek-ai/dsh 与 @deepseek-ai/dsh-tools 均为 >=0.2.0-rc.2。若未来 DSH 改动插件绑定的钩子,设计上会明确报错而非静默失效。
核心功能¶
三档行为与 confirm 放行¶
每轮开始时计数归零(默认在新用户消息时重置)。用户消息中含配置的 confirmWord(默认 confirm,大小写不敏感)时,整轮放行:不计数、不提醒、不拦截。
| 计数区间(默认 freeLimit=10,hardLimit=15) | 行为 |
|---|---|
| 1 ~ freeLimit | 放行,注入提醒文案 |
| freeLimit+1 ~ hardLimit-1 | 放行,注入停止指令 |
| >= hardLimit | { kind: 'ask' },走审批索要 confirm |
读文件、grep、glob、web-fetch 等非持久化工具永不计数。写文件、edit、subagent、message-send 等按工具名判定为持久化;pwsh / bash 等则根据命令内容与白名单比对(只读 PowerShell cmdlet 不计数,重定向、git、node 等计为持久化)。一次工具调用计 1 次,不论触及多少文件。
作者在 Windows 真机上验证:默认阈值下模型在第 11/15 次收到停止指令后自行停手并索要 confirm;权限在会话中热切换 danger-full-access → workspace-write → read-only → 再回完全权限时,插件无需重启即可在沙箱模式下沉默、回到完全权限后恢复计数。
沙盒模式下自动让位¶
每次工具调用时读取当前沙箱模式(优先 ctx.sessionProjections.stateOf(session, 'permissions').sandbox,回退 ctx.shell.sandboxMode)。read-only、workspace-write 下不计数;danger-full-access、custom 或无法读取模式时计数(读不到时倾向生效,避免「装着插件却完全静默」)。
安装与启用¶
仓库 dist/ 提供可直接安装的包;官方安装方式为本地路径复制(file: 为复制而非符号链接,改源码后需 remove 再 add):
# <插件目录> 换成你本地的插件目录(含 package.json 与 cordis.patch.yml)
dsh plugin --profile <desktop|web> add file:<插件目录>
桌面 GUI 通常使用 profiles\desktop,dsh.cmd web 使用 profiles\web。装错 profile 时 --dump-config 能看到配置但插件不会加载;可先查进程命令行确认实际 profile。
超限时要让 ask 生效,需在 profile 的 cordis.patch.yml 里把完全权限预设的 approval 设为 ask(never 会把 ask 拒成 deny):
- id: permission
name: "@deepseek-ai/dsh-permission-presets"
config:
presets:
danger-full-access:
sandbox: danger-full-access
approval: ask
插件以当前 DSH 进程权限运行;安装前请自行查看 GitHub 源码 与 MIT 许可证,勿将未审阅的第三方插件当作唯一防护。
典型用法:在 profile 里调阈值¶
所有可调参数写在 profile 的 cordis.patch.yml,通过插入插件条目并传入 config。约束:hardLimit > freeLimit,否则启动时报错。
# ~/.dsh/profiles/<你的profile>/cordis.patch.yml
- insert:
- id: confirm-gate
name: "@sroada/dsh-confirm-gate"
config:
freeLimit: 0 # 零容忍:第一次持久化操作前就进入后续档位
hardLimit: 3
confirmWord: 批准
warningText: 停。无批准不得动写操作,先汇报。
常用字段(默认值见官方 README):freeLimit(默认 10)、hardLimit(默认 15)、confirmWord、reminderText、warningText、askReason,以及 include / exclude 工具名通配、resetOnUserMessage(默认 true)。
验证是否真正加载:--dump-config 不够;可将 lib/index.js 内 DEBUG_PROBE 改为 true 后重装并重启,在系统临时目录查看 confirm-gate-boot.log,出现 [enter] pre-execute 表示钩子已接通。
适用场景与注意¶
| 场景 | 是否适合 |
|---|---|
| 已给完全权限,担心无限试错烧 token | 适合 |
| 希望写满 N 次后再向用户确认 | 适合 |
| 读、搜索、联网查询不被打断 | 适合(非持久化不计数) |
| 当作防恶意模型的沙箱 | 不适合,用 DSH sandbox |
| 非 DSH 的 Agent 框架 | 不适用 |
使用前请知晓文档列出的局限:默认前 10 次仅有提醒、无硬闸;confirm 防的是可信用户场景下的误操作而非注入;含识别语即整轮放行,讨论中误触识别语也会放行;命令判定为名称比对,可能多计不会漏计;subagent 计在主 Agent 上。插件零外部依赖,作者估算开发本插件约 0.27 USD 模型花费(见仓库 dist/COSTS.md)。
结尾¶
dsh-confirm-gate 在不得不使用完全权限时,用每轮计数和分档提醒让模型有机会自行刹车,并在硬上限处把决定交回用户,与 DSH 沙箱分工明确。目录页:SkillHub — dsh-confirm-gate;源码与中文说明:GitHub — SteelUnion/dsh-confirm-gate。