前言¶
在 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 補全,且不碰審計語義與用戶抉擇。目錄與源碼: