dsh-confirm-gate:在完全权限下给 Agent 持久化操作加计数与刹车

前言

在 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。

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

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

Xiaoye