dsh-approval-why:为 DSH 工具审批卡补充可追问的中文越权说明

前言

在 DeepSeek Harness(DSH)里,模型执行越权操作前会弹出工具审批卡片。卡上通常只有模型自写的一段理由,往往只有一句话,例如 create_skill 自带的「在 DSH_HOME/skills 目录下创建新技能」。为什么算越权、拒绝后会怎样,卡上未必写全;审批期间模型又在等你点按钮,没法临时补说明。

社区插件 dsh-approval-why(维护者 zhknb)在客户端读取本次调用的真实参数(会话事件里的 tool/call.arguments),在浏览器里当场分析、渲染,不改变批准或拒绝,只把「这次到底在要什么权限」说清楚。下文按定位、功能、安装与注意点介绍。

这是什么

  • 名称:越权说明按钮(包名 dsh-approval-why,当前版本 1.0.8)
  • 仓库:https://github.com/zhknb/dsh-approval-why
  • 许可:MIT
  • 平台:web(DSH 桌面端 / 网页端);纯文本界面 ACP(如 VS Code)无客户端槽位,安装后也不会显示按钮
  • 定位:给 DSH 的工具审批卡片增加「追问:为什么需要越权?」按钮、卡下两行常驻提示,以及完整原文的分段展示;全部在客户端本地完成,无额外网络请求

Host 半(index.js)为空实现:不自动允许/拒绝,也不在 tools/execute 上重复加审批门(避免与 create_skill 等自带审批叠成双卡)。

装上之后你会看到什么

卡片上的三处 UI

  1. 卡片上方:追问:为什么需要越权?(展开后为「收起说明」)。仅在真实越权审批卡出现,不影响批准/拒绝与 Enter/Esc。
  2. 卡片下方:两行灰字——风险 … 与 不授权 …。为「理由只有一句话」的工具兜底;若模型理由里已写风险与拒绝后果,这两行自动让位,不重复。
  3. 虚线框:模型理由完整原文(不截断、保留换行、可滚动),按「需要的权限 / 风险 / 不授权」分段;给纯文本界面保留的「追问:回复『追问』…」句在此去掉。

展开面板的四段内容

  • 判断依据:用 event.data.meta.cwd 与工作区内路径比对,标出工作区内/外路径;整条命令被 danger-full-access 放大时会单独说明。
  • 为什么需要越权:按工具归类讲影响面;内置 44 个工具有表可查,未收录工具会标「未收录」并列出本次参数字段。
  • 参数与动作:工具名、美化后的参数 JSON(\n 等转义会还原)、从参数识别的动作(删除、覆盖写入、启动外部程序、联网下载等)。
  • 理由只是自述:提醒卡片理由为模型自述,与参数冲突时以参数为准。

核心机制(简述)

  • classifyTool():先匹配 TOOL_KINDS 表,再按 office_* 前缀、danger-full-access、联网特征兜底,否则 unknown。
  • inspectArguments() / concreteWhy():从参数抽路径与动作,并与工作区根目录比较,得出越权触发点。
  • 审批 UI 通过 @deepseek-ai/dsh-client-ui-approval 在 conversation.composer chain 槽位接管(本插件 priority 0.9,原生 1,命中后复用原生卡片)。
  • 样式使用宿主 CSS 变量,随主题变色;面板与原文块高度有界,避免撑破合成器容器。

安装与启用

安装均通过 plugin_manager 的 install_bundle(该操作本身会触发一次审批)。三种 target 方式任选其一:

  1. tarball(推荐):target 填 dist/dsh-approval-why-1.0.8.tgz 的绝对路径。
  2. zip:解压 dist/dsh-approval-why-1.0.8.zip,target 填解压目录绝对路径。
  3. 目录:target 填含 package.json 的源码目录绝对路径。

装完对当前 profile 下所有会话生效,重启后仍在;必须刷新页面(F5) 后客户端 client.js 才生效(无 HMR)。

用目录(link)方式安装时,remove_bundle 可能沿 junction 删掉源目录内容;卸载前宜备份,或改用 tgz 安装副本。

卸载与停用

  • 卸载:plugin_manager 的 remove_bundle,target 填 dsh-approval-why(或插件列表中的包名)。
  • 仅停用:set_bundle 将 dsh-approval-why 设为 enabled: false。

典型使用方式

无需额外配置项。当 DSH 弹出标题为「等待审批」、带拒绝/允许一次的越权卡时:

  1. 先看卡下两行风险与不授权说明(若模型理由未覆盖)。
  2. 需要细节时点上方的「追问」按钮,阅读判断依据、归类说明与参数原文。
  3. 仍用原生按钮做允许或拒绝判决。

普通确认对话框不经过该槽位,不会出现追问按钮。

适用场景与注意

适合:经常在 DSH Web/桌面端审批沙箱越权、希望对照真实参数做决定的开发者。

注意:

  • 插件以当前 DSH 进程权限运行;install_bundle 会请求审批,安装前应查看仓库源码与 MIT 许可证。
  • 不改判决、不替换原生卡片逻辑,只增只读说明层。
  • 按钮未出现:确认已刷新页面且当前为越权审批卡;若卡上显示带 \n\n 的原始 JSON,多为插件未加载(如刚重装未刷新),此时是内置原生卡。
  • client.js 内 window.__ModuleLoader__.load 的 id 须与 package.json 的 name 一致,否则可能导致 duplicate factory registration 与 Web 启动失败。

生态上,DSH 奉行「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。本插件在目录页:https://www.skillhub.cn/plugins/zhknb/dsh-approval-why 。

结尾

dsh-approval-why 在审批等待期间,用本地解析补齐「为何越权、风险何在、参数实际要做什么」,辅助你在点允许或拒绝前做判断。源码与 dist/安装说明.md 见 GitHub 仓库;分发包版本以 README 中的 1.0.8 为准。

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

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

Xiaoye