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

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

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

小夜