前言¶
在 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¶
- 卡片上方:
追问:为什么需要越权?(展开后为「收起说明」)。仅在真实越权审批卡出现,不影响批准/拒绝与 Enter/Esc。 - 卡片下方:两行灰字——
风险 …与不授权 …。为「理由只有一句话」的工具兜底;若模型理由里已写风险与拒绝后果,这两行自动让位,不重复。 - 虚线框:模型理由完整原文(不截断、保留换行、可滚动),按「需要的权限 / 风险 / 不授权」分段;给纯文本界面保留的「追问:回复『追问』…」句在此去掉。
展开面板的四段内容¶
- 判断依据:用
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.composerchain 槽位接管(本插件 priority0.9,原生1,命中后复用原生卡片)。 - 样式使用宿主 CSS 变量,随主题变色;面板与原文块高度有界,避免撑破合成器容器。
安装与启用¶
安装均通过 plugin_manager 的 install_bundle(该操作本身会触发一次审批)。三种 target 方式任选其一:
- tarball(推荐):
target填dist/dsh-approval-why-1.0.8.tgz的绝对路径。 - zip:解压
dist/dsh-approval-why-1.0.8.zip,target填解压目录绝对路径。 - 目录:
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 弹出标题为「等待审批」、带拒绝/允许一次的越权卡时:
- 先看卡下两行风险与不授权说明(若模型理由未覆盖)。
- 需要细节时点上方的「追问」按钮,阅读判断依据、归类说明与参数原文。
- 仍用原生按钮做允许或拒绝判决。
普通确认对话框不经过该槽位,不会出现追问按钮。
适用场景与注意¶
适合:经常在 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 为准。