dsh-manual-approval:为 DeepSeek Harness 增加「每次工具调用都需人工确认」的权限模式

前言

在 DeepSeek Harness(DSH)里跑智能体时,工具调用是否执行、何时弹审批,往往由内置权限模式替你做了取舍。Read Only 与 Workspace Write 是「按需审批」——具体工具可以自己决定要不要问;Full access 则是「从不审批」。若你希望每一次工具调用(包括读文件、grep、glob、联网搜索)都先看到完整参数再决定放行,内置三种模式都填不上这个缺口。下面介绍社区插件 dsh-manual-approval(维护者 yknBugs,分类 admin-security),它为 Harness 增加第四种预设:Manual。

这是什么

dsh-manual-approval 是一个 DeepSeek Harness 插件:在 Manual 会话中,所有工具调用在真正执行前都会先返回 ask,弹出审批卡片;只有你确认后调用才会继续。插件通过 bundle 补丁扩展权限预设表,不改动模型侧的工具调用形状——参数与在其他模式下字节级一致。安装后需在权限选择器里选 Manual,或执行 /permission manual。

与内置三种模式的对比

模式 沙箱 审批
Read Only read-only 按需
Workspace Write workspace-write 按需
Full access danger-full-access 从不
Manual(本插件) 无(捆绑 danger-full-access) 每次

「按需」表示由工具自行决定是否询问,不询问则立即执行。Manual 则不由单个工具决定——每一次都由你在卡片前做决定,且参数逐行展示,不做摘要式省略。

核心功能

每次调用先确认

在 Manual 为当前模式时,插件对所有工具调用在其它 pre-execute 监听器之前返回 ask。Shell 类工具还会在详情里展示模型填写的一行 description(说明这条命令在做什么)。

可选反馈写入结果

审批卡片上有可选反馈框。允许时,你输入的内容作为备注附在该次调用结果上;拒绝时,同样内容作为拒绝理由回传给模型,便于在「正在执行的那一步」传达你的判断。

失败即关闭(fail closed)

关闭卡片、没有审批路径或审批出错,均不会执行该次调用。

自动规则(Settings → Manual mode rules)

Manual 激活时,每次调用先按你配置的有序规则列表匹配;第一条命中规则生效,无匹配则走普通审批卡片。

规则由若干 条件(全部满足)加一条 动作 组成。每个条件选一个目标并用正则匹配:

目标 正则匹配对象
Tool name 完整工具名,例如 ^pwsh$
Parameter name 各参数名,例如 ^(command\|cmd)$
Parameter value 各参数值,例如 rm\s+-rf
动作 效果
Allow 立即执行,不弹窗
Deny 不执行,理由按与手动拒绝相同的格式回传模型
Warn at approval 仍弹窗,卡片中以红色展示你配置的提示文案
Network judge 将调用 POST 到你配置的端点,按响应裁决

规则可排序。若放一条「工具名 .* + Allow」的兜底规则且排在最前,Manual 在行为上可等同于 Full access,作为逃生口。

规则拒绝与你在卡片里手写的拒绝走同一格式化路径,模型侧无法区分是否来自自动规则。

Network judge

裁决在 Host 进程中发起(非浏览器),因此 http://127.0.0.1:…、内网 HTTP、无宽松 CORS 的端点均可使用。默认 POST、content-type: application/json,请求体为整次调用的合并 JSON 文档(含可选的 cwd 与各工具参数)。响应中通过 decisionPath(必填)读取 "approve"、"deny" 或 "ask";可选 reasonPath 取理由字符串。任意失败(不可达、非 2xx、JSON 无效、路径缺失、超时等)会显示具体错误并仍回到人工审批,不会 fail open。

界面语言

审批面板与规则设置页通过 DSH 的 ctx.locale 注册英文与简体中文,跟随 Settings → General → Language,切换后无需重载即可换文案。规则里的正则与 JSON 字段名保持技术原文。

安装与启用

安装会添加包、将插件链入 profile,并应用 bundle 补丁;新预设与 Host 侧逻辑在下一次 profile 启动后生效,安装后需重启 dsh web(或你的 profile)。

官方安装命令:

dsh plugin --profile web add dsh-manual-approval

从本地 checkout 安装时(需自行 clone 仓库到本地目录):

git clone <this repo> dsh-manual-approval
dsh plugin --profile web add ./dsh-manual-approval
dsh --profile web --dump-config   # verify composition

卸载:

dsh plugin --profile web remove dsh-manual-approval

验证 composition 时可查看 dsh --profile web --dump-config 输出中是否存在 manual-approval 行,以及 id: permission 是否由 dsh-manual-approval 打过补丁。插件自带 cordis.patch.yml,无需手改 Host 组合;卸载插件会一并移除补丁。

典型用法

  1. 按上文命令为 web profile 安装插件并重启 DSH Web。
  2. 在权限选择器中选择 Manual,或会话内执行 /permission manual。
  3. 智能体发起任意工具调用时,在卡片中查看工具名与各参数行,选择允许或拒绝,必要时填写反馈。
  4. 若重复性操作较多,在 Settings → Manual mode rules 中增加 Allow / Deny / Warn / Network judge 规则并调整顺序;需要完全放开时可使用 catch-all Allow 规则(需自行评估风险)。

开发者在仓库内可用以下命令做离线与启动验证(摘自 README):

npm test
npm run test:boot

适用场景与注意

适合谁: 需要在 DSH 中做高可控审计、培训演示,或在不完全信任默认「按需审批」策略时,希望逐次过目参数再放权的使用者与团队。

权限与沙箱: Manual 捆绑 danger-full-access,没有沙箱;一次被批准的调用具备完整执行权限,包括工作区外写入。插件无平台特化代码,Linux、macOS、Windows 行为一致。

安全与信任: 插件以当前 DSH 进程权限运行;Network judge 会向你所配 URL 发送调用详情。安装前应阅读 GitHub 仓库 源码与 MIT 许可证,并理解 bundle 补丁会改写权限预设表(若未来 Harness 增加第五条内置预设,该补丁文件需随版本更新)。

环境: package.json 要求 Node ^22.19.0 || >=24.0.0;peer 依赖 @deepseek-ai/cordis ^4.0.2(optional)。当前包版本为 0.1.0。

生态说明: DSH 采用「一切皆插件」的扩展方式;社区目录站点与 DeepSeek / 幻方无官方从属关系,本插件来自社区维护者 yknBugs。

结尾

dsh-manual-approval 在 Harness 内置三种权限模式之外补上 Manual:每次工具调用先过审批卡片,参数透明、可附反馈,并可用有序规则与 Network judge 做自动化折中。若你要在 Web profile 里启用,记住安装后重启 profile,并用 dump-config 核对补丁是否生效。

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

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

Xiaoye