dsh-agy-link 0.4.78 → 0.4.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.79 (2026-10-29)
4
+
5
+ ### English
6
+
7
+ - **Fix(mcp): never silently drop tools whose names collide after MCP normalization.**
8
+ - `toMcpName()` maps any non-`[A-Za-z0-9_-]` character to `_`, so distinct DSH tools like `a.b` and `a_b` normalized to the same MCP name and the second was silently removed from `/tools` — hiding a real, possibly allowlisted, tool from the agent. Colliding names are now disambiguated with a stable `__<n>` suffix; `bridge.mjs` still calls back by the exact `_dshName`, so execution is unaffected. Adds a regression test.
9
+
10
+ ### 中文
11
+
12
+ - **修复(mcp):名称经 MCP 归一化后撞名的工具不再被静默丢弃。**
13
+ - `toMcpName()` 会把非 `[A-Za-z0-9_-]` 字符替换成 `_`,于是 `a.b` 与 `a_b` 这类不同工具会归一化成同一个 MCP 名,第二个被从 `/tools` 静默删除,导致一个真实(且可能已加入 allowlist 的)工具对 agent 不可见。现在撞名会加稳定的 `__<n>` 后缀消歧;`bridge.mjs` 仍按精确 `_dshName` 回调,执行不受影响。补充回归测试。
14
+
15
+ **Full Changelog**: https://github.com/amlyczz/dsh-agy-link/compare/v0.4.78...v0.4.79
16
+
3
17
  ## 0.4.78 (2026-10-29)
4
18
 
5
19
  ### English
package/dist/index.js CHANGED
@@ -34773,22 +34773,22 @@ function startMcpBridge(opts) {
34773
34773
  }
34774
34774
  const allow = opts.allowlist().split(",").map((s) => s.trim()).filter(Boolean);
34775
34775
  const allowSet = new Set(allow);
34776
- const seen = /* @__PURE__ */ new Set();
34777
- sendJson(res, 200, { tools: svc.schemas().filter((t) => allow.length === 0 || allowSet.has(t.name)).filter((t) => {
34778
- if (INTERNAL_TOOL_NAMES.has(t.name)) return false;
34779
- const mapped = toMcpName(t.name);
34780
- if (seen.has(mapped)) return false;
34781
- seen.add(mapped);
34782
- return true;
34783
- }).map((t) => ({
34784
- name: toMcpName(t.name),
34785
- dshName: t.name,
34786
- description: t.description,
34787
- inputSchema: {
34788
- type: "object",
34789
- ...t.parameters
34790
- }
34791
- })) });
34776
+ const used = /* @__PURE__ */ new Set();
34777
+ sendJson(res, 200, { tools: svc.schemas().filter((t) => allow.length === 0 || allowSet.has(t.name)).filter((t) => !INTERNAL_TOOL_NAMES.has(t.name)).map((t) => {
34778
+ const base = toMcpName(t.name);
34779
+ let name = base;
34780
+ for (let i = 2; used.has(name); i++) name = base + "__" + i;
34781
+ used.add(name);
34782
+ return {
34783
+ name,
34784
+ dshName: t.name,
34785
+ description: t.description,
34786
+ inputSchema: {
34787
+ type: "object",
34788
+ ...t.parameters
34789
+ }
34790
+ };
34791
+ }) });
34792
34792
  return;
34793
34793
  }
34794
34794
  if (req.method === "POST" && (url === "/call" || url === "/mcp/call")) {
@@ -120,6 +120,9 @@ reference-counted slot is the strongest isolation the plugin can provide.
120
120
  loopback endpoint also caps request bodies (8 MiB → HTTP 413) and compares the
121
121
  bearer token in constant time, so a token-holding but prompt-injected child
122
122
  cannot OOM the host with an unbounded body or probe the token via timing.
123
+ Distinct DSH tool names that normalize to the same MCP name (e.g. `a.b`
124
+ and `a_b`) are disambiguated with a stable suffix instead of being silently
125
+ dropped, so every real tool stays reachable.
123
126
  Every bridged call is audit-logged as `mcp call <tool> [<outcome>] <ms>` with
124
127
  the caller class and the failure text (never the arguments), so a failed run
125
128
  is visible in journald instead of only in transcripts.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-agy-link",
3
- "version": "0.4.78",
3
+ "version": "0.4.79",
4
4
  "description": "Google Antigravity (agy CLI) models for DeepSeek Harness — stream Gemini/Claude/GPT-OSS subscriptions into DSH with thinking, tool activity, token usage and in-GUI Google OAuth login.",
5
5
  "type": "module",
6
6
  "license": "MIT",