approval-zh:DSH 权限确认窗口中文化

前言

在 DeepSeek Harness(DSH)里跑智能体时,Shell、编辑、写入等工具触发越权操作会弹出权限确认窗口(Approval)。按钮和标题在较新版本里往往已是中文,但窗口里那句授权原因(reason)通常仍是英文——它是 bash、edit、write 等调用方传入的自由文本,官方面板没有内置词典,所以会一直显示类似 Tool bash requests privileged execution. 的句子。对日常用中文界面的人来说,要在英文原因和具体命令之间来回对照,既慢也容易点错。

下面介绍的 approval-zh(仓库 KNGLOKIKO/dsh-plugin-approval-zh)是社区维护的 DSH 插件,分类为客户端(同时包含 host 与 client 半边)。它接管 conversation.composer 上的审批卡片并用中文重绘,优先用本地词表翻译常见原因与界面文案,未命中时由宿主侧 model-router 兜底。不翻译审计记录,也不改动「允许一次 / 拒绝」的审批语义。

这是什么

  • 定位:DSH 权限确认窗口(审批面板)中文化插件。
  • 维护者:KNGLOKIKO(GitHub 仓库 dsh-plugin-approval-zh,社区目录页 SkillHub 条目)。
  • Bundle 名称:@local/approval-zh(见仓库 package.json,当前版本 1.0.0,许可证 MIT)。
  • 运行时:Cordis host + client;Node ≥ 18;仓库自带 75 项离线自检通过。

装插件前后,同一审批场景在界面上的差异可以概括为:授权原因由英文变为中文,命令明细行仍展示原始命令(例如 rm -rf build/),按钮仍为「拒绝」「允许一次」等已有中文文案。

核心功能

客户端:本地词表,零网络延迟

client.js 以 priority: 0 接管 conversation.composer 链槽(官方面板为 priority: 1,数字小的先命中),自行绘制整张审批卡片。界面文案来自内置中英词典;常见英文原因匹配 PHRASES 正则表;工具显示名来自 TOOL_LABELS(例如 bash →「Shell 命令」)。不发任何网络请求,弹窗打开前即可完成常见句子的中文化。

词表未命中时:面板仍显示英文原因,并附「尚未收录本地词表」类提示,信息不丢失。

宿主侧:model-router 兜底

index.js 在 agent/created 时对 agent.ctx 挂载 approval/request 瀑布监听:若 req.reason 中没有 CJK 字符,则调用 model-router 翻译并写回 req.reason;结果在宿主与客户端缓存,相同原因下次即时显示中文。

三条硬约束保证不拖慢、不破坏审批:

约束 行为
硬时间预算 默认 2500ms 超时即放行,原因保持英文
永远放行 监听器总是 return next(),不消费、不否决审批
冻结对象 Object.isFrozen(req) 时宿主侧跳过改写,仅依赖客户端词表

任一步失败(库缺失、超时、模型报错、返回空)仅 console.warn,界面照常工作。

明确不做的边界

  • 审计记录仍为原始英文 reason,中文只作用于界面。
  • 不自动允许或拒绝;决定仍由用户点击或 Enter / Esc。
  • 命令明细依赖槽位 kit 的 useChat;若当前 DSH 未在 conversation.composer 注入,明细区可能不显示,面板其余部分正常。
  • 渲染异常时有 React 错误边界,降级为极简中文面板,避免白屏。

安装与启用

安装会在宿主与浏览器进程里执行插件代码,需要 Full access 或逐次批准。请先在 GitHub 阅读源码与 MIT 许可证,确认后再装。不要手改 profile 下的 ~/.dsh/profiles/desktop/cordis.patch.yml,应使用 plugin_manager。

方式一:克隆后本地安装

git clone https://github.com/KNGLOKIKO/dsh-plugin-approval-zh.git
plugin_manager  action=install_bundle
                target=<克隆下来的绝对路径>

方式二:从 git 仓库直接安装

仓库 package.json 已带 dsh.bundle.patch,无需额外构建:

plugin_manager  action=install_bundle
                target=git+https://github.com/KNGLOKIKO/dsh-plugin-approval-zh.git

装完后用(免批准的)cordis_inspect_query 确认插件行已插入:

cordis_inspect_query  platform=host  provider=Config  method=listConfigs
                      input={"name":"@local/approval-zh"}

返回 status: "absent" 是正常的——表示本插件未导出 Config schema,不代表未安装。

刷新页面或重启 DSH,让 client.js 进入浏览器模块表。

卸载

plugin_manager  action=remove_bundle  target=@local/approval-zh

可选配置

在 cordis.patch.yml 的 config 中调整(改完需重装 bundle 或重启 DSH):

- insert:
    - id: approval-zh
      name: '@local/approval-zh'
      config:
        libraryPath: '.../model-router/index.js'  # 可选
        translateBudgetMs: 2500                    # 翻译硬预算
        useModelRouter: true                       # false = 仅本地词表

libraryPath 可不填,按顺序自动解析:

  1. 环境变量 APPROVAL_ZH_MODEL_ROUTER
  2. 与本 bundle 同级的 ../model-router/index.js

都解析不到时只走客户端本地词表,插件仍可正常工作。

典型用法与扩展词表

日常无需额外操作:工具请求越权执行时,审批窗以中文展示原因与按钮;与官方面板相同的交互逻辑。

若需覆盖新的英文原因句式或工具名,需改仓库内 client.js 后重装 bundle 并刷新页面:

  1. 整句模板:在 PHRASES 数组追加条目(顺序即优先级),例如:
{ re: /^Tool\s+(.+?)\s+requests privileged execution\.?$/i,
  build: (m) => '工具 ' + toolZh(m[1]) + ' 请求越权执行' },
  1. 工具名:在 TOOL_LABELS 增加映射,如 bash: 'Shell 命令'。
  2. 界面文案:修改 client.js 顶部的 zh / en 词典。

离线验证(不联网、不启动 DSH):

node selftest.mjs

期望输出:BUNDLE SELFTEST PASSED (75 checks)。

适用场景与注意

适合:长期在 DSH 桌面/Web 客户端开发或运维智能体、希望审批弹窗原因与工具说明统一为中文、又需要保留原始命令明细与审批语义的用户。

注意:

  • 插件以当前 DSH 进程权限运行;安装前请自行审查 GitHub 源码。
  • 关闭 model-router(useModelRouter: false 或未配置库)时,仅依赖本地词表与客户端渲染,未收录原因仍为英文。
  • SkillHub 等社区目录与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本插件是社区贡献,非官方面板内置能力。

结尾

approval-zh 用「客户端词表 + 宿主 model-router 兜底」把 DSH 审批里最难中文化的 reason 补全,且不碰审计语义与用户抉择。目录与源码:

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

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

Xiaoye