dsh-approval-memory:把 DSH 审批请求记下来,再按类决定是否自动同意

前言

用 DSH 跑智能体时,会持续遇到要人确认的请求:装插件、列插件、切沙箱、写文件。每次都弹窗点「同意」,久了要么麻木点满,要么干脆不装不用。痛点不是没有确认机制,而是确认时缺少上下文:这个请求之前出现过几次、属于哪一类、风险等级如何。

下面要介绍的插件 dsh-approval-memory(简称 DAM)就是做这件事的:它在当前 profile 内记录每一次 approval/asked 与 approval/decided,把请求归到相对稳定的类里,显示次数、风险和最近出现时间,并允许用户对低风险只读类打开自动同意开关。

这是什么

DAM 是一个 profile 级的 DSH Host + Client 插件,维护者为 TMrazbw,分类属于 admin-security,在社区插件目录 skillhub.cn 上有独立条目。它不改动 DSH 核心、不引入自定义 session 事件类型,只用公开事件与公开服务。

它要解决的问题是:把「哪些请求我反复同意过」这类信息从一次性弹窗里捞出来,变成可查看、可审计、可逐类开启的规则;同时把高风险类固定留在人工确认一侧。它的一个明确边界是,自动同意只发一次性授权,仍然返回 allowed-once,不复用为长期放行。

核心能力

按一次安装后实际会拿到的东西写:

1、采集。从当前 profile 下每个 session 收集 approval/asked 与 approval/decided 事件。

2、归类。请求被归到稳定的类名,例如 plugin_manager:list_bundles、bash:sandbox:danger-full-access。

3、展示。面板列出请求名、操作、次数、风险、最近一次出现时间;统计按观察到的频率排序,主表突出展示已自动同意的次数。

4、不可逆动作标记。force-push、deploy、data-delete、send-message 只在展示与审计时打标签,不会影响自动同意。

5、逐类开关。低风险只读类可以单独打开自动同意。

6、会话内路径信任。这是只在当前对话里生效、重启即清的特性:

  • 非敏感路径的 read 请求直接自动同意;
  • 敏感路径先保持人工;一旦某条精确路径被同意过一次,该 session 内就信任这条路径;
  • 手工同意一次某个 write / edit,只信任该 session 下的这个文件;
  • 不做父目录继承,也不做 shell 信任。

7、不可自动同意的统计区。一个可折叠的「no auto-approval」分区,里面分两组:一组是其他已观察到但无法切换的类(带命令预览、风险标签、目标、cwd);另一组是永久黑名单(只读计数,无开关,不可生成规则)。

8、重复拒绝提示。对最近一条命令的哈希,如果出现重复拒绝,会从保留的审计事件里查出并提示;保留窗口不是固定的 30 天,保留窗口可能更短。

9、结果近似统计。从 tool/result 事件里近似统计自动同意后的结果,分为 ok / error / no-result。

10、审计。自动同意过的请求会写入审计日志。

11、入口。侧边栏面板、/dam-ui 命令,以及支持自然语言打开面板的 agent 工具 open_dam_ui。面板打开时才加载数据,也提供手动刷新;长表格支持横向和纵向滚动。

安装与启用

在 DSH Web session 里,把它作为 profile bundle 安装:

plugin_manager
  action: install_bundle
  target: https://github.com/TMrazbw/dsh-approval-memory

或者用 DSH CLI:

dsh plugin --profile <profile> add https://github.com/TMrazbw/dsh-approval-memory

这一步需要审批授权;是否需要重启取决于该 profile 的 HMR 配置。插件面向公开的 DSH 0.2.x 插件与事件 API,README 写明在 DSH 0.2.1-rc.2 上验证过,其他版本的 API 变化可能需要自行调整。

典型用法

装好之后:

1、从左侧边栏打开「自动同意请求」,或在命令里输入 /dam-ui;

/dam-ui

2、也可以直接对 agent 说「我要看 DAM 的界面」或「open the DAM UI」,agent 会调用 open_dam_ui;

3、面板只会列出真实出现过、且可以自动同意的类;黑名单和中高风险类只计数,不出现在可切换表格里,黑名单另有只读分区;

4、在需要放开的低风险只读类上打开开关即可;

5、「关闭全部自动同意」会停掉所有已知规则,但不会关闭面板;

6、「返回对话」关闭面板并回到对话。

命令名是小写:输入命令为 /dam-ui,侧边栏菜单标签是 DAM-UI。

默认自动同意的范围

V1 默认对以下低风险只读类开启自动同意:plugin_manager:list_plugins、plugin_manager:list_bundles、plugin_manager:list_version_exemptions、plugin_manager:inspect(当前 DSH 暴露该操作时才生效)。除此之外都偏保守:

类 行为
plugin_manager:set_plugin / set_bundle 展示,开关禁用(中等风险)
plugin_manager:install_bundle / remove_bundle 仅统计
plugin_manager:set_version_exemption 黑名单,永不自动同意
bash / pwsh 沙箱升级 仅统计
write / edit 沙箱升级 仅统计
bash / pwsh / write / edit 完全访问 黑名单
unknown / MCP / PTC 仅统计

风险标签是静态推断出来的,README 明确说明这不是安全保证。

作用范围与数据目录

插件作用于安装了它的当前 DSH profile 下的所有 session;subagent session 会被计数,但默认对 subagent 关闭自动同意。其他 profile、其他进程、以及安装之前产生的请求都不在覆盖范围内。

数据默认落在 %DSH_HOME%/approval-memory:

%DSH_HOME%/approval-memory
  classes.json
  rules.json
  events.jsonl
  _plugin.log

可选配置有四项:

dataRoot      默认 %DSH_HOME%/approval-memory  数据目录
maxEvents     默认 5000                          保留的审计事件数
maxExamples   默认 3                             每个类保留的示例数
includeSubagents  默认 false                     允许在 subagent session 中自动同意

另有一个环境变量覆盖入口:DSH_APPROVAL_MEMORY_ROOT。

安全边界

这部分值得在采用前读完:

  • 自动同意是用户主动打开的规则,不是插件推断「用户应该会同意」。
  • 重复请求不会自动生成规则;V1 从不把重复出现当作同意。
  • 只要某个请求类有过拒绝记录,就可以被检视。
  • 黑名单由代码持有,无法通过 UI 或 API 移除。
  • open_dam_ui 只负责打开面板,不会改任何规则。
  • 面板走带鉴权的 connection.fetch 路由:GET /api/approval-memory.snapshot 与 POST /api/approval-memory.mutate(支持 setRule 与 closeAll)。

需要多说一句的是:插件以当前 DSH 进程的权限运行,自动同意因此继承会话已有的授权范围。安装前应当读一遍源码、确认许可协议,再决定是否打开任何自动同意开关。

代码结构与测试

插件不需要构建步骤,只用公开事件/服务与浏览器模块加载器。README 给出的目录大致是:

index.js           Host 入口
client.js          Client 入口:面板、侧边栏、/dam-ui、open_dam_ui
lib/classes.js     请求类目录
lib/blacklist.js   永久拒绝列表
lib/extract.js     callId、tool-call、command/cwd、reason 提取
lib/format.js      计数、时间、脱敏
lib/store.js       文件持久化
lib/host.js        审批运行时
lib/path-trust.js  session 内路径归一化与敏感路径判定
lib/command-risk.js 命令风险启发式
test/              136 个 Node 测试
locale/            en / zh 展示元数据

跑测试:

node --test --test-isolation=none

README 写明当前测试集是 136 个,覆盖分类、提取、脱敏、存储、Host 运行时、数据桥接、Client 注册、命令风险解析、路径信任、结果跟踪和集成流程。

适用场景与注意

适合这类人:DSH 会话里审批请求数量已经偏多,且需要可追溯的审计记录;希望把「只读列举类」的重复确认放开,同时不愿意放开写操作和全权命令。

不适合期待它做决策代理的场景:它不替代人工判断,风险标签是静态推断;自动同意按类单发,不提供长期放行;路径信任局限在单个 session,重启即消失。

其他两点:插件记录的是 profile 内发生过的请求,不会跨 profile 或跨进程;黑名单元数据也说明它不能用来放开某些被固定禁止的类。许可协议为 MIT。

结尾

DAM 的价值在于把审批请求从「每次弹窗」变成「有类、有次数、有风险标记、可逐类开关、可审计」的记录,同时把手伸得较短:只放开默认白名单里的只读列举类,其余进统计或黑名单。它不改变 DSH 核心,也没有自定义事件,接的是公开 API。

目录页:https://www.skillhub.cn/plugins/TMrazbw/dsh-approval-memory

GitHub:https://github.com/TMrazbw/dsh-approval-memory

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

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

小夜