前言¶
在 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 预设」之后)。操作流程:
- 用角色卡片选中要编辑的 preset;卡片展示名称、模式与「可见 / 受管」计数。
- 设置该角色基线:
默认开放(open)或白名单(allow)。 - 按工具组整组开关,可展开组名单工具覆盖;「最终可见工具」可预览保存前的可见 / 隐藏列表。
- 「没有单独配置的角色」继承全局
unlisted:open不限制受管工具,closed看不到受管工具。 - 「管理工具组」维护
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 安装(推荐)¶
- 打开侧边栏「插件」页。
- 点「添加插件」→「安装第三方插件」。
- 在「包名或地址」输入:
https://github.com/keyblues/dsh-tool-exposure
- 安装完成后刷新页面;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 后刷新页面或同样禁用 / 启用一次。
典型用法思路¶
- 在
sources里把需要统一管理的全局插件工具归组(match 通配符与已安装插件的工具名前缀对齐)。 - 为「只应使用部分测绘 / 备案能力」的 preset 设
mode: allow,按需打开组或单个工具。 - 对未在
roles里单独列出的 preset,用unlisted: closed默认隐藏全部受管工具,再只为少数角色写条目。 - 保存后开新会话验证「最终可见工具」与 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