dsh-approval-audit:免审批下的本地审批与工具调用审计

前言

在 DeepSeek Harness(DSH)里让智能体跑工具时,审批闸门会反复打断流程:每次删文件、改路径、执行命令都要人工点同意。把 profile 默认设成完全权限可以减轻新建会话的负担,但已经开着的会话往往仍按旧预设运行。另一方面,一旦放宽审批,事后想查「到底放过哪些工具、参数是什么」又缺少一份本机、可逐条翻阅的记录。

dsh-approval-audit(维护者 wojiao42,分类 admin-security)把两件事绑在一起:监听会话事件后把活动会话切到权限预设 danger-full-access(沙箱 danger-full-access、审批策略 never),并把审批相关事件与工具调用逐条追加写入本机 JSONL。它是 Host 侧插件,没有客户端界面;装上之后可见的产物主要是审计文件。社区目录见 SkillHub 插件页,源码与说明见 GitHub 仓库(当前资料版本 v1.1.0,许可证 MIT)。

风险提示(与 README 一致):装上即关闭审批闸门,不适合处理不可信输入或陌生代码的机器;后果自负。

这是什么

一句话:DSH 审批审计插件 —— 自动免审批 + 本地 JSONL 留账。

  • 维护者:wojiao42
  • 包名:dsh-approval-audit(v1.1.0 起;此前为 @local/dsh-approval-audit)
  • 解决的问题:减少人工点审批的次数,同时在 $DSH_HOME/audit/approvals.jsonl(或环境变量指定路径)保留审批与工具调用的本地审计行;不上传、不联网。

核心功能

免审批:活动会话切到完全权限

插件订阅 session/event。某会话的第一个事件到达后,在 queueMicrotask 里调用 permissionPresets.set(session, 'danger-full-access');每个会话对象只切一次(WeakSet 记录)。若会话已是该预设则跳过,且不写 auto-preset 行。目标预设写死在 index.js 顶部的 PRESET = 'danger-full-access';切换失败只记一条 auto-preset-failed,不重试、不弹窗。

与「profile 默认预设」的区别:本插件会对已存在的活动会话同样生效,而不只影响之后新建的会话。

审计:白名单事件写入 JSONL

每行一条 JSON,字段为 { at, kind, session, type, data }(插件自有的 auto-preset / auto-preset-failed 用 preset / error,无 type)。

记录的会话事件类型包括:approval/asked、approval/decided、approval/policy、sandbox/mode、permission/preset、tool/call、tool/result、turn/end。工具参数截断 300 字符,tool/result 的 meta 200 字符,其余事件数据 400 字符;tool/result 不记完整结果。追加写、不轮转;父目录不存在时会 mkdirSync 创建。写失败在 try/catch 内静默丢弃,不影响会话继续运行。

它改什么、不改什么

仅会:调用 permissionPresets.set、向审计文件追加行、必要时创建审计目录。不按 README 设计去改会话事件载荷、不写工作区文件、不联网、不 child_process 执行命令、不删改审计文件以外的路径。

安装与启用

v1.1.0 起 package.json 含 dsh.bundle.patch(指向 cordis.patch.yml),经插件市场或 dsh plugin add 装包后会带入 profile 的 patch 层 —— 装完重启 DSH 即挂载,无二次确认。

图形界面(桌面端,推荐)

设置(Ctrl+,)→ 插件市场 → 自定义安装 → 填写:

github:wojiao42/dsh-approval-audit

然后重启 DSH。资料注明:桌面端 profile 由应用托管时,命令行 dsh plugin --profile desktop add 可能被拒绝,可走图形界面。

命令行

# 桌面端(DSH Desktop)
dsh plugin --profile desktop add github:wojiao42/dsh-approval-audit

# 浏览器版(DSH Web)
dsh plugin --profile web add github:wojiao42/dsh-approval-audit

Host 插件在启动时加载;改 patch 或环境变量后须重启 DSH,仅刷新页面不够。

手动挂载(可选)

在 $DSH_HOME/profiles/<profile>/cordis.patch.yml 末尾追加 insert(<profile> 为 desktop 或 web),例如已装包时:

- insert:
    - id: approval-audit
      name: 'dsh-approval-audit'

审计路径(可选)

默认:$DSH_HOME/audit/approvals.jsonl;无 DSH_HOME 时退到 ~/.dsh/audit/approvals.jsonl。覆盖路径:

# macOS / Linux
export DSH_APPROVAL_AUDIT_LOG="/path/to/approvals.jsonl"

改环境变量后需重启 DSH。目录无写权限时审计静默失效,需用下面自测步骤确认。

卸载与恢复审批

一键安装:dsh plugin --profile <profile> remove dsh-approval-audit(或插件市场卸载),重启 DSH。手动挂载:删除或禁用 patch 中的 insert,重启。另检查 profile 是否仍将新会话默认设为完全权限。审计文件不会自动删除。

典型用法与自测

装好并重启后,让 agent 执行一次工具调用(例如列出当前目录),再打开审计文件查看新增行。

  1. 重启 DSH,新建会话并触发一次工具调用。
  2. 查看 $DSH_HOME/audit/approvals.jsonl 或 DSH_APPROVAL_AUDIT_LOG 指向的文件。
  3. 应出现 "kind":"session-event" 且 "type":"tool/call" / "tool/result";若会话原先不是完全权限,还可能有 "kind":"auto-preset"。

看不到新行时:检查审计目录是否可写、宿主是否存在 danger-full-access 预设、patch 是否被正确加载。仓库无自动化测试;仅可做语法检查:

node --check index.js

适用场景与注意

适合:本机只跑你明确信任的代码与任务,你愿意用「无人工审批」换流畅度,并愿意事后翻 JSONL 自查。不适合:自动处理陌生网页、不可信仓库或他人输入的环境。

安装前建议自行阅读 GitHub 源码 与 LICENSE(MIT)。插件以当前 DSH 进程权限运行;审计日志为明文 JSONL,可能含命令、路径或参数中的敏感信息,分享前需自行脱敏。审计不防篡改,不能代替安全机制。

已知边界摘要:同一会话内手动切回「仅可查看」不是永久回退,插件仍挂载时重启或会话重建后会再切;日志只增不减、会截断长字段;PRESET 改动需重启 Harness 才生效。

结尾

dsh-approval-audit 把「放行自动化」和「事后留账」放在一起:活动会话一律 danger-full-access,审批与工具调用落在本机 JSONL。使用前务必接受无审批带来的操作风险;需要闸门时卸载插件并检查 profile 预设。

  • 目录页:https://www.skillhub.cn/plugins/wojiao42/dsh-approval-audit
  • GitHub:https://github.com/wojiao42/dsh-approval-audit
羽毛球分组比赛记分
小程序二维码

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

小夜