@gw/dsh-tools-manager: Disable tools by Agent preset

前言

在 DeepSeek Harness(DSH)里,同一个 profile 往往挂多种 Agent 预设(模式):有的偏对话、有的偏自动化。不同模式对模型可见、可调用的工具集合并不总是一致。若只靠 preset 挂载插件或零散 restrict,很难在 UI 里按模式点名「禁掉某几个工具」,且缺少统一的黑名单持久化。下面介绍的插件 @gw/dsh-tools-manager(社区仓库 1497105876/dsh-tools-manager)专门做这件事:按 preset id 维护禁用名单,只有黑名单,没有白名单;装完默认什么都不禁,具体规则在设置页或规则文件里配置。

这是什么

@gw/dsh-tools-manager 是 DSH 社区插件,npm 包名 @gw/dsh-tools-manager,当前资料中版本为 2.1.100,MIT 许可,维护者对应 GitHub 用户 1497105876。分类上属于 admin-security:从管理面限制模型侧工具,而不是扩展新能力。

一句话定位:按 Agent 预设(模式)禁用工具。 没被本插件点名禁用的工具,本插件一概不碰——能否使用、是否出现在列表里,由 DSH 自身、preset 挂载的插件以及其他插件的 restrict 决定;设置页因此没有「已启用」一栏。

核心功能

资料中明确的能力如下。

能力 说明
按模式禁用 规则按 preset id 索引(如 standard、qq 或任意自定义 id),各模式各管各的
两层拦截 restrict 让模型看不见工具 schema;guard 让硬调用被拒。看不见的调不了,会话中途才注册的工具也能被 guard 拦住
兜底规则 规则文件里可用 "*" 覆盖所有未单独配置的模式
设置页 左侧栏「工具管理」:顶部选模式,下面一行一个工具,右侧开关;开关打开表示禁用

实现上,两个 API 都注册在 agent 自己的 ctx 上,且需全撤全装:ctx.tools.restrict({ deny }) 只过滤继承来的工具;ctx.tools.guard(fn) 为 monotonic,返回字符串即拒绝,不能反向开绿灯。规则里点了名但当前不存在的工具会原样保留,便于工具日后出现时立刻生效。

安装与启用

官方 README 未给出 dsh plugin add github:... 一类命令,安装需把包放进 profile 的 node_modules(scope @gw),并在 cordis.patch.yml 中注册插件。

1、把本包装进对应 profile 的 node_modules/@gw/,或使用符号链接(桌面客户端将路径中的 web 换成 profiles/desktop):

# web profile(桌面客户端换成 profiles/desktop)
ln -s /path/to/dsh-tools-manager ~/.dsh/profiles/web/node_modules/@gw/

注意:必须挂裸包名且包要真在 profile 的 node_modules 里(link 也算)。使用 file:// 会连坐搞挂整个前端 bundle。

2、在 profile 的 cordis.patch.yml 追加:

- insert:
    - id: tools-manager
      name: '@gw/dsh-tools-manager'

3、重启 DSH。设置页左侧栏应出现「工具管理」。

运行环境(来自 package.json):Node.js >= 18,DSH / @deepseek-ai/dsh 为 >=0.2.1-rc.2 <0.3.0。

设置页用法

顶部选择要管理的模式,下方为工具表。

界面表现 含义
开关关闭、无标签 本插件未禁;该模式当前能用到此工具
开关变红并标「已禁用」 本插件已禁:模型看不到 schema,硬调会被拒
灰标签「不可见」 本插件未动它,但在所选模式下不出现——可能属于别的模式,或被其他插件限制

左侧开关控制禁用/放开,只有开关可点;从工具名到行尾其余区域用于展开/收起该工具的 description(来自 schema,禁用前会缓存)。列表按名字排序,禁用不会置顶。

若该模式当前没有活动会话,页面会说明清单来自全局注册表、仅供参考——没有 agent 实例时无法还原该 preset 的真实工具集。

规则文件

持久化路径:~/.dsh/plugin-data/tools-manager/rules.json(根目录可由 DSH_HOME 改变)。示例:

{
  "version": 2,
  "rules": {
    "qq": { "deny": ["bash", "subagent_fork"] },
    "*": { "deny": [] }
  }
}

规则按 preset id 索引,不按 profile 分目录——preset 名在跨 profile 时仍按 id 唯一对应。首次启动会把旧版 denyNames 合并迁移为 v2 的 deny(旧文件原地保留,不再读取)。

适用场景与注意

适合需要在不同 Agent 预设下统一、可审计地「关掉少数危险或无关工具」(例如某模式禁 bash、subagent_fork),又不想维护白名单、也不想替 DSH 猜测「该不该出现」的场景。

使用前请注意:

  • 插件在当前 DSH 进程权限下运行,安装前应自行审阅 源码 与 MIT 许可证。
  • 仅黑名单:不能通过本插件「只允许某几个工具」;白名单语义需其他机制配合。
  • 社区目录页 skillhub.cn 上的条目 与 GitHub 仓库由社区维护,与 DeepSeek / 幻方无官方从属关系;DSH 生态本身是「一切皆插件」的扩展方式。

结尾

@gw/dsh-tools-manager 把「按模式禁用工具」做成设置页 + rules.json,并用 restrict 与 guard 双层拦截,适合 admin-security 类治理需求。详情与 issue 见 GitHub:https://github.com/1497105876/dsh-tools-manager;目录介绍见 https://www.skillhub.cn/plugins/1497105876/dsh-tools-manager。

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

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

Xiaoye