🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

手动批准 yknBugs/dsh-manual-approval

DeepSeek 客户端
yknBugs36 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

每次工具调用前弹卡片,由你逐项确认放行

28.4/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/11 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/yknBugs/dsh-manual-approval.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 36 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 8 处,展示前 8 条)
  • 发起网络请求
    lib/index.js:694
    outcome = await approval.request({
  • 发起网络请求
    lib/client.js:372
    return fetch(path, {
  • 发起网络请求
    lib/client.js:511
    void fetch(globals.endpoint, {
  • 发起网络请求
    lib/client.js:618
    fetch(globals.endpoint + '?key=' + encodeURIComponent(key), {
  • 写入本地文件
    lib/store.js:81
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    lib/store.js:84
    writeFileSync(temporary, `${JSON.stringify(normalized, null, 2)}\n`, 'utf8')
  • 写入本地文件
    lib/store.js:85
    renameSync(temporary, file)
  • 删除本地文件
    lib/store.js:88
    unlinkSync(temporary)
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 工具调用前弹卡片
  • 逐项确认放行

DeepSeek Harness 插件,新增一种权限:每次工具调用都先弹出审批卡片

README

由 DeepSeek 最新模型翻译生成
dsh-manual-approval(手动批准) 为 DeepSeek Harness 增加第四种权限模式:手动批准。任何工具调用——哪怕只是读文件、grep、glob、联网搜索——都会先弹出审批卡片。卡片上列出工具名、每个参数单独一行,以及一个可选的反馈输入框;你的决定是这次调用唯一的放行依据。 为什么需要它 官方三种模式各自替你做了取舍: | 模式 | 沙箱 | 审批 | | 仅可查看 | read-only | 按需 | | 可写入工作区 | workspace-write | 按需 | | 完全权限 | danger-full-access | 从不 | "按需"意味着由工具自己决定什么时候问,不问的工具直接执行;"从不"意味着完全不问。 手动批准补上的正是这个缺口:不由任何工具决定,每一次都由你决定,并且参数摆在眼前。 手动批准的行为 - 每次调用都要确认。 插件对手动批准会话中的所有工具调用返回 ask,且先于其它 pre-execute 监听器作答。 - 模型侧零改动。 不需要提权参数、不需要额外字段、不需要改变调用方式,工具参数与其它模式完全一致。 - 不做沙箱。 手动批准绑定 danger-full-access,因此被放行的调用拥有完全执行权限,包括修改工作区之外的内容。
展开完整文档(README 剩余 1 节)
dsh-manual-approval(手动批准)

为 DeepSeek Harness 增加第四种权限模式:手动批准。任何工具调用——哪怕只是读文件、grep、glob、联网搜索——都会先弹出审批卡片。卡片上列出工具名、每个参数单独一行,以及一个可选的反馈输入框;你的决定是这次调用唯一的放行依据。

为什么需要它

官方三种模式各自替你做了取舍:

| 模式 | 沙箱 | 审批 |
| 仅可查看 | read-only | 按需 |
| 可写入工作区 | workspace-write | 按需 |
| 完全权限 | danger-full-access | 从不 |

"按需"意味着由工具自己决定什么时候问,不问的工具直接执行;"从不"意味着完全不问。
手动批准补上的正是这个缺口:不由任何工具决定,每一次都由你决定,并且参数摆在眼前。

手动批准的行为

- 每次调用都要确认。 插件对手动批准会话中的所有工具调用返回 ask,且先于其它 pre-execute 监听器作答。
- 模型侧零改动。 不需要提权参数、不需要额外字段、不需要改变调用方式,工具参数与其它模式完全一致。
- 不做沙箱。 手动批准绑定 danger-full-access,因此被放行的调用拥有完全执行权限,包括修改工作区之外的内容。插件内没有任何平台相关代码,Linux / macOS / Windows 行为一致。
- 展示参数而非概括。 细节面板逐个参数一行;shell 工具还会显示模型自己写的那句操作说明(description)。
- 每次调用可选反馈。 你在反馈框里写的内容会拼接到该次调用的结果里:放行时作为提示,拒绝时作为拒绝理由——这样你的判断会出现在模型正在处理的那个位置。
- 失败即关闭。 关闭卡片、没有可用审批通道、审批出错,都意味着调用不会执行。

安装

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

从本地检出安装:

git clone <本仓库> dsh-manual-approval
dsh plugin --profile web add ./dsh-manual-approval
dsh --profile web --dump-config # 校验组合

重启该 profile,然后在权限选择器里选 手动批准(或执行 /permission manual)。

卸载:

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

安装会改变什么

本包自带 cordis.patch.yml(由 dsh.bundle.patch 声明),因此安装即生效,你无需手改宿主组合。补丁做两件事:

1. 重新发布 permission 预设表并加入 manual,且放在第一位,让选择器把它显示在最前;
2. 插入本插件的宿主半。

兼容性说明。 第 1 条为保证表完整而重述了内置预设。若未来 Harness 增加第五种内置预设,需要同步更新该文件。卸载插件时这份补丁会一并移除。

自定义自动放行规则

当权限模式为「手动批准」时,每次调用先按你配置的规则列表顺序判断,第一条匹配的规则决定结果;没有任何规则匹配时,才弹出常规审批卡片。

规则 = 若干条件(全部满足,逻辑与)+ 一个动作。

每个条件选择一个匹配对象和一个正则表达式:

| 匹配对象 | 正则作用在哪 |
| 工具名称 | 整个工具名,例如 ^pwsh$ |
| 参数名称 | 逐个参数名,例如 ^(command\|cmd)$ |
| 参数值 | 逐个参数值,例如 rm\s+-rf |

因此写条件不需要转义 JSON:file_path 匹配的是参数名,C:\Users 匹配的是路径值。

| 动作 | 效果 |
| 放行 | 立即执行,不弹窗 |
| 拒绝 | 不执行,理由返回给模型 |
| 审批时附加警告 | 仍然问你,但在卡片里用红色显示你写的内容 |
| 联网判断 | 把调用 POST 到你的服务,按返回结果决定 |

兜底规则:一个条件(对象=工具名称,正则=.*)+ 动作=放行,放在第一条,就能让手动批准完全等价于「完全访问」。这是刻意保留的逃生口,也是规则必须可排序的原因。

理由文本与捕获组

规则的理由/警告里可以用 $1、$2… 或 ${12} 引用捕获组,$$ 表示字面量 $。捕获组在 整条规则的所有条件之间全局顺序编号(条件从上到下、每个正则从左到右),设置界面会在每个正则旁边直接显示它对应的组号,不必自己数。

捕获值取自把整次调用合成的那个 JSON 文档,因为一个被捕获的参数可能来自调用的任何位置:

{"cwd":"<会话工作目录>","<工具名称>":{"<参数名称>":"<参数值>", ...}}

cwd 只在会话确实报告了工作目录时出现,并且固定排在第一位。没有 {cwd} 占位符需要你写:它就是文档里的一个普通字段,正则照常匹配即可。

所以 "command":"([^"]+)" 这样的模式即使所在条件的对象是参数名称,也能捕获到命令文本。
某个模式在该文档上不匹配时,它对应的组取空字符串。

自动拒绝与手写拒绝无法区分

规则的拒绝走的是和你在审批弹窗里手填拒绝理由完全相同的格式化函数,因此模型无法分辨某次拒绝是规则自动产生的还是你现场写的。工具结果里没有任何「自动拒绝」标记。

联网判断

联网判断跑在宿主进程里,不在前端。这一点很重要:Node 没有同源策略,所以 http://127.0.0.1:…、纯 http 内网服务、或不带 CORS 头的端点都能正常调用;浏览器 fetch 会因 CORS 与混合内容失败,而把请求交给页面去代发等于把宿主变成开放代理。

- 默认 POST + content-type: application/json;方法、请求头、请求体都可改。
- 请求体默认就是上面的合成 JSON;覆盖时同样可用 $1、$2…。
- decisionPath(必填)与 reasonPath(选填)是响应 JSON 的点/方括号路径,例如
result.decision、choices[0].verdict。
- 决定值只能是 "approve"、"deny"、"ask",分别对应放行、拒绝、附加警告。
- reasonPath 取到的字符串是字面量,不经过捕获组替换。
- 任何一步异常——主机不可达、非 2xx、返回体不是 JSON、路径不存在、取值不是上述三者、超时、返回体过大——都回退为红色警告并显示具体错误,调用仍然交给你判断。联网判断只能"多问一次", 永远不会失败放行。
- 写在 URL 里的凭证(http://user:pass@host/)会从所有消息、警告与日志中剥离。注意 Node 的 fetch 本身会直接拒绝带凭证的 URL,所以请改用请求头传 token。

规则存放在 <DSH_HOME>/manual-approval/rules.json,原子写入,每次读取时重新编译。语法错误的规则会被保留在磁盘上并在设置页报出具体原因,而不是被静默丢弃,且在修正前无法启用。另有总开关可一次性停用全部规则。可直接改用的示例见 examples/,其中包含针对灾难性递归删除的警告规则。

私有通道的安全性

反馈框与设置页需要一条客户端→宿主通道,而官方审批结果词汇表只有 4 个固定字符串、装不下文本,因此本插件新增了一条私有回环 HTTP 路由。

这条路由暴露什么、不暴露什么:

- 注入到页面里的只有两个值:一个进程级随机 token 和一条固定路由路径。本插件 从不向浏览器发送模型/供应商凭证、API key、环境变量、会话内容或任何 Host 对象。
- 路由同时要求回环地址与 token。需要 token 是因为 DSH 的 web 服务器可能绑定 0.0.0.0;没有它,同网段的其它机器就能伪造审批反馈或改写你的规则。
- 它在宿主与它自己提供的页面之间搬运短字符串和规则文档:不读取 <DSH_HOME>/manual-approval/ 以外的文件、不碰凭证、不回显任何 Host 状态。
- 联网判断的 URL 与请求头只存在于宿主,浏览器完全不知道。
- 调用结束后条目即删,并按时间自动清扫。

若你的组合里没有 webServer,插件仍然照常拦截每次调用、规则也照常生效,只是反馈投递与设置页不可用。

手动批准不做出的承诺

- 它不是判定器。 手动批准不对"这次调用危不危险"发表意见,它只保证有人看过。不看就点同意是这套设计唯一无法阻止的失效方式。
- 弹窗不能替代阅读。 这里的全部价值就在于点击之前参数已经逐行列好了。
- 提权参数只是可选强制。 手动批准下 sandbox_permissions / justification 没有意义。
在插件配置里设 strictGuard: 'bypass-guard' 可让仍然携带这两个字段的调用直接被拒。
- 进程外代理不在边界内。 Codex、ACP、SDK 供应商运行自己的工具循环与权限控制。
- 其它宿主插件的直接 Node 文件操作不经过 ctx.tools,因此不受本插件管辖。

配置

全部可选,写在宿主那一行:

- id: manual-approval
name: 'dsh-manual-approval'
config:
presetName: manual # 触发本策略的预设键 feedbackPath: /dsh-manual-approval/feedback # 反馈用的回环路由 strictGuard: 'off' # 或 'bypass-guard' debug: false # 打印每次决定

设计

接口与决策顺序、以及为"用户自定义自动规则"预留的扩展点,见 DESIGN.md。

许可证

MIT
预览分享卡片长什么样 ↓yknBugs/dsh-manual-approval
分享 · DeepSeek Harness Hub
yknBugs/dsh-manual-approval

每次工具调用前弹卡片,由你逐项确认放行

回到顶部