DeepSeek Harness Hub
← 返回列表

工具面折叠与防火墙QWE13-ART/dsh-tool-folder

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
✓ 可直接安装

按需折叠工具集省九成 token,拦截高危调用与外泄链

自动检查通过:npm 包已发布且 engines 声明满足基线(声明 Node >=18);该结论来自程序自动检查,未经人工实机验证。 · 最近上游提交 2026/9/2 · 已提供中文文档

按请求折叠 DSH 工具界面 + ChainGuard 防火墙(高风险阻断 + 外泄链检测 + 反混淆)+ BM25/bge-m3 混合 tools_search。将 schema token 缩减 80-90%,同时保持选择准确率。v0.2.0 新增语义检索分支(本地 Ollama bge-m3,RRF 混合)和 ChainGuard 混淆检测。npm:dsh-tool-folder

综合分
33.5
GitHub 分
33.5
用户评分
★ Stars
0
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dsh-tool-folder
npm 包 dsh-tool-folder 已校验归属本仓库,走 npm 安装最省事
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查✓ 自动检查通过

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

npm 包dsh-tool-folder @ 0.2.5
Node 引擎要求 >=18 · 基线 Node 22.19 满足
dsh CLI 依赖未声明 dsh 版本约束
入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/18 07:10:20

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-tools
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-tool-folder

将 DSH 工具面折叠到每个请求实际所需的范围。
按智能体核心 + BM25 动态加载 + 热度反馈 + 中文意图别名。
将每轮 schema token 缩减约 80-90%,同时保持(或提升)工具
选择准确率——即 RAG-MCP / BoR / SEP-1576 方法论,以
一个普通 cordis 插件的形式为 DeepSeek Harness 宿主实现。

机制(已对照 DSH 0.1.1-rc.1 源码验证)

SystemPrompt.assemble() → assembly = { sections, contexts, tools, variables }
ctx.waterfall(scope, "system-prompt/assemble", assembly, ctx, () => assembly)
← 本插件在此处监听并返回 {...assembly, tools: filtered}
buildRequest(turn, step, assembly.tools, ...)   ← API 请求的 tools 字段

assembly.tools 是 API 请求 tools 的唯一来源。返回
替换后的对象即具有权威性(模型选择插件也这样做)。
执行并不以当前轮次的 tools 为门槛——被折叠的工具仍
通过完整注册表解析——因此折叠绝不会移除能力。

反馈与防火墙绑定到执行事件,而非提示词
组装:
- tools/pre-execute —— 监听器接收 (exec, next)。返回
{ kind: "deny", reason } 以拒绝调用,或调用 next() 以允许。
exec = { callId, name, arguments, agent, signal }(exec 上没有 .deny()
方法——契约是返回的决策对象)。
- tools/post-execute —— 监听器接收 (exec, result, next),并在每个已执行工具上
触发一次;exec.name / exec.arguments 为热度计数、
外泄链检测、覆盖记录和会话持久化提供输入。
(agent/pre-step 仅携带 { messages, position, signal }——没有
toolCalls——因此它无法驱动反馈;已对照 dsh-agent-loop 验证。)

六层——全部已实现

| 层 | 机制 | 状态 |
|---|---|---|
| L1 schema 压缩 | 保守的描述/参数裁剪(无 $ref——提供商不兼容),compressEnabled | ✅ 仅 dyn 段 |
| L2 动态加载 | 按智能体核心 + BM25 top-K + 中文别名服务器路由 | ✅ 核心 |
| L3 选择指标 | 每会话 selectionCoverage + 离线 retrievalMetrics | ✅ 记录到 feedback.json |
| L4 执行侧 | 被折叠工具仍可执行 + 热度提升 + tools_search 工具 | ✅ |
| L5 缓存纪律 | 确定性排序(核心按配置,热/动态按名称)= 字节稳定前缀 | ✅ |

三段式布局

| 段 | 内容 | 成本 |
|---|---|---|
| core | 按智能体核心 + 热度提升的工具,完整 schema | 小,恒定 |
| dyn | 当前查询的 BM25 top-K + 中文别名服务器 top-K | 小,每请求 |
| folded | 其他所有内容——从 schema 中丢弃 | 零 |

别名命中不再拉入整个服务器:匹配服务器的工具
按 BM25 排序(将匹配的别名关键词桥接进查询以
跨越中英文鸿沟),并加载 top min(3, serverSize)。当
当查询完全无法产生词法信号时,会加载一个稳定的名称顺序子集,因此别名仍然有帮助。

可选地(catalogEnabled: true,默认值),被折叠的工具会以单行目录区段的形式列出,这样模型仍然知道它们存在,并可以按名称调用它们(执行侧回退仍然有效)。

安装

官方方式(需要 dsh CLI / pnpm):
dsh plugin --profile desktop add file:E:/DSH-Data/dsh-tool-folder
or, after publishing: dsh plugin --profile desktop add github:/dsh-tool-folder

手动回退方式:将包放在 profile 加载器能够解析到
dsh-tool-folder 的位置,然后添加到 profiles//cordis.patch.yml:
- insert:
- id: tool-folder
name: 'dsh-tool-folder'
config:
enabled: true
core: [tool-bash, tool-pwsh]
topK: 6
hotThreshold: 3
(手动安装尚未经过端到端验证——本地添加的 bundle 的加载器解析路径
是唯一未解决的问题。)

回滚

设置 enabled: false(或移除 insert 行)并重启 DSH。被折叠的工具
从未被注销,因此其他任何内容都不会改变。

配置

| key | default | meaning |
|---|---|---|
| enabled | true | 主开关 |
| perAgent | {} | {agentId: {core: [...]}} 覆盖 |
| core | [] | 始终加载的工具(未知 agent 的回退) |
| deny | [] | 永不注入 + 拒绝执行:精确名称,或 prefix 匹配整个服务器。Deny 优先于 core、include 和 catalog。 |
| topK | 6 | BM25 动态段大小 |
| hotThreshold | 3 | 被折叠的工具被调用 N 次 → 自动提升为 core |
| catalogEnabled | true | 为被折叠的工具追加单行目录区段(折叠安全网) |
| schemaToolEnabled | true | 注册 tools_schema 元工具(按名称获取某个工具的完整参数 schema) |
| compressLevel | off | L1 压缩层级:off \| light \| standard \| aggressive。standard 将描述裁剪为 200 字符 + 参数描述裁剪为 120;aggressive 还会丢弃可选参数(通过构造保证 required ⊆ properties)。仅适用于 dyn 段——core/hot 永不裁剪。 |
| compressEnabled | false | 已弃用的兼容项:compressLevel: off + compressEnabled: true 会被视为 standard |
| normalizeDescriptions | false | dyn 段描述清理:移除注入标记 + 空白规范化 + 保留第一句 + 300 字符上限 |
| category | {} | 意图路由 { "记忆/回忆/remember": ["mcp__viking"], ... }。关键词以 / 分隔(OR)。Category 优先于 aliases;每个匹配的服务器按服务器加载前 3 个。 |
| include | [] | 白名单:精确名称或 prefix。非空 → 仅注入匹配的工具(元工具豁免;deny 仍然优先)。执行不受 include 限制。 |
| toonifyResults | false | 执行后压缩长 JSON 结果(丢弃空字段 + 截断字符串;仅当文本块 >2000 字符且可解析为 JSON 时) |
| maxFoldMs | 50 | 硬性上限;超过此值则保留完整列表 |
| semanticEnabled | true | v0.1.8:tools_search 语义分支——BM25 + 本地 bge-m3(Ollama)RRF 混合。中文意图命中仅英文工具(已记录的 BM25 缺口)。索引惰性构建并磁盘缓存(~/.dsh/state/semantic-cache.json);Ollama 离线/超时时降级为仅 BM25,绝不会更慢或更差。 |
| ollamaBase | http://127.0.0.1:11434 | 语义分支的 Ollama 端点 |
| embedModel | bge-m3 | 语义分支的嵌入模型 |
| feedbackFile | '' | 反馈 JSON 路径(默认 $DSH_HOME/logs/tool-folder/) |
| aliases | built-in | 中文意图关键词 → 服务器前缀表(按服务器 top-K) |

文件

- lib/bm25.js — 零依赖 BM25(k1=1.2,b=0.75;中文二元组 + 英文词元)
- lib/semantic.js — v0.2.0 语义分支:本地 bge-m3 嵌入(Ollama)+ RRF 融合,磁盘缓存
- lib/chainguard.js — ChainGuard 防火墙:字面模式 + 外泄链检测 + 反混淆
- lib/obfuscation.js — v0.2.0 反混淆:拼接重建、-enc/certutil/bitsadmin 形态、同形异义字符
- lib/schema.js — L1 分层压缩(compressLevel)+ 描述规范化 + 无损 JSON 清理器
- lib/category.js — P1-1 意图类别路由(纯函数,可单元测试)
- lib/metrics.js — 热度/反馈持久化(折叠提升信号)
- lib/toonify.js — P2-2 长 JSON 结果压缩(纯函数)
- lib/index.js — 组装钩子、三段折叠、热度反馈、安全
- cordis.patch.yml — 捆绑插入声明
- test.js — 模拟 cordis 测试框架:node test.js

已知限制

- BM25 无法自行跨越中文查询 / 英文描述的语言鸿沟;别名表覆盖常见中文意图,并现已将其英文关键词桥接到按服务器的 BM25 评分中。未来的查询重写分支(ARK LLM,已在 GPT Researcher 智能检索器中验证)将彻底消除此问题。
- 别名命中会加载服务器 top-3 相关工具,而非整个服务器。对于某个服务器,其最相关工具在桥接的中文查询中排名较低时可能会漏掉——tools_search 元工具和热度提升是恢复路径。
- catalogEnabled 渲染行为需要一次运行时验证(章节渲染已验证;目录文本本身是标准的)。
- toonifyResults 在宿主 post-execute 瀑布流中对结果对象的修改尚未端到端验证(监听器的返回值是门控,而非结果主体)——纯函数 + 单元测试已就位;运行时传播需要一次验证。在此之前默认关闭。
- aggressive 压缩会向模型隐藏可选参数,因此本会使用它们的模型无法使用(执行仍会依据注册表的原始 schema 进行验证——C6)。standard 是安全的默认层级;aggressive 需主动选择。

变更日志

v0.2.5 — 红队防火墙修复 + 检索加固(2026-09-02)
1. 执行工具识别(红队 F1)——裸名匹配让 MCP 前缀
exec 工具(mcp__windows__Cmd)绕过高风险门禁;isExecTool 现在
对全名进行分词并匹配每个片段(所有片段都参与——
设计上偏保守,过度识别在门禁上几乎无代价)。
2. 误报根源 A/B —— Windows 路径呈 base64 形状(57 字符的伪
连续串),而 2>&1 中裸露的 & 看起来像 exec 动词;一次合法的 gitleaks
暂存扫描被拦截。路径指纹排除 + EXEC_VERB 收紧。
实测误报 2/5 → 0/5;回归套件 chainguard-fp.test.js(共 114 项全绿)。
3. 命令替换下载-执行分支 —— $(curl …) / 反引号 /
iwr 形态(无管道,对下载-管道模式不可见)。
4. BM25 子词切分 —— 连字符/下划线工具名原本是单个索引
词项(mcp__codegraph__codegraph_explore);实测召回率 0/10 → 10/10。
5. fallbackCatalog 轮询 —— 纯字典序切片会把整个服务器
(mcp__)从回退目录中隐藏;现在跨服务器轮询。
6. serverOf 统一 —— 删除了 apply-local 的 split("__") 副本;模块级
分组(native/openhands 系列)是搜索结果和
兄弟闭包的唯一来源。embedTimeoutMs 可配置(默认 8000)。
7. 双轴审计(2026-09-02):注释/测试现在与真实的保守
设计一致;一次性复现脚本已移除。

v0.2.4 — P1:批量 tools_schema + 兄弟闭包(2026-08-31)
1. 批量展开 —— tools_schema 接受 names: [...] 以在一次调用中展开多个
工具({ found, results: [...] });单个 name 保持
旧版 6 字段结构逐字节不变。
2. 兄弟闭包(closureSize,默认 0 = 关闭,沿用
maxWarmTools 兼容先例):启用时,展开一个工具还会列出
来自同一服务器前缀的轻量兄弟条目(名称 + 120 字符描述),
以便模型可以批量展开它实际需要的内容——
消除“展开了 A,现在又需要 B”的往返。closure: false 可按调用
选择退出。
3. 输出契约移至纯函数(buildSchemaResponse,ux.js)——
11 个新测试固定单条/批量/缺失/兄弟分支(共 94 项全绿)。
4. 双轴审计(标准 + 规范):审查期间修复 1 个严重问题——
单条/批量路由条件被反转(旧的仅 name 调用会
返回批量结构);契约测试现在能立即捕获这类问题。siblingClosure 死代码已移除。

v0.2.3 — fold-ux:搜索回退目录 + 查询扩展 + 稳定结果 + 发现统计(2026-08-30)
1. 零匹配回退目录(fallbackCatalogSize,默认 30):当
tools_search 找不到任何内容时,它返回按名称排序的轻量目录
(名称 + 80 字符描述)而不是空列表——模型永远不会
仅仅因为措辞不匹配就断定某个能力不存在。
total 报告真实目录大小(而非列出的切片);输出
带有 fallback: true。0 恢复旧版空结果。
2. 中→英查询扩展(queryExpandEnabled,默认开启):一张包含 48 个词的高频意图表会向搜索文本追加英文同义词(search/find、file、image/ocr、database、deploy、schedule……)。只添加词项,绝不重写原始查询;精确名称优先级仍然使用原始查询,因此精确查找与 v0.2.2 逐字节一致。
3. 稳定结果(createSearchCache,60 秒 TTL / LRU 200):同一查询在多轮之间返回相同的结果集——消除逐轮候选漂移。
4. 发现统计(recordDiscoveries):每个被找到的工具都会被计数并持久化(30 秒节流,合并进 tool-folder-state.json);重启时记录前 5 名,以便识别低发现率的工具并改进其描述(Anthropic 的“监控发现率”循环)。
5. 83 项测试通过(新增 11 项:ux 模块)。
6. 三轴审计(标准 / 规范 / 兼容性):修复 1 个 P1——warm 和 discovery 状态现在合并写入共享状态文件,而不是互相覆盖;P2 加固——tools_search execute 获得了整体 fail-open 捕获,澄清了回退 total 的语义,将注释更正为进程级作用域。

v0.2.2 — 分层披露预算 + 热 LRU + 增量语义缓存(2026-08-30)
1. 分层披露预算(disclosureBudget,默认 0 = 关闭):限制每个请求披露多少个工具名称 + 描述。超出预算时,工具会逐层降级(T2 名称+描述 → T3 仅名称 → T4 隐藏),而不是被整体丢弃;核心/热/元工具保持第 1 层,永不降级。
2. 热 LRU(maxWarmTools,默认 0 = 关闭):最近使用过的工具会保留在有界 LRU 中可见,并持久化到状态,因此重启后仍保持热状态。0 保持与旧版完全相同的注入面。
3. 增量语义缓存:bge-m3 嵌入缓存现在按内容指纹进行差异比较——只有文本发生变化的文档才会被重新嵌入,模型变更时只重建一次。刷新失败绝不会覆盖良好的缓存。
4. 配置持久化:lib/storage.js 通过 settings → state → memory 的回退链读写状态(绝不触碰 cordis.patch.yml)。
5. 显式 fail-open:missingMetaTools 控制元工具的可用性——任何快照异常都会返回完整工具列表,而不是折叠后的列表。
6. 72 项测试通过(新增:budget 8 / warm 8 / semantic-incremental 5 / storage 7 / fail-open 4)。

v0.2.1 — 热度衰减 + 精确名称优先级(2026-08-30)
1. 热热度衰减(hotWindowDays,默认 3):只有当工具的调用次数保持在滑动窗口内时,才会被提升为始终可见——旧代码会永久提升,因此任何被使用过 3 次的工具都会永久驻留,折叠效果随时间悄然衰减为零。旧版 feedback.json 中的数字条目会被读取为窗口外 → 其过期热度自然失效。设置 hotWindowDays: 0 可保留旧行为。
2. tools_search 中的精确名称优先级:精确的工具名称匹配始终
排在最前,长度 ≥4 个字符且为名称子串的查询会被提到
BM25/语义命中之前(确定性回退链)。结果保持
去重。
3. 40 个测试通过(11 个新增:窗口衰减 / 旧版兼容 / 优先级顺序)。

v0.2.0 — 首个 npm 发布版本(2026-08-30)
这是发布到 npm 的首个版本。它捆绑了 v0.1.7 防火墙
作用域修复(仅对 exec 硬阻断)以及下文记录的 v0.1.8 语义分支 +
反混淆工作。npm 上的 0.1.x 系列早于这一切;如果你之前从
npm 安装过,请升级到 0.2.0。

下面的 v0.1.7 / v0.1.8 条目使用本地内部迭代编号——
npm 0.1.x 包不包含这些工作。这里的一切仅在
0.2.0 中发布。

v0.1.8(内部)— 语义分支 + 反混淆(2026-08-30)
1. tools_search 语义分支:BM25 + 本地 bge-m3(Ollama)RRF 混合——
中文意图可以命中不共享任何表面词元的纯英文工具(已记录的
BM25 缺口,见 README 已知限制)。文档嵌入按内容指纹为键
缓存到 ~/.dsh/state/semantic-cache.json;300+ 个工具的
约 10 秒冷启动只发生一次。任何失败(Ollama 宕机、
超时、缓存不可读)都会降级为纯 BM25。
2. ChainGuard 反混淆分支(lib/obfuscation.js):verdict() 现在
运行三个分支——(a) 对原始文本的字面模式;(b) 去混淆后的
文本(引号拼接 "ne"+"t user" / -join 重建)重新
通过字面模式运行;(c) 任何字面模式都无法看到的编码形态:
-enc base64、certutil -decode 链、bitsadmin /transfer、
长 base64 载荷 + exec 动词、全角同形字(curl)、
组合标记篡改、十六进制转义字节。全部为纯正则/字符串运算,
零依赖,同步(pre-execute 是同步回调)。由 22 个单元
测试覆盖(全部通过);无害拼接("Get"+"-ChildItem")仍
通过。
3. 新配置:semanticEnabled / ollamaBase / embedModel。

v0.1.7(内部)— ChainGuard 误报修复(2026-08-30)
1. P0 防火墙限定于 exec 工具:tools/pre-execute 高风险硬
阻断(verdict())现在仅适用于 exec 类型工具(isExecTool:
pwsh/shell/bash/cmd/exec/run/terminal + run_/exec_/ssh_/wsl
前缀)。此前它会针对每个工具的实参运行,因此
内容类型工具(write/edit/read——其实参是文件内容或
文本)只要其载荷仅仅包含危险命令字面量(例如编写测试脚本、
安全分析,或引用危险命令示例的
文档),就会被硬阻断。已验证:包含此类字面量的内容写入
此前会被阻断,现在被允许;exec 工具仍会
硬阻断真正的危险命令。isExecTool 分类由
一个 25 用例单元检查覆盖(全部通过)。
2. 保留的作用域:外泄链检测(checkChain,post-execute,仅警告)
和 deny 配置保持不变——它们从不硬性阻止内容工具。

v0.1.6 — 设置 UI schema(2026-08-25)
1. 导出 Config schema(schemastery):现在每个开关都会在 DSH 设置 UI 中渲染为
原生表单——不再需要手动编辑 YAML。该 schema 与 DEFAULTS 一一对应
(18 个字段:enabled / core / deny / topK /
hotThreshold / catalogEnabled / compressLevel / compressEnabled /
schemaToolEnabled / normalizeDescriptions / category / include /
toonifyResults / toolSearchEnabled / firewallEnabled / maxFoldMs /
feedbackFile / aliases),每个字段都有中文描述和范围
约束(topK 0-50,hotThreshold ≥1,maxFoldMs 0-1000)。无效值
会被拒绝并给出精确消息("expected off | light | standard |
aggressive but got X")。与 @deepseek-ai/dsh-tool-todo 采用相同模式
(z.object + .default(),schemastery ~standard 桥接)。
2. 依赖:@deepseek-ai/schemastery + zod(两者均为 dependencies,
与官方插件模式一致——~standard 桥接需要 zod 适配器)。

v0.1.5 — tools_schema + 分层压缩 + 意图路由(2026-08-25)
1. P0-1 tools_schema 元工具:由模型驱动的、按名称获取单个工具完整 schema 的
发现机制(tools_search 的补充)。输出为 {schema:{type:"json"}}
(宿主契约 C3——严格的 object schema 会以 "is not a declared property" 拒绝
任意工具 schema)。其返回值会经过 sanitizeLossless 深度清洗
(C4:const:-0/NaN 绝不会泄漏)。元工具现在由共享的 META_TOOLS 块
管理,使 tools_search 和 tools_schema 始终保持可见。
2. P0-2 compressLevel 分层:light/standard/aggressive 取代了
单一的保守裁剪。aggressive 会丢弃可选参数,并根据
required 重建 properties,从而以构造方式保证 required ⊆ properties 成立
(C8)。必需属性绝不会被丢弃;$ref/oneOf/items 深层
结构绝不会被触碰;非 object 根参数 schema 仅进行
描述裁剪。compressEnabled: true 仍作为 standard 的已弃用
兼容别名保留。
3. P1-1 category 意图路由:{ "记忆/回忆": ["mcp__viking"] } 将
查询路由到显式的服务器前缀(按服务器取前 3,BM25 桥接),并优先于
别名表。默认 {} = 零行为变化。
4. P1-2 normalizeDescriptions:dyn 段描述会被清洗
(移除提示注入标记)、折叠空白、保留首句,
并限制在 300 个字符以内。核心/热门描述绝不会被触碰。
5. P2-1 include 白名单:精确名称或 prefix;非空 → 仅
匹配的工具进入注入池。元工具豁免(白名单
绝不能隐藏发现工具),deny 仍然优先,且执行绝不会
受 include 门控(C5)。
6. P2-2 toonifyResults(默认关闭):对长 JSON 执行后压缩
文本块(>2000 字符)——丢弃空字段,截断长字符串。任何
解析/压缩失败都会保持原始结果不变。纯函数位于
lib/toonify.js;宿主 waterfall 传播仍需在运行时确认
(见已知限制)。
7. 测试:33 → 综合测试套件(约 50+ 项检查),覆盖每个新功能
以及针对红线的回归防护($ref 不被改动、核心不被改动、
required ⊆ properties、无损 JSON、deny 优先于 include)。

v0.1.4 — 审计修复(2026-08-25)
1. P0 防火墙契约已修复(tools/pre-execute):监听器现在
返回 { kind: "deny", reason } 以拒绝(宿主契约已验证:
prepareExecution 读取 gate.kind / gate.reason;exec 具有
{ callId, name, arguments, agent, signal } —— 旧的 payload.deny()
调用和 toolName/argv 字段从未存在过,因此高风险拦截实际上
从未触发)。
2. P0 反馈循环已恢复(tools/post-execute):热度计数、
外泄链记录、覆盖率和会话持久化已从
agent/pre-step(其 payload 没有 toolCalls)移至 tools/post-execute
(每次执行工具时触发,带有 exec.name/exec.arguments)。反馈现在
确实会持久化,并在重启后提升热度。
3. P0 ESM 崩溃已移除:在 "type": "module" 下调用 require("node:fs")
会抛出 ReferenceError,并静默终止所有反馈持久化;已替换
为顶层 import fs / import path。还修复了一个参数遮蔽
缺陷(path 参数在 persistFeedback 中遮蔽了 node:path 模块)。
4. P1 别名整服务器拉取已修复:别名命中现在加载每个服务器的
BM25 top-K(min(3, serverSize)),并将别名关键词桥接进
查询,而不是拖入匹配服务器的每一个工具。
5. P1 拒绝配置已添加:deny: [](精确名称或 prefix)会从
注入面中移除工具,并在
tools/pre-execute 处拒绝其执行。拒绝优先于核心和目录。
6. P2 停用词过度移除已修复:从英文停用词集中移除了
list/get/set/make/use(ing) —— 它们是工具名称/描述中的高频
词(list_sessions、get_config),此前一直在侵蚀检索信号。
7. P2 -0 防御:指标现在将 -0 规范化为 0(DSH 无损 JSON
拒绝 -0)。
8. P2 默认值翻转:catalogEnabled 默认为 true(折叠安全网 ——
模型可以看到存在隐藏工具)。compressEnabled 保持关闭
(L1 尚未完全验证)。
9. 测试:测试套件从 15 项扩展到 29 项检查,覆盖拒绝返回
契约、tools/post-execute 接收 exec.name、拒绝配置
(注入 + 执行)、别名按服务器 top-K、无 require 的 ESM 卫生,以及
无 -0 指标输出。
10. NEW-1(QA 发现,低):三个对反斜杠敏感的防火墙正则
(HKLM\SAM、\system32\config、\Run)在 argv
以 JSON 编码形式到达 verdict() 时(单反斜杠 → \\)静默地从未匹配。已将 \\
改为 \\+,这样原始字符串和 JSON 编码的路径都会被阻止。新增了 4 项
回归检查(测试套件现为 33 项)。

v0.1.3 — 初始版本(2026-08-24)

质量检查(2026-08-24,真实 45 工具集)

使用真实工具列表(转换为 DSH 公共名称
mcp____)进行全流程测试,7 个典型查询:

| 查询 | 结果 | 判定 |
|---|---|---|
| delegate a coding task to openhands | 7 个 openhands 工具 | ✅ |
| 帮我记住这个事实 / 查记忆 记住 回忆 | 前 3 个 viking 工具(别名,按服务器取前 K 个) | ✅ |
| fetch library documentation | 2 个 context7 工具 | ✅ |
| start a learning session | 前 3 个 deeptutor 工具(别名,按服务器取前 K 个) | ✅ |
| 复杂推理任务 深度思考 | deeptutor deep_* + reasonix + openhands | ✅ |
| 搜索代码 semantic search | viking grep/glob + reasonix code | ✅ |

- 折叠比例:45 个工具 → 每个查询可见 2-18 个(平均约 8 个)≈ -82% schema token
- v0.1.4:别名命中现在按相关性限制在服务器的前 3 个,而不是
把整个服务器拉进来(v2 的按服务器取前 K 个优化现已生效)。
- BM25 在某些查询上显示出轻微的词汇噪声(例如在
openhands 查询上出现 cancel_watch)——模型会在综合阶段过滤掉这些。

检查过程中发现并修复的 bug
1. tools_search 自我隐藏(真实 bug):这个元工具被它自己的
过滤器折叠了,因此模型永远看不到它。现在始终保持可见。
2. 测试数据错误(不是代码 bug):原始 MCP 工具名称与 DSH 公共
名称(mcp____,已在 dsh-mcp-client
的 publicToolName 中验证)不一致。该插件的前缀逻辑一直都是正确的。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群