@skaile/workspaces 4.17.0 → 4.19.0

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.
Files changed (140) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/{asset-feeds-MQKQDF3R.js → asset-feeds-VXK6SHWK.js} +4 -4
  3. package/dist/{asset-feeds-MQKQDF3R.js.map → asset-feeds-VXK6SHWK.js.map} +1 -1
  4. package/dist/asset-manager/index.js +1 -1
  5. package/dist/bridge/codex-app-server.js +2 -1
  6. package/dist/bridge/drivers/claude-sdk.js +21 -151
  7. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  8. package/dist/bridge/drivers/codex.js +4 -3
  9. package/dist/bridge/drivers/codex.js.map +1 -1
  10. package/dist/bridge/drivers/continue.js +4 -3
  11. package/dist/bridge/drivers/continue.js.map +1 -1
  12. package/dist/bridge/drivers/echo.js +1 -1
  13. package/dist/bridge/drivers/gemini.js +6 -5
  14. package/dist/bridge/drivers/goose.js +4 -3
  15. package/dist/bridge/drivers/goose.js.map +1 -1
  16. package/dist/bridge/drivers/omp.js +813 -40
  17. package/dist/bridge/drivers/omp.js.map +1 -1
  18. package/dist/bridge/drivers/opencode.js +4 -3
  19. package/dist/bridge/drivers/opencode.js.map +1 -1
  20. package/dist/bridge/drivers/qwen.js +6 -5
  21. package/dist/bridge/drivers/qwen.js.map +1 -1
  22. package/dist/bridge/index.js +5 -4
  23. package/dist/bridge/src/agent-exec.d.ts +6 -0
  24. package/dist/bridge/src/agent-exec.d.ts.map +1 -1
  25. package/dist/bridge/src/agent-transcript.d.ts +18 -0
  26. package/dist/bridge/src/agent-transcript.d.ts.map +1 -0
  27. package/dist/bridge/src/codex-app-server.d.ts.map +1 -1
  28. package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +1 -1
  29. package/dist/bridge/src/drivers/claude-sdk.d.ts +2 -0
  30. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  31. package/dist/bridge/src/drivers/omp.d.ts +287 -7
  32. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  33. package/dist/bridge/src/drivers/scrub-transcript.d.ts +29 -0
  34. package/dist/bridge/src/drivers/scrub-transcript.d.ts.map +1 -1
  35. package/dist/bridge/src/index.d.ts +2 -0
  36. package/dist/bridge/src/index.d.ts.map +1 -1
  37. package/dist/bridge/src/normalizer.d.ts +5 -0
  38. package/dist/bridge/src/normalizer.d.ts.map +1 -1
  39. package/dist/{chunk-C3YE4REG.js → chunk-25BOOOSM.js} +3 -3
  40. package/dist/{chunk-C3YE4REG.js.map → chunk-25BOOOSM.js.map} +1 -1
  41. package/dist/{chunk-XRTOSEF3.js → chunk-66MJRB6K.js} +2 -2
  42. package/dist/{chunk-XRTOSEF3.js.map → chunk-66MJRB6K.js.map} +1 -1
  43. package/dist/{chunk-NYDTZ2MK.js → chunk-66WUZ3XL.js} +5 -5
  44. package/dist/{chunk-NYDTZ2MK.js.map → chunk-66WUZ3XL.js.map} +1 -1
  45. package/dist/{chunk-3W7AOGPY.js → chunk-6S5KL76M.js} +225 -46
  46. package/dist/chunk-6S5KL76M.js.map +1 -0
  47. package/dist/{chunk-4RKCOURU.js → chunk-6V3DMJPL.js} +3 -3
  48. package/dist/{chunk-4RKCOURU.js.map → chunk-6V3DMJPL.js.map} +1 -1
  49. package/dist/{chunk-6F4TIY7X.js → chunk-EBYSCP6J.js} +4 -4
  50. package/dist/{chunk-6F4TIY7X.js.map → chunk-EBYSCP6J.js.map} +1 -1
  51. package/dist/{chunk-D5CRFGDL.js → chunk-EEODEEKX.js} +16 -3
  52. package/dist/chunk-EEODEEKX.js.map +1 -0
  53. package/dist/{chunk-2AQIFJHK.js → chunk-EPSCLN5W.js} +3 -3
  54. package/dist/{chunk-2AQIFJHK.js.map → chunk-EPSCLN5W.js.map} +1 -1
  55. package/dist/{chunk-AAZDYM5D.js → chunk-J3K5O6XA.js} +3 -3
  56. package/dist/{chunk-AAZDYM5D.js.map → chunk-J3K5O6XA.js.map} +1 -1
  57. package/dist/{chunk-4F2L7WPU.js → chunk-K4O6L3WH.js} +5 -3
  58. package/dist/chunk-K4O6L3WH.js.map +1 -0
  59. package/dist/{chunk-JURHZYOY.js → chunk-P6S5K7AI.js} +3 -3
  60. package/dist/{chunk-JURHZYOY.js.map → chunk-P6S5K7AI.js.map} +1 -1
  61. package/dist/{chunk-3VGQLF3N.js → chunk-RGB45PIL.js} +2 -2
  62. package/dist/{chunk-3VGQLF3N.js.map → chunk-RGB45PIL.js.map} +1 -1
  63. package/dist/{chunk-AOFJ2OKW.js → chunk-RYIWFV67.js} +2 -2
  64. package/dist/{chunk-AOFJ2OKW.js.map → chunk-RYIWFV67.js.map} +1 -1
  65. package/dist/{chunk-WOE4LPGF.js → chunk-S4R3WNRF.js} +3 -3
  66. package/dist/{chunk-WOE4LPGF.js.map → chunk-S4R3WNRF.js.map} +1 -1
  67. package/dist/{chunk-Z7KDOGKF.js → chunk-T6QGP5HN.js} +6 -6
  68. package/dist/{chunk-Z7KDOGKF.js.map → chunk-T6QGP5HN.js.map} +1 -1
  69. package/dist/{chunk-7EAJNEQ5.js → chunk-VXY6LSQ3.js} +6 -6
  70. package/dist/{chunk-7EAJNEQ5.js.map → chunk-VXY6LSQ3.js.map} +1 -1
  71. package/dist/{chunk-3H4HP733.js → chunk-W2SDSDR7.js} +23 -13
  72. package/dist/chunk-W2SDSDR7.js.map +1 -0
  73. package/dist/chunk-X5O56UO4.js +151 -0
  74. package/dist/chunk-X5O56UO4.js.map +1 -0
  75. package/dist/{chunk-RAHLV6QG.js → chunk-XAKGLR4Y.js} +6 -6
  76. package/dist/{chunk-RAHLV6QG.js.map → chunk-XAKGLR4Y.js.map} +1 -1
  77. package/dist/chunk-YROR332M.js +25 -0
  78. package/dist/chunk-YROR332M.js.map +1 -0
  79. package/dist/{chunk-YXXEHY7D.js → chunk-YUH46KA7.js} +6 -4
  80. package/dist/chunk-YUH46KA7.js.map +1 -0
  81. package/dist/cli/index.js +33 -32
  82. package/dist/cli/index.js.map +1 -1
  83. package/dist/connectors/index.js +6 -5
  84. package/dist/{ensure-sources-6XKA46PN.js → ensure-sources-WYXFJWUO.js} +4 -4
  85. package/dist/{ensure-sources-6XKA46PN.js.map → ensure-sources-WYXFJWUO.js.map} +1 -1
  86. package/dist/factory-assets/connectors/box.js +6 -5
  87. package/dist/factory-assets/connectors/deploy.js +6 -5
  88. package/dist/factory-assets/connectors/devserver.js +6 -5
  89. package/dist/factory-assets/connectors/flow/adapter.js +6 -5
  90. package/dist/factory-assets/connectors/flow/run-flow.js +7 -6
  91. package/dist/factory-assets/connectors/flow.js +6 -5
  92. package/dist/factory-assets/connectors/git.js +6 -5
  93. package/dist/factory-assets/connectors/gmail.js +6 -5
  94. package/dist/factory-assets/connectors/googledrive.js +6 -5
  95. package/dist/factory-assets/connectors/local.js +6 -5
  96. package/dist/factory-assets/connectors/mattermost.js +6 -5
  97. package/dist/factory-assets/connectors/memory.js +6 -5
  98. package/dist/factory-assets/connectors/minio.js +6 -5
  99. package/dist/factory-assets/connectors/postgres.js +6 -5
  100. package/dist/factory-assets/connectors/s3.js +6 -5
  101. package/dist/factory-assets/connectors/sharepoint.js +6 -5
  102. package/dist/factory-assets/connectors/sqlite.js +6 -5
  103. package/dist/factory-assets/connectors/static-server.js +6 -5
  104. package/dist/factory-assets/connectors/tunnel.js +6 -5
  105. package/dist/factory-assets/connectors/webdav.js +6 -5
  106. package/dist/factory-assets/connectors/xstate-store.js +6 -5
  107. package/dist/factory-assets/connectors/xstate.js +6 -5
  108. package/dist/{helpers-6I4SY2S7.js → helpers-TANA2HQT.js} +4 -4
  109. package/dist/{helpers-6I4SY2S7.js.map → helpers-TANA2HQT.js.map} +1 -1
  110. package/dist/{library-publish-PPNFBAVH.js → library-publish-JQNTMKZG.js} +6 -6
  111. package/dist/{library-publish-PPNFBAVH.js.map → library-publish-JQNTMKZG.js.map} +1 -1
  112. package/dist/{open-library-64LO64NE.js → open-library-NKZ4HJJ6.js} +5 -5
  113. package/dist/{open-library-64LO64NE.js.map → open-library-NKZ4HJJ6.js.map} +1 -1
  114. package/dist/{project-3UFTV7DL.js → project-AEAM2ZEW.js} +5 -5
  115. package/dist/{project-3UFTV7DL.js.map → project-AEAM2ZEW.js.map} +1 -1
  116. package/dist/runner/index.js +9 -8
  117. package/dist/runner/src/serve-credentials.d.ts +2 -1
  118. package/dist/runner/src/serve-credentials.d.ts.map +1 -1
  119. package/dist/runner/src/serve.d.ts.map +1 -1
  120. package/dist/sdk/asset-manager.js +1 -1
  121. package/dist/sdk/bridge.js +5 -4
  122. package/dist/sdk/index.js +9 -8
  123. package/dist/sdk/index.js.map +1 -1
  124. package/dist/sdk/runner.js +9 -8
  125. package/dist/{setup-JGXLTJ57.js → setup-Q7ACRV72.js} +10 -9
  126. package/dist/setup-Q7ACRV72.js.map +1 -0
  127. package/dist/{source-NHEYY7WH.js → source-QXQ3NO46.js} +6 -6
  128. package/dist/{source-NHEYY7WH.js.map → source-QXQ3NO46.js.map} +1 -1
  129. package/dist/{source-manifest-publish-IJLVR3IL.js → source-manifest-publish-UKWCZA2M.js} +7 -7
  130. package/dist/{source-manifest-publish-IJLVR3IL.js.map → source-manifest-publish-UKWCZA2M.js.map} +1 -1
  131. package/dist/tui/index.js +9 -8
  132. package/dist/tui/index.js.map +1 -1
  133. package/dist/workspace-plugin/index.js +1 -1
  134. package/package.json +1 -1
  135. package/dist/chunk-3H4HP733.js.map +0 -1
  136. package/dist/chunk-3W7AOGPY.js.map +0 -1
  137. package/dist/chunk-4F2L7WPU.js.map +0 -1
  138. package/dist/chunk-D5CRFGDL.js.map +0 -1
  139. package/dist/chunk-YXXEHY7D.js.map +0 -1
  140. package/dist/setup-JGXLTJ57.js.map +0 -1
@@ -0,0 +1,151 @@
1
+ import { createLogger } from './chunk-BOFL7GIF.js';
2
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
3
+ import { Ajv2020 } from 'ajv/dist/2020.js';
4
+
5
+ var TOOL_PROPERTY_KEY_PATTERN = /^[a-zA-Z0-9_.-]{1,64}$/;
6
+ var DRAFT_2020_12_META = "https://json-schema.org/draft/2020-12/schema";
7
+ var PROBE_TIMEOUT_MS = 5e3;
8
+ var metaValidator = null;
9
+ function draft202012MetaValidator() {
10
+ if (metaValidator) return metaValidator;
11
+ const ajv = new Ajv2020({ strict: false, validateFormats: false, logger: false });
12
+ const validate = ajv.getSchema(DRAFT_2020_12_META);
13
+ if (!validate) throw new Error("ajv draft 2020-12 meta-schema is unavailable");
14
+ metaValidator = validate;
15
+ return validate;
16
+ }
17
+ function checkToolPropertyKeys(schema) {
18
+ if (!schema || typeof schema !== "object" || Array.isArray(schema)) return null;
19
+ const props = schema.properties;
20
+ if (!props || typeof props !== "object" || Array.isArray(props)) return null;
21
+ for (const key of Object.keys(props)) {
22
+ if (!TOOL_PROPERTY_KEY_PATTERN.test(key)) {
23
+ return `property key ${JSON.stringify(key)} does not match ${TOOL_PROPERTY_KEY_PATTERN.source}`;
24
+ }
25
+ }
26
+ return null;
27
+ }
28
+ function checkToolInputSchema(schema) {
29
+ if (!schema || typeof schema !== "object" || Array.isArray(schema)) {
30
+ return "input schema is not a JSON object";
31
+ }
32
+ const keyReason = checkToolPropertyKeys(schema);
33
+ if (keyReason) return keyReason;
34
+ const validate = draft202012MetaValidator();
35
+ if (!validate(schema)) {
36
+ const first = validate.errors?.[0];
37
+ const where = first?.instancePath || "/";
38
+ return `not valid JSON Schema draft 2020-12: ${where} ${first?.message ?? "is invalid"}`;
39
+ }
40
+ return null;
41
+ }
42
+ var filteredInstances = /* @__PURE__ */ new WeakMap();
43
+ function sdkInstanceOf(config) {
44
+ if (!config || typeof config !== "object") return null;
45
+ const c = config;
46
+ if (c.type !== "sdk" || !c.instance || typeof c.instance !== "object") return null;
47
+ const inst = c.instance;
48
+ return typeof inst.connect === "function" && typeof inst.close === "function" ? inst : null;
49
+ }
50
+ function withTimeout(p, what) {
51
+ let timer;
52
+ const timeout = new Promise((_, reject) => {
53
+ timer = setTimeout(() => reject(new Error(`${what} timed out`)), PROBE_TIMEOUT_MS);
54
+ });
55
+ return Promise.race([p, timeout]).finally(() => clearTimeout(timer));
56
+ }
57
+ async function listInProcessTools(instance) {
58
+ const [clientSide, serverSide] = InMemoryTransport.createLinkedPair();
59
+ const pending = /* @__PURE__ */ new Map();
60
+ clientSide.onmessage = (msg) => {
61
+ const m = msg;
62
+ const id = typeof m.id === "number" ? m.id : void 0;
63
+ if (id === void 0) return;
64
+ pending.get(id)?.(m);
65
+ pending.delete(id);
66
+ };
67
+ let nextId = 1;
68
+ const call = (method, params) => withTimeout(
69
+ new Promise((resolve, reject) => {
70
+ const id = nextId++;
71
+ pending.set(id, resolve);
72
+ clientSide.send({ jsonrpc: "2.0", id, method, params }).catch(reject);
73
+ }),
74
+ method
75
+ ).then((res) => {
76
+ if (res.error) throw new Error(`${method} failed: ${JSON.stringify(res.error)}`);
77
+ return res.result ?? {};
78
+ });
79
+ await clientSide.start();
80
+ await instance.connect(serverSide);
81
+ try {
82
+ await call("initialize", {
83
+ protocolVersion: "2025-06-18",
84
+ capabilities: {},
85
+ clientInfo: { name: "skaile-tool-schema-filter", version: "1.0.0" }
86
+ });
87
+ await clientSide.send({ jsonrpc: "2.0", method: "notifications/initialized" });
88
+ const tools = [];
89
+ let cursor;
90
+ do {
91
+ const page = await call("tools/list", cursor ? { cursor } : {});
92
+ tools.push(...page.tools ?? []);
93
+ cursor = typeof page.nextCursor === "string" ? page.nextCursor : void 0;
94
+ } while (cursor);
95
+ return tools;
96
+ } finally {
97
+ await instance.close().catch(() => {
98
+ });
99
+ }
100
+ }
101
+ var defaultLog = createLogger({ kind: "mcp", subkind: "tool-schema-filter" });
102
+ async function filterInProcessMcpServerTools(server, config, log = defaultLog) {
103
+ const instance = sdkInstanceOf(config);
104
+ if (!instance) return [];
105
+ const cached = filteredInstances.get(instance);
106
+ if (cached) return cached;
107
+ const registered = instance._registeredTools;
108
+ if (!registered || Object.keys(registered).length === 0) return [];
109
+ if (instance.isConnected?.()) {
110
+ log.debug("in-process MCP server already connected; schema check skipped", { server });
111
+ return [];
112
+ }
113
+ let wireTools;
114
+ try {
115
+ wireTools = await listInProcessTools(instance);
116
+ } catch (err) {
117
+ log.warn("could not inspect in-process MCP server tools; passing it unchanged", {
118
+ server,
119
+ error: err instanceof Error ? err.message : String(err)
120
+ });
121
+ return [];
122
+ }
123
+ const dropped = [];
124
+ for (const tool of wireTools) {
125
+ const reason = checkToolInputSchema(tool.inputSchema);
126
+ if (!reason) continue;
127
+ const handle = registered[tool.name];
128
+ if (typeof handle?.disable !== "function") {
129
+ log.warn("MCP tool has an invalid input schema but cannot be disabled", {
130
+ server,
131
+ tool: tool.name,
132
+ reason
133
+ });
134
+ continue;
135
+ }
136
+ handle.disable();
137
+ dropped.push({ server, tool: tool.name, reason });
138
+ log.warn("MCP tool dropped: invalid input schema", { server, tool: tool.name, reason });
139
+ }
140
+ filteredInstances.set(instance, dropped);
141
+ return dropped;
142
+ }
143
+ function formatDroppedToolsNotice(dropped) {
144
+ if (dropped.length === 0) return null;
145
+ const items = dropped.map((d) => `${d.tool} (server ${d.server}: ${d.reason})`).join("; ");
146
+ return `Some MCP tools were not loaded because the Claude API would reject their input schema: ${items}. Do not try to call them.`;
147
+ }
148
+
149
+ export { checkToolInputSchema, checkToolPropertyKeys, filterInProcessMcpServerTools, formatDroppedToolsNotice };
150
+ //# sourceMappingURL=chunk-X5O56UO4.js.map
151
+ //# sourceMappingURL=chunk-X5O56UO4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bridge/src/mcp-tool-schema-filter.ts"],"names":[],"mappings":"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","file":"chunk-X5O56UO4.js","sourcesContent":["/**\n * Drop MCP tools whose input schema the Claude API would reject.\n *\n * The API refuses a whole request when any one tool fails either check below,\n * so a single bad tool turns every turn of the session into a 400. The Claude\n * CLI drops such tools itself, but only after it has fetched its remote\n * feature flags; with flag fetching off (`DISABLE_TELEMETRY=1` and friends)\n * it sends them as they are. The driver therefore runs both checks itself\n * before any tool reaches the CLI:\n *\n * 1. every top-level property key matches {@link TOOL_PROPERTY_KEY_PATTERN};\n * 2. the schema is valid JSON Schema draft 2020-12 (ajv's meta-schema).\n *\n * In-process servers are inspected through their own `tools/list`, over an\n * in-memory transport, so the checked schema is byte-for-byte what the CLI\n * would receive (zod shape → JSON Schema exactly as the server converts it).\n */\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport { Ajv2020, type ValidateFunction } from \"ajv/dist/2020.js\";\n\n/** The Claude API's rule for top-level `input_schema.properties` keys. */\nexport const TOOL_PROPERTY_KEY_PATTERN = /^[a-zA-Z0-9_.-]{1,64}$/;\n\nconst DRAFT_2020_12_META = \"https://json-schema.org/draft/2020-12/schema\";\nconst PROBE_TIMEOUT_MS = 5_000;\n\n/** One tool removed before it reached the CLI. */\nexport interface DroppedMcpTool {\n /** MCP server name as passed to the SDK (`skaile-capabilities`, `skaile-connectors`, ...). */\n server: string;\n /** Tool name on that server. */\n tool: string;\n /** Human-readable reason; safe to show to the agent. */\n reason: string;\n}\n\nlet metaValidator: ValidateFunction | null = null;\n\nfunction draft202012MetaValidator(): ValidateFunction {\n if (metaValidator) return metaValidator;\n // Only the bundled meta-schema is compiled; tool schemas are validated as\n // data. validateFormats:false — the API checks structure, not `format` strings.\n const ajv = new Ajv2020({ strict: false, validateFormats: false, logger: false });\n const validate = ajv.getSchema(DRAFT_2020_12_META);\n if (!validate) throw new Error(\"ajv draft 2020-12 meta-schema is unavailable\");\n metaValidator = validate;\n return validate;\n}\n\n/**\n * Check only the property-key rule (rule 1).\n *\n * @returns `null` when every top-level property key is acceptable, otherwise the reason.\n */\nexport function checkToolPropertyKeys(schema: unknown): string | null {\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) return null;\n const props = (schema as { properties?: unknown }).properties;\n if (!props || typeof props !== \"object\" || Array.isArray(props)) return null;\n for (const key of Object.keys(props)) {\n if (!TOOL_PROPERTY_KEY_PATTERN.test(key)) {\n return `property key ${JSON.stringify(key)} does not match ${TOOL_PROPERTY_KEY_PATTERN.source}`;\n }\n }\n return null;\n}\n\n/**\n * Check one tool input schema, as it goes on the wire, against both API rules.\n *\n * @returns `null` when the schema is acceptable, otherwise the reason it is not.\n */\nexport function checkToolInputSchema(schema: unknown): string | null {\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) {\n return \"input schema is not a JSON object\";\n }\n const keyReason = checkToolPropertyKeys(schema);\n if (keyReason) return keyReason;\n // Validated against the 2020-12 meta-schema regardless of the schema's own\n // `$schema` (the MCP SDK stamps draft-07 on every in-process tool), because\n // the API names 2020-12 in its 400. Deliberate consequence: a draft-07-only\n // construct such as a tuple's `items: [...]` (`z.tuple()`) is dropped too.\n const validate = draft202012MetaValidator();\n if (!validate(schema)) {\n const first = validate.errors?.[0];\n const where = first?.instancePath || \"/\";\n return `not valid JSON Schema draft 2020-12: ${where} ${first?.message ?? \"is invalid\"}`;\n }\n return null;\n}\n\n// ── In-process (type: \"sdk\") servers ─────────────────────────────────────────\n\ninterface RegisteredToolLike {\n enabled?: boolean;\n disable?: () => void;\n}\n\ninterface McpServerInstanceLike {\n connect(transport: unknown): Promise<void>;\n close(): Promise<void>;\n isConnected?: () => boolean;\n _registeredTools?: Record<string, RegisteredToolLike>;\n}\n\ninterface WireTool {\n name: string;\n inputSchema?: unknown;\n}\n\n/** Instances already filtered; their bad tools stay disabled for good. */\nconst filteredInstances = new WeakMap<object, DroppedMcpTool[]>();\n\nfunction sdkInstanceOf(config: unknown): McpServerInstanceLike | null {\n if (!config || typeof config !== \"object\") return null;\n const c = config as { type?: unknown; instance?: unknown };\n if (c.type !== \"sdk\" || !c.instance || typeof c.instance !== \"object\") return null;\n const inst = c.instance as McpServerInstanceLike;\n return typeof inst.connect === \"function\" && typeof inst.close === \"function\" ? inst : null;\n}\n\nfunction withTimeout<T>(p: Promise<T>, what: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(`${what} timed out`)), PROBE_TIMEOUT_MS);\n });\n return Promise.race([p, timeout]).finally(() => clearTimeout(timer));\n}\n\n/**\n * Speak just enough JSON-RPC to read the server's `tools/list`. A hand-rolled\n * exchange rather than the SDK `Client`, whose result validation would reject\n * the whole list over the one malformed tool this exists to find.\n */\nasync function listInProcessTools(instance: McpServerInstanceLike): Promise<WireTool[]> {\n const [clientSide, serverSide] = InMemoryTransport.createLinkedPair();\n const pending = new Map<number, (msg: Record<string, unknown>) => void>();\n clientSide.onmessage = (msg) => {\n const m = msg as Record<string, unknown>;\n const id = typeof m.id === \"number\" ? m.id : undefined;\n if (id === undefined) return;\n pending.get(id)?.(m);\n pending.delete(id);\n };\n let nextId = 1;\n const call = (method: string, params: Record<string, unknown>) =>\n withTimeout(\n new Promise<Record<string, unknown>>((resolve, reject) => {\n const id = nextId++;\n pending.set(id, resolve);\n clientSide.send({ jsonrpc: \"2.0\", id, method, params }).catch(reject);\n }),\n method,\n ).then((res) => {\n if (res.error) throw new Error(`${method} failed: ${JSON.stringify(res.error)}`);\n return (res.result ?? {}) as Record<string, unknown>;\n });\n\n await clientSide.start();\n await instance.connect(serverSide);\n try {\n await call(\"initialize\", {\n protocolVersion: \"2025-06-18\",\n capabilities: {},\n clientInfo: { name: \"skaile-tool-schema-filter\", version: \"1.0.0\" },\n });\n await clientSide.send({ jsonrpc: \"2.0\", method: \"notifications/initialized\" });\n const tools: WireTool[] = [];\n let cursor: string | undefined;\n do {\n const page = await call(\"tools/list\", cursor ? { cursor } : {});\n tools.push(...((page.tools as WireTool[] | undefined) ?? []));\n cursor = typeof page.nextCursor === \"string\" ? page.nextCursor : undefined;\n } while (cursor);\n return tools;\n } finally {\n // Leaves the instance unconnected so the SDK can attach its own transport.\n await instance.close().catch(() => {});\n }\n}\n\nconst defaultLog = createLogger({ kind: \"mcp\", subkind: \"tool-schema-filter\" });\n\n/**\n * Disable every tool on an in-process MCP server whose wire input schema\n * fails {@link checkToolInputSchema}. Valid tools on the same server stay.\n *\n * Mutates the server in place (`RegisteredTool.disable()` hides a tool from\n * `tools/list` and refuses calls to it). Non-`sdk` configs (stdio/sse/http)\n * are returned untouched: the CLI spawns those, so the bridge cannot see\n * their tools. Fails open — a server that cannot be inspected is passed\n * through and a warning is logged, because blocking it would cost the\n * session every one of its valid tools.\n *\n * @returns the tools dropped from this server (empty when none or not inspectable).\n */\nexport async function filterInProcessMcpServerTools(\n server: string,\n config: unknown,\n log: Logger = defaultLog,\n): Promise<DroppedMcpTool[]> {\n const instance = sdkInstanceOf(config);\n if (!instance) return [];\n const cached = filteredInstances.get(instance);\n if (cached) return cached;\n const registered = instance._registeredTools;\n if (!registered || Object.keys(registered).length === 0) return [];\n if (instance.isConnected?.()) {\n // Already attached to a live query; it was either filtered when first\n // passed or belongs to someone else's transport. Do not steal it.\n log.debug(\"in-process MCP server already connected; schema check skipped\", { server });\n return [];\n }\n\n let wireTools: WireTool[];\n try {\n wireTools = await listInProcessTools(instance);\n } catch (err) {\n log.warn(\"could not inspect in-process MCP server tools; passing it unchanged\", {\n server,\n error: err instanceof Error ? err.message : String(err),\n });\n return [];\n }\n\n const dropped: DroppedMcpTool[] = [];\n for (const tool of wireTools) {\n const reason = checkToolInputSchema(tool.inputSchema);\n if (!reason) continue;\n const handle = registered[tool.name];\n if (typeof handle?.disable !== \"function\") {\n log.warn(\"MCP tool has an invalid input schema but cannot be disabled\", {\n server,\n tool: tool.name,\n reason,\n });\n continue;\n }\n handle.disable();\n dropped.push({ server, tool: tool.name, reason });\n log.warn(\"MCP tool dropped: invalid input schema\", { server, tool: tool.name, reason });\n }\n filteredInstances.set(instance, dropped);\n return dropped;\n}\n\n/**\n * The line the agent reads about dropped tools, mirroring what the CLI\n * reports when it drops them itself. `null` when nothing was dropped.\n */\nexport function formatDroppedToolsNotice(dropped: readonly DroppedMcpTool[]): string | null {\n if (dropped.length === 0) return null;\n const items = dropped.map((d) => `${d.tool} (server ${d.server}: ${d.reason})`).join(\"; \");\n return `Some MCP tools were not loaded because the Claude API would reject their input schema: ${items}. Do not try to call them.`;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { openLibraryManager, createFullRegistry } from './chunk-4RKCOURU.js';
2
- import { logErr, logInfo, logWarn, logOk, S } from './chunk-WOE4LPGF.js';
1
+ import { openLibraryManager, createFullRegistry } from './chunk-6V3DMJPL.js';
2
+ import { logErr, logInfo, logWarn, logOk, S } from './chunk-S4R3WNRF.js';
3
3
  import { getStoreManifestsDir, LocalCatalogSource, writeCuratedManifest } from './chunk-UFWADBG6.js';
4
4
  import { computeDeterministicHash, discoverAssetsInTree } from './chunk-HGPSZXZP.js';
5
5
  import { WorkspaceYamlEditor } from './chunk-UWU572Q6.js';
@@ -313,12 +313,12 @@ function addSourceManifestCommands(src) {
313
313
  ).option("-C, --project-dir <dir>", "Project directory", process.cwd()).option("--publisher <name>", "Override the publisher (--overwrite only)").option("--dev", "Include assets under the source's dev_paths", false).option("--overwrite", "Discard curation and re-scan the full inventory", false).action((arg, opts) => runRebuild(arg, opts));
314
314
  manifest.command("verify <src>").description("Verify hashes, deps, and schema (read-only)").option("-C, --project-dir <dir>", "Project directory", process.cwd()).option("--strict", "Fail on advisory checks (warnings force a nonzero exit)", false).action((arg, opts) => runVerify(arg, opts));
315
315
  manifest.command("publish <src>").description("Push the curated sidecar manifest and publish it to the store").option("-C, --project-dir <dir>", "Project directory", process.cwd()).option("--as <namespace>", "Publisher namespace (default: your store username)").option("--sidecar-repo <url>", "Public GitHub repo you own to hold the curated manifest").option("--ref <gitref>", "Foreign source ref to ingest (branch/sha; default: main)").option("--dry-run", "Print the publish plan without pushing or calling the store", false).action(async (arg, opts) => {
316
- const { runPublish } = await import('./source-manifest-publish-IJLVR3IL.js');
316
+ const { runPublish } = await import('./source-manifest-publish-UKWCZA2M.js');
317
317
  await runPublish(arg, opts);
318
318
  });
319
319
  manifest.command("propose <src>").description("Open a PR to upstream with the sidecar manifest").action(() => notWired("propose"));
320
320
  manifest.command("yank <src>").description("Retract the source's published assets from the store").option("-C, --project-dir <dir>", "Project directory", process.cwd()).option("--asset <ref>", "Yank only the asset matching this ref/name").action(async (arg, opts) => {
321
- const { runYank } = await import('./source-manifest-publish-IJLVR3IL.js');
321
+ const { runYank } = await import('./source-manifest-publish-UKWCZA2M.js');
322
322
  await runYank(arg, opts);
323
323
  });
324
324
  }
@@ -684,5 +684,5 @@ function makeSourceCommand() {
684
684
  }
685
685
 
686
686
  export { autoSyncForSearch, ensureClone, findCacheKeyCollision, indexingHadFailures, legacySourceConfigHint, makeSourceCommand, normalizeSourceUrl, readProjectSources, resolveSourceArg, sourceClonePath, sourceMatchesKey, syncProjectSources };
687
- //# sourceMappingURL=chunk-RAHLV6QG.js.map
688
- //# sourceMappingURL=chunk-RAHLV6QG.js.map
687
+ //# sourceMappingURL=chunk-XAKGLR4Y.js.map
688
+ //# sourceMappingURL=chunk-XAKGLR4Y.js.map