前言¶
在 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 可不填,按顺序自动解析:
- 环境变量
APPROVAL_ZH_MODEL_ROUTER - 与本 bundle 同级的
../model-router/index.js
都解析不到时只走客户端本地词表,插件仍可正常工作。
典型用法与扩展词表¶
日常无需额外操作:工具请求越权执行时,审批窗以中文展示原因与按钮;与官方面板相同的交互逻辑。
若需覆盖新的英文原因句式或工具名,需改仓库内 client.js 后重装 bundle 并刷新页面:
- 整句模板:在
PHRASES数组追加条目(顺序即优先级),例如:
{ re: /^Tool\s+(.+?)\s+requests privileged execution\.?$/i,
build: (m) => '工具 ' + toolZh(m[1]) + ' 请求越权执行' },
- 工具名:在
TOOL_LABELS增加映射,如bash: 'Shell 命令'。 - 界面文案:修改
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 补全,且不碰审计语义与用户抉择。目录与源码: