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
羽毛球分组比赛记分
小程序二维码

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

小夜