DSH_Monitor:审批台账、高危 gate 与桌面浮窗的一体化插件

前言

在 DeepSeek Harness(DSH)里,智能体每次调用敏感工具都会走 approval/request 瀑布式审批。开发或日常使用久了,常会遇到两类问题:事后说不清「当时批了什么、风险标成什么、最后成功还是失败」;高危命令若只靠人工点一次「允许」,也容易在忙乱中漏拦。社区里曾有独立的审批台账与桌面提醒插件,分装时还会在监听顺序、风险口径上各自为战。

4478sc/DSH_Monitor(npm 包名 dsh-approval-toast,当前版本 0.7.19)把审批台账与右下角桌面浮窗合并为一个 DSH 插件,维护者为 4478sc,分类属于 admin-security。台账侧记录工具、理由、风险、决策与结果,并可选 gate / auto 模式;浮窗侧在任务完成、失败、提问或等待审批时提示,点击可回到对应会话与待审批卡片。以下按功能、安装、配置与使用注意说明。

这是什么

一句话:在 DSH 进程内同时承担「审批观察者 + 可选决策者」和「桌面 Attention Toast」,台账写入 JSONL,宿主具备 webServer 时挂载可导出报告的审计 HTML 面板。

合并来源在 README 中有明确对照:台账能力来自对 feely0208/dsh-approval-ledger 的复刻与演进(代码在 lib/ledger/);浮窗来自 4478sc/DSH_AttentionPlugins_Desktop(lib/attention/ 等)。合并后 lib/index.js 固定挂载顺序——先浮窗观察者,再台账决策者——避免 gate 模式先拒绝导致浮窗永远看不到「等待审批」事件。

许可证 MIT;依赖 Node >=20,DSH 版本 >=0.1.7 <0.3.0;桌面浮窗宿主支持 Windows(WPF)与 Linux(GTK3)。

审批台账

插件在 approval/request 上注册监听器,mode 决定除记录外是否改决策:

模式 行为
ledger(默认) 只记:时间、会话、工具、调用 id、理由、风险、决策、结果,不改动原有审批链
gate 对 rm -rf、mkfs、dd、curl \| sh、sudo、写 .ssh、danger-full-access 等高危模式直接 rejected,其余交给下游
auto allowlist 中的工具名直接 allowed-once,其余照旧

审批结果枚举为四种:allowed-once、rejected、cancelled、unavailable。风险分级与浮窗「预判风险」共用 lib/ledger 的 classifyRisk;denyPatterns 自定义正则同时作用于台账与浮窗。

默认写入路径:有环境变量 DSH_HOME 时为 $DSH_HOME/approval-ledger/ledger.jsonl,否则为 ~/.dsh/approval-ledger/ledger.jsonl,一行一条 JSON;写失败不阻断审批,读时坏行跳过。

向智能体暴露的查询类工具(名称以 README 为准):

  • approval_ledger_query:按工具、风险、决策、结果、时间筛选
  • approval_ledger_stats:总量、高危、拒绝、会话授权自动放行等统计与分布
  • approval_ledger_grants:查看或撤销(action: "revoke")生效中的会话授权

审计面板在宿主提供 webServer 时自动挂载,否则跳过:

路径 用途
/approval-ledger 服务端渲染面板(卡片、风险分布、最近 50 条、刷新/导出)
/approval-ledger/data 同源 JSON:{ plan, counts, records }
/approval-ledger/export 带 content-disposition 的审计报告(deepwhale.approval-ledger/v1)

桌面浮窗与点击跳转

浮窗在 DSH 设置 → Attention Toast 中配置。任务模式含 mainline(当前会话即时、其余汇总)、balanced(逐条)、silent(完成/失败不弹,提问与审批仍弹);当前会话可见性为 hidden / unfocused / always。等待子智能体时,父会话结束后若仍有 running 子会话,会等整波空闲再弹。审批请求会弹出「等待审批 + 会话标题 + 工具 — 理由 — 预判风险」;用户批准或拒绝后不再弹结果卡。

点击浮窗时:原生宿主先尝试还原并前置 DSH 主窗口(Windows 用 WPF 脚本 lib/attention/toast_host.ps1;Linux 用 GTK3 lib/attention/toast_host.py),再由客户端打开注册表中的会话 id,并定位到 [data-approval-key] 待审批卡片;若已处理则提示「提醒已过期」。Linux 下窗口置前依赖 X11/XWayland 与 xdotool 或 wmctrl;Wayland 原生运行时可能无法置前,但仍会打开正确会话。

若只需台账、不需要桌面进程(无头或无桌面环境),可将 toast.spawn 设为 false。

安装与启用

本仓库不发布到 npm,README 要求用 tarball 安装,不要用 link:(会在 profile 里做目录联接,摘掉 profile 前删除会牵连源目录)。

在克隆或下载的仓库根目录执行:

npm install
npm pack

会产出形如 dsh-approval-toast-0.7.19.tgz 的包,然后加入 desktop profile:

dsh plugin --profile desktop add .\dsh-approval-toast-0.7.19.tgz

装完后需重启 DSH:宿主侧(lib/index.js、lib/attention/)不支持热重载;纯客户端 lib/client.js 改动可用 Ctrl+R。

配置要点

台账字段定义在 lib/ledger/index.js 的 DEFAULT_CONFIG,通过 DSH 插件配置读取:

字段 默认 说明
mode ledger ledger / gate / auto
allowlist [] auto 模式直接放行的工具名
denyPatterns [] 追加高危正则
ledgerDir '' 空则用 $DSH_HOME/approval-ledger
licenseKey '' 形如 DWH-ENT-XXXX-XXXX 时影响面板导出标记
sessionGrants.enabled false 会话内授权记忆
sessionGrants.ttlMs 1800000 单次授权有效期
sessionGrants.maxUses 20 workspace-write 档自动放行次数上限
sessionGrants.dangerMaxUses 5 danger-full-access 档上限(硬顶 5)
sessionGrants.alwaysAsk [] 永远询问的正则
toast.spawn true false 只跑台账、不起浮窗进程

浮窗外观与语言等写在 $DSH_HOME/storages/dsh-approval-toast/config.json(设置页写入);首次会从旧路径 storages/dsh-attention-toast/config.json 迁移。

会话内授权记忆默认关闭。打开后,同一会话内手动批准过的「工具 + sandbox 模式」组合可在预算内自动 allowed-once;设置页「启用会话授权记忆」同时覆盖 workspace-write 与 danger-full-access 两档。删除类操作(含 rm、git clean、中文「删除」等特征)即使用户仍有 danger 授权额度也会强制回到人工审批。

示例(静态配置片段,与 README 一致):

sessionGrants:
  enabled: true
  ttlMs: 1800000
  maxUses: 20
  dangerMaxUses: 5
  alwaysAsk: ['kubectl delete', 'git push --force']

适用场景与注意

适合需要在桌面 DSH 上长期跑 agent、既要可审计又要及时看到「等你审批」或任务终态的开发者与小团队。gate 模式适合在仍保留人工终审的前提下,对已知高危命令模式做默认拒绝;ledger 模式适合先全量记账、再按需收紧策略。

安装前建议自行阅读仓库源码与 MIT 许可证。插件以当前 DSH 进程权限运行,台账 JSONL 与导出报告可能包含会话与工具调用摘要,注意磁盘权限与备份。社区目录 SkillHub 上的 DSH_Monitor 页 与 GitHub 仓库相互独立,均非 DeepSeek / 幻方官方应用商店;生态上 DSH 奉行「一切皆插件」,目录站由社区维护。

经过上面的步骤,你可以在一条安装命令里同时获得可查询、可导出的审批台账,以及 optional 的桌面浮窗联动;高危拦截与记账共用同一套风险分类,减少「面板显示 high、账本却是 medium」的错位。

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

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

小夜