dsh-tool-exposure:按 Agent 預設收窄全局插件工具暴露面

前言

在 DeepSeek Harness(DSH)裏,第三方插件註冊的工具會出現在 Host 全局工具表裏。這類 profile 級工具默認對所有 Agent 預設(角色)可見;若把插件整份搬進某個 preset,又會出現連接、配置頁重複維護的問題。preset 內自帶的 scope-local 工具本來就能按角色隔離,但 FOFA、ICP MCP、鴻蒙橋接等「裝一份、全員可見」的全局工具,此前缺少細粒度開關。

下面介紹的 dsh-tool-exposure(維護者 keyblues)在 Settings 提供「角色 × 工具組」矩陣,通過 DSH 現有的 ctx.tools.restrict({ deny }) 在 agent 創建時下發掩碼:被隱藏的工具既不可見也不可調用(UNKNOWN_TOOL),插件仍只安裝一份。

這是什麼

dsh-tool-exposure 是 DSH 社區插件,分類爲 admin-security,許可證 MIT。它不改變任何內置插件,只在你保存配置後,對新建會話裏的 agent 按 preset 限制「受管集合」中的全局工具;已有會話保持創建時的工具面(快照語義)。

社區目錄頁:skillhub.cn/plugins/keyblues/dsh-tool-exposure(獨立站點,與 DeepSeek / 幻方無官方從屬關係)。源碼:github.com/keyblues/dsh-tool-exposure。

DSH 裏兩類工具與插件要補的缺口

DSH 工具按註冊位置大致分兩層:

來源 例子 可見範圍
profile 級(Host 全局) dsh-fofatoto(fofa_*)、@local/icp-mcp(mcp__icp__*)、fengniao_*、everything_*、dsh-hdc-bridge(hdc_* / hms_*) 默認所有角色可見
preset 內掛載(scope-local) 各 preset 的 tscanplus、fs、web、subagent 等 僅該角色可見

本插件針對第一類:用 agent 作用域的 deny 列表做掩碼,實現「共享安裝與配置,按角色收窄工具面」。

核心機制(Host 側)

要點均來自插件 README,全部基於 DSH 現有 API。

受管集合:config.sources 裏各組的 match 通配符對當前全局工具名求並集;不在任何組裏的全局工具不受影響(頁面上爲「未歸組」)。

角色識別:通過 agentPresets.composedPreset(agent.ctx)。agent/created 時 preset 可能尚未掛載(子代理可能爲 undefined),解析不到則掛起,在第一次 agent/pre-step 補應用;仍失敗則最多再等 2 次 pre-step,之後按 unlisted 策略應用並寫日誌。

應用點:對該角色應隱藏的受管工具調用 agent.ctx.tools.restrict({ deny }),掛在 agent.ctx.effect() 上。PTC 模式下被 deny 的工具不會生成 SDK 綁定。保留 transport run_code 不參與受管與 deny,避免 restrict 拋錯導致策略靜默失效。

快照與 legacy:只在 agent 創建或首次 pre-step 應用;配置保存隻影響新建會話。插件重載後已存在的 agent 標記爲 legacy,不重算掩碼。

晚註冊工具:在 agent 尚未開始第一步(agent/inbox/claimed 之前)時,tools/change 會重算一次,用於收掉 MCP 等異步註冊的工具;開始工作後凍結。

安全與運維:Settings API 校驗 Host / Origin(防 DNS rebinding);讀取 tools.schemas() 失敗時 fail-closed,不下發空掩碼。agent 狀態用模塊級 WeakMap(含跨 HMR 的 global Symbol 槽),避免在 frozen agent 上疊加永不解綁的 restriction。

Settings「工具暴露」頁

安裝後在 Settings 出現「工具暴露」(order 25,位於「Agent 預設」之後)。操作流程:

  1. 用角色卡片選中要編輯的 preset;卡片展示名稱、模式與「可見 / 受管」計數。
  2. 設置該角色基線:默認開放(open)或 白名單(allow)。
  3. 按工具組整組開關,可展開組名單工具覆蓋;「最終可見工具」可預覽保存前的可見 / 隱藏列表。
  4. 「沒有單獨配置的角色」繼承全局 unlisted:open 不限制受管工具,closed 看不到受管工具。
  5. 「管理工具組」維護 sources 的 label、match(逗號分隔,支持 * 與 ?)及組 id(頁面 slug 規則 ^[a-z][a-z0-9-]{0,31}$)。

默認 roles: {} 且 unlisted: open 時,行爲與安裝前一致。保存後提示「已保存,新建會話生效」;「解除現有會話策略」僅影響當前 live 會話,不改配置文件。

配置模型

矩陣保存經 configEditor 寫入本 profile 的 cordis.patch.yml 中 tool-exposure 插件條的 config。解析順序:mode 基線 → groups 整組 → tools 單工具 → 按當前已註冊全局工具名裁剪。

示例(與 README 一致,可按環境改組 id 與角色 id):

- id: tool-exposure
  name: 'dsh-tool-exposure'
  config:
    unlisted: open
    sources:
      fofatoto: { label: FOFA 測繪, match: ['fofa_*'] }
      icp:      { label: ICP 備案,  match: ['mcp__icp__*'] }
      fengniao: { label: 企業工商,  match: ['fengniao_*'] }
      everything: { label: 全盤檢索, match: ['everything_*'] }
      hdc:      { label: 鴻蒙設備與 DevEco, match: ['hdc_*', 'hms_*'] }
    roles:
      asset-expert:
        mode: allow
        groups: { fofatoto: on, icp: on, fengniao: on, everything: on }
        tools:  { fofa_export: on }

mode: allow 表示基線全不給,再按 groups / tools 打開;mode: open 表示基線全給,再按 groups / tools 關閉。同一工具被多組 match 時,按 sources 書寫順序取第一個組。

安裝與啓用

環境要求:Node.js ≥ 20;DSH 版本 >=0.2.1-rc.5 <0.3.0-0(見倉庫 package.json 的 engines)。bundle 零運行時依賴,無構建步驟。

從 GitHub 安裝(推薦)

  1. 打開側邊欄「插件」頁。
  2. 點「添加插件」→「安裝第三方插件」。
  3. 在「包名或地址」輸入:
https://github.com/keyblues/dsh-tool-exposure
  1. 安裝完成後刷新頁面;Settings 出現「工具暴露」即成功。

也可由 Agent 執行:

plugin_manager(action: "install_bundle", target: "github:keyblues/dsh-tool-exposure")

安裝後 Config.listConfigs 應出現 include:tool-exposure(或 patchId tool-exposure)。修改 Host 端 index.js 後需對 include:tool-exposure 先 enabled: false 再 enabled: true,或重啓 Harness;改 client.js 後刷新頁面或同樣禁用 / 啓用一次。

典型用法思路

  1. 在 sources 裏把需要統一管理的全局插件工具歸組(match 通配符與已安裝插件的工具名前綴對齊)。
  2. 爲「只應使用部分測繪 / 備案能力」的 preset 設 mode: allow,按需打開組或單個工具。
  3. 對未在 roles 裏單獨列出的 preset,用 unlisted: closed 默認隱藏全部受管工具,再只爲少數角色寫條目。
  4. 保存後開新會話驗證「最終可見工具」與 agent 實際 dispatch 一致;舊會話仍保留創建時的工具面。

倉庫提供 Host / Client 自檢:npm test(等價於 node test/host-policy.mjs、node test/static-checks.mjs、node test/client-smoke.mjs)。

適用場景與注意

適合:同一 DSH profile 上多 preset 共用 FOFA、MCP、鴻蒙橋接等全局插件,但希望按角色限制調用面;需要可視化矩陣而不是手改多處 preset 掛載。

注意:

  • 插件以當前 DSH 進程權限運行;安裝前請閱讀源碼與 MIT 許可證,確認 match 與角色策略符合你的安全預期。
  • restrict 只過濾 global 與 ancestor preset 層;scope-local 工具名不參與本插件 deny 列表。
  • 配置與頁面診斷以 Host 路由爲準;非法 JSON、超大 payload、過長 match 會返回 400 / 413。
  • 社區目錄與 GitHub 星標等元數據會變動;以安裝時倉庫 README 與 package.json 爲準。

結尾

dsh-tool-exposure 用 Settings 矩陣和 ctx.tools.restrict,在不動第三方插件本體的情況下,把 profile 級工具暴露面按 Agent 預設收窄,並明確快照語義,避免誤傷已有會話。

  • 目錄頁:https://www.skillhub.cn/plugins/keyblues/dsh-tool-exposure
  • GitHub:https://github.com/keyblues/dsh-tool-exposure
羽毛球分组比赛记分
小程序二维码

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

小夜