network-ai 5.10.1 → 5.11.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 (272) hide show
  1. package/INTEGRATION_GUIDE.md +2 -2
  2. package/README.md +5 -3
  3. package/SKILL.md +3 -3
  4. package/dist/esm/adapters/a2a-adapter.js +235 -0
  5. package/dist/esm/adapters/a2a-adapter.js.map +1 -0
  6. package/dist/esm/adapters/adapter-registry.js +613 -0
  7. package/dist/esm/adapters/adapter-registry.js.map +1 -0
  8. package/dist/esm/adapters/agno-adapter.js +140 -0
  9. package/dist/esm/adapters/agno-adapter.js.map +1 -0
  10. package/dist/esm/adapters/anthropic-computer-use-adapter.js +180 -0
  11. package/dist/esm/adapters/anthropic-computer-use-adapter.js.map +1 -0
  12. package/dist/esm/adapters/aps-adapter.js +289 -0
  13. package/dist/esm/adapters/aps-adapter.js.map +1 -0
  14. package/dist/esm/adapters/autogen-adapter.js +141 -0
  15. package/dist/esm/adapters/autogen-adapter.js.map +1 -0
  16. package/dist/esm/adapters/base-adapter.js +104 -0
  17. package/dist/esm/adapters/base-adapter.js.map +1 -0
  18. package/dist/esm/adapters/browser-agent-adapter.js +219 -0
  19. package/dist/esm/adapters/browser-agent-adapter.js.map +1 -0
  20. package/dist/esm/adapters/codex-adapter.js +318 -0
  21. package/dist/esm/adapters/codex-adapter.js.map +1 -0
  22. package/dist/esm/adapters/copilot-adapter.js +132 -0
  23. package/dist/esm/adapters/copilot-adapter.js.map +1 -0
  24. package/dist/esm/adapters/crewai-adapter.js +148 -0
  25. package/dist/esm/adapters/crewai-adapter.js.map +1 -0
  26. package/dist/esm/adapters/custom-adapter.js +142 -0
  27. package/dist/esm/adapters/custom-adapter.js.map +1 -0
  28. package/dist/esm/adapters/custom-streaming-adapter.js +181 -0
  29. package/dist/esm/adapters/custom-streaming-adapter.js.map +1 -0
  30. package/dist/esm/adapters/dspy-adapter.js +127 -0
  31. package/dist/esm/adapters/dspy-adapter.js.map +1 -0
  32. package/dist/esm/adapters/haystack-adapter.js +149 -0
  33. package/dist/esm/adapters/haystack-adapter.js.map +1 -0
  34. package/dist/esm/adapters/hermes-adapter.js +217 -0
  35. package/dist/esm/adapters/hermes-adapter.js.map +1 -0
  36. package/dist/esm/adapters/index.js +109 -0
  37. package/dist/esm/adapters/index.js.map +1 -0
  38. package/dist/esm/adapters/langchain-adapter.js +134 -0
  39. package/dist/esm/adapters/langchain-adapter.js.map +1 -0
  40. package/dist/esm/adapters/langchain-streaming-adapter.js +161 -0
  41. package/dist/esm/adapters/langchain-streaming-adapter.js.map +1 -0
  42. package/dist/esm/adapters/langgraph-adapter.js +119 -0
  43. package/dist/esm/adapters/langgraph-adapter.js.map +1 -0
  44. package/dist/esm/adapters/llamaindex-adapter.js +135 -0
  45. package/dist/esm/adapters/llamaindex-adapter.js.map +1 -0
  46. package/dist/esm/adapters/mcp-adapter.js +200 -0
  47. package/dist/esm/adapters/mcp-adapter.js.map +1 -0
  48. package/dist/esm/adapters/minimax-adapter.js +233 -0
  49. package/dist/esm/adapters/minimax-adapter.js.map +1 -0
  50. package/dist/esm/adapters/nemoclaw-adapter.js +465 -0
  51. package/dist/esm/adapters/nemoclaw-adapter.js.map +1 -0
  52. package/dist/esm/adapters/openai-agents-adapter.js +118 -0
  53. package/dist/esm/adapters/openai-agents-adapter.js.map +1 -0
  54. package/dist/esm/adapters/openai-assistants-adapter.js +130 -0
  55. package/dist/esm/adapters/openai-assistants-adapter.js.map +1 -0
  56. package/dist/esm/adapters/openclaw-adapter.js +107 -0
  57. package/dist/esm/adapters/openclaw-adapter.js.map +1 -0
  58. package/dist/esm/adapters/orchestrator-adapter.js +218 -0
  59. package/dist/esm/adapters/orchestrator-adapter.js.map +1 -0
  60. package/dist/esm/adapters/pydantic-ai-adapter.js +163 -0
  61. package/dist/esm/adapters/pydantic-ai-adapter.js.map +1 -0
  62. package/dist/esm/adapters/rlm-adapter.js +167 -0
  63. package/dist/esm/adapters/rlm-adapter.js.map +1 -0
  64. package/dist/esm/adapters/semantic-kernel-adapter.js +123 -0
  65. package/dist/esm/adapters/semantic-kernel-adapter.js.map +1 -0
  66. package/dist/esm/adapters/streaming-base-adapter.js +74 -0
  67. package/dist/esm/adapters/streaming-base-adapter.js.map +1 -0
  68. package/dist/esm/adapters/vertex-ai-adapter.js +166 -0
  69. package/dist/esm/adapters/vertex-ai-adapter.js.map +1 -0
  70. package/dist/esm/demo-control-plane.js +147 -0
  71. package/dist/esm/demo-control-plane.js.map +1 -0
  72. package/dist/esm/demo-worktree-dashboard.js +131 -0
  73. package/dist/esm/demo-worktree-dashboard.js.map +1 -0
  74. package/dist/esm/examples/01-hello-swarm.js +165 -0
  75. package/dist/esm/examples/01-hello-swarm.js.map +1 -0
  76. package/dist/esm/examples/02-fsm-pipeline.js +189 -0
  77. package/dist/esm/examples/02-fsm-pipeline.js.map +1 -0
  78. package/dist/esm/examples/03-parallel-agents.js +192 -0
  79. package/dist/esm/examples/03-parallel-agents.js.map +1 -0
  80. package/dist/esm/examples/05-code-review-swarm.js +1177 -0
  81. package/dist/esm/examples/05-code-review-swarm.js.map +1 -0
  82. package/dist/esm/examples/06-ai-pipeline-demo.js +263 -0
  83. package/dist/esm/examples/06-ai-pipeline-demo.js.map +1 -0
  84. package/dist/esm/examples/07-full-showcase.js +946 -0
  85. package/dist/esm/examples/07-full-showcase.js.map +1 -0
  86. package/dist/esm/examples/08-control-plane-stress-demo.js +186 -0
  87. package/dist/esm/examples/08-control-plane-stress-demo.js.map +1 -0
  88. package/dist/esm/examples/09-real-langchain.js +231 -0
  89. package/dist/esm/examples/09-real-langchain.js.map +1 -0
  90. package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js +270 -0
  91. package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
  92. package/dist/esm/examples/demo-runner.js +119 -0
  93. package/dist/esm/examples/demo-runner.js.map +1 -0
  94. package/dist/esm/index.js +1352 -0
  95. package/dist/esm/index.js.map +1 -0
  96. package/dist/esm/lib/adapter-hooks.js +216 -0
  97. package/dist/esm/lib/adapter-hooks.js.map +1 -0
  98. package/dist/esm/lib/adapter-test-harness.js +118 -0
  99. package/dist/esm/lib/adapter-test-harness.js.map +1 -0
  100. package/dist/esm/lib/agent-conversation.js +155 -0
  101. package/dist/esm/lib/agent-conversation.js.map +1 -0
  102. package/dist/esm/lib/agent-debate.js +146 -0
  103. package/dist/esm/lib/agent-debate.js.map +1 -0
  104. package/dist/esm/lib/agent-memory.js +336 -0
  105. package/dist/esm/lib/agent-memory.js.map +1 -0
  106. package/dist/esm/lib/agent-runtime.js +818 -0
  107. package/dist/esm/lib/agent-runtime.js.map +1 -0
  108. package/dist/esm/lib/agent-vcr.js +218 -0
  109. package/dist/esm/lib/agent-vcr.js.map +1 -0
  110. package/dist/esm/lib/anomaly-detector.js +178 -0
  111. package/dist/esm/lib/anomaly-detector.js.map +1 -0
  112. package/dist/esm/lib/approval-inbox.js +385 -0
  113. package/dist/esm/lib/approval-inbox.js.map +1 -0
  114. package/dist/esm/lib/auth-guardian.js +692 -0
  115. package/dist/esm/lib/auth-guardian.js.map +1 -0
  116. package/dist/esm/lib/auth-validator.js +32 -0
  117. package/dist/esm/lib/auth-validator.js.map +1 -0
  118. package/dist/esm/lib/blackboard-backend-crdt.js +251 -0
  119. package/dist/esm/lib/blackboard-backend-crdt.js.map +1 -0
  120. package/dist/esm/lib/blackboard-backend-redis.js +244 -0
  121. package/dist/esm/lib/blackboard-backend-redis.js.map +1 -0
  122. package/dist/esm/lib/blackboard-backend.js +141 -0
  123. package/dist/esm/lib/blackboard-backend.js.map +1 -0
  124. package/dist/esm/lib/blackboard-validator.js +985 -0
  125. package/dist/esm/lib/blackboard-validator.js.map +1 -0
  126. package/dist/esm/lib/circuit-breaker.js +164 -0
  127. package/dist/esm/lib/circuit-breaker.js.map +1 -0
  128. package/dist/esm/lib/claim-verifier.js +173 -0
  129. package/dist/esm/lib/claim-verifier.js.map +1 -0
  130. package/dist/esm/lib/comparison-runner.js +138 -0
  131. package/dist/esm/lib/comparison-runner.js.map +1 -0
  132. package/dist/esm/lib/compliance-monitor.js +261 -0
  133. package/dist/esm/lib/compliance-monitor.js.map +1 -0
  134. package/dist/esm/lib/confidence-filter.js +210 -0
  135. package/dist/esm/lib/confidence-filter.js.map +1 -0
  136. package/dist/esm/lib/config-watcher.js +215 -0
  137. package/dist/esm/lib/config-watcher.js.map +1 -0
  138. package/dist/esm/lib/consistency.js +274 -0
  139. package/dist/esm/lib/consistency.js.map +1 -0
  140. package/dist/esm/lib/console-ui.js +276 -0
  141. package/dist/esm/lib/console-ui.js.map +1 -0
  142. package/dist/esm/lib/context-throttler.js +171 -0
  143. package/dist/esm/lib/context-throttler.js.map +1 -0
  144. package/dist/esm/lib/control-plane.js +527 -0
  145. package/dist/esm/lib/control-plane.js.map +1 -0
  146. package/dist/esm/lib/cost-governor.js +128 -0
  147. package/dist/esm/lib/cost-governor.js.map +1 -0
  148. package/dist/esm/lib/cost-heatmap.js +161 -0
  149. package/dist/esm/lib/cost-heatmap.js.map +1 -0
  150. package/dist/esm/lib/coverage-gate.js +213 -0
  151. package/dist/esm/lib/coverage-gate.js.map +1 -0
  152. package/dist/esm/lib/coverage-reporter.js +177 -0
  153. package/dist/esm/lib/coverage-reporter.js.map +1 -0
  154. package/dist/esm/lib/crdt.js +141 -0
  155. package/dist/esm/lib/crdt.js.map +1 -0
  156. package/dist/esm/lib/dashboard-server.js +403 -0
  157. package/dist/esm/lib/dashboard-server.js.map +1 -0
  158. package/dist/esm/lib/dry-run.js +130 -0
  159. package/dist/esm/lib/dry-run.js.map +1 -0
  160. package/dist/esm/lib/env-manager.js +518 -0
  161. package/dist/esm/lib/env-manager.js.map +1 -0
  162. package/dist/esm/lib/errors.js +201 -0
  163. package/dist/esm/lib/errors.js.map +1 -0
  164. package/dist/esm/lib/event-bus.js +229 -0
  165. package/dist/esm/lib/event-bus.js.map +1 -0
  166. package/dist/esm/lib/explainability.js +102 -0
  167. package/dist/esm/lib/explainability.js.map +1 -0
  168. package/dist/esm/lib/fan-out.js +237 -0
  169. package/dist/esm/lib/fan-out.js.map +1 -0
  170. package/dist/esm/lib/federated-budget.js +322 -0
  171. package/dist/esm/lib/federated-budget.js.map +1 -0
  172. package/dist/esm/lib/fsm-journey.js +478 -0
  173. package/dist/esm/lib/fsm-journey.js.map +1 -0
  174. package/dist/esm/lib/goal-decomposer.js +698 -0
  175. package/dist/esm/lib/goal-decomposer.js.map +1 -0
  176. package/dist/esm/lib/goal-dsl.js +391 -0
  177. package/dist/esm/lib/goal-dsl.js.map +1 -0
  178. package/dist/esm/lib/job-queue.js +310 -0
  179. package/dist/esm/lib/job-queue.js.map +1 -0
  180. package/dist/esm/lib/landscape-agent.js +134 -0
  181. package/dist/esm/lib/landscape-agent.js.map +1 -0
  182. package/dist/esm/lib/learning-loop.js +181 -0
  183. package/dist/esm/lib/learning-loop.js.map +1 -0
  184. package/dist/esm/lib/lifecycle-hooks.js +148 -0
  185. package/dist/esm/lib/lifecycle-hooks.js.map +1 -0
  186. package/dist/esm/lib/locked-blackboard.js +1295 -0
  187. package/dist/esm/lib/locked-blackboard.js.map +1 -0
  188. package/dist/esm/lib/logger.js +150 -0
  189. package/dist/esm/lib/logger.js.map +1 -0
  190. package/dist/esm/lib/mcp-blackboard-tools.js +298 -0
  191. package/dist/esm/lib/mcp-blackboard-tools.js.map +1 -0
  192. package/dist/esm/lib/mcp-bridge.js +357 -0
  193. package/dist/esm/lib/mcp-bridge.js.map +1 -0
  194. package/dist/esm/lib/mcp-tool-consumer.js +287 -0
  195. package/dist/esm/lib/mcp-tool-consumer.js.map +1 -0
  196. package/dist/esm/lib/mcp-tools-control.js +392 -0
  197. package/dist/esm/lib/mcp-tools-control.js.map +1 -0
  198. package/dist/esm/lib/mcp-tools-extended.js +371 -0
  199. package/dist/esm/lib/mcp-tools-extended.js.map +1 -0
  200. package/dist/esm/lib/mcp-transport-http.js +528 -0
  201. package/dist/esm/lib/mcp-transport-http.js.map +1 -0
  202. package/dist/esm/lib/mcp-transport-sse.js +503 -0
  203. package/dist/esm/lib/mcp-transport-sse.js.map +1 -0
  204. package/dist/esm/lib/metrics.js +284 -0
  205. package/dist/esm/lib/metrics.js.map +1 -0
  206. package/dist/esm/lib/orchestrator-types.js +66 -0
  207. package/dist/esm/lib/orchestrator-types.js.map +1 -0
  208. package/dist/esm/lib/otel-bridge.js +167 -0
  209. package/dist/esm/lib/otel-bridge.js.map +1 -0
  210. package/dist/esm/lib/partition-planner.js +246 -0
  211. package/dist/esm/lib/partition-planner.js.map +1 -0
  212. package/dist/esm/lib/phase-pipeline.js +367 -0
  213. package/dist/esm/lib/phase-pipeline.js.map +1 -0
  214. package/dist/esm/lib/playground.js +224 -0
  215. package/dist/esm/lib/playground.js.map +1 -0
  216. package/dist/esm/lib/qa-orchestrator.js +296 -0
  217. package/dist/esm/lib/qa-orchestrator.js.map +1 -0
  218. package/dist/esm/lib/quadtree.js +259 -0
  219. package/dist/esm/lib/quadtree.js.map +1 -0
  220. package/dist/esm/lib/route-classifier.js +217 -0
  221. package/dist/esm/lib/route-classifier.js.map +1 -0
  222. package/dist/esm/lib/semantic-search.js +235 -0
  223. package/dist/esm/lib/semantic-search.js.map +1 -0
  224. package/dist/esm/lib/shared-blackboard.js +249 -0
  225. package/dist/esm/lib/shared-blackboard.js.map +1 -0
  226. package/dist/esm/lib/skill-composer.js +190 -0
  227. package/dist/esm/lib/skill-composer.js.map +1 -0
  228. package/dist/esm/lib/speculative-executor.js +107 -0
  229. package/dist/esm/lib/speculative-executor.js.map +1 -0
  230. package/dist/esm/lib/strategy-agent.js +626 -0
  231. package/dist/esm/lib/strategy-agent.js.map +1 -0
  232. package/dist/esm/lib/swarm-transport.js +307 -0
  233. package/dist/esm/lib/swarm-transport.js.map +1 -0
  234. package/dist/esm/lib/swarm-utils.js +510 -0
  235. package/dist/esm/lib/swarm-utils.js.map +1 -0
  236. package/dist/esm/lib/task-decomposer.js +272 -0
  237. package/dist/esm/lib/task-decomposer.js.map +1 -0
  238. package/dist/esm/lib/telemetry-provider.js +207 -0
  239. package/dist/esm/lib/telemetry-provider.js.map +1 -0
  240. package/dist/esm/lib/timeline-scrubber.js +173 -0
  241. package/dist/esm/lib/timeline-scrubber.js.map +1 -0
  242. package/dist/esm/lib/topology.js +591 -0
  243. package/dist/esm/lib/topology.js.map +1 -0
  244. package/dist/esm/lib/transport-agent.js +366 -0
  245. package/dist/esm/lib/transport-agent.js.map +1 -0
  246. package/dist/esm/lib/work-tree-dashboard.js +583 -0
  247. package/dist/esm/lib/work-tree-dashboard.js.map +1 -0
  248. package/dist/esm/lib/work-tree-ui.js +333 -0
  249. package/dist/esm/lib/work-tree-ui.js.map +1 -0
  250. package/dist/esm/lib/work-tree.js +480 -0
  251. package/dist/esm/lib/work-tree.js.map +1 -0
  252. package/dist/esm/run.js +144 -0
  253. package/dist/esm/run.js.map +1 -0
  254. package/dist/esm/security.js +1122 -0
  255. package/dist/esm/security.js.map +1 -0
  256. package/dist/index.d.ts +2 -0
  257. package/dist/index.d.ts.map +1 -1
  258. package/dist/index.js +6 -1
  259. package/dist/index.js.map +1 -1
  260. package/dist/lib/mcp-transport-http.d.ts +203 -0
  261. package/dist/lib/mcp-transport-http.d.ts.map +1 -0
  262. package/dist/lib/mcp-transport-http.js +528 -0
  263. package/dist/lib/mcp-transport-http.js.map +1 -0
  264. package/dist/lib/phase-pipeline.d.ts +31 -0
  265. package/dist/lib/phase-pipeline.d.ts.map +1 -1
  266. package/dist/lib/phase-pipeline.js +93 -1
  267. package/dist/lib/phase-pipeline.js.map +1 -1
  268. package/dist/lib/semantic-search.d.ts +42 -6
  269. package/dist/lib/semantic-search.d.ts.map +1 -1
  270. package/dist/lib/semantic-search.js +87 -6
  271. package/dist/lib/semantic-search.js.map +1 -1
  272. package/package.json +24 -4
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ /**
3
+ * MCP Blackboard Bridge — Phase 5 Part 7: MCP Networking
4
+ *
5
+ * Exposes any `IBlackboard` (or `BlackboardMCPTools` instance) as a
6
+ * JSON-RPC 2.0 Model Context Protocol endpoint, enabling cross-machine
7
+ * agent communication with no external runtime dependencies.
8
+ *
9
+ * Architecture:
10
+ *
11
+ * ┌─────────────────────────┐ ┌─────────────────────────┐
12
+ * │ McpBridgeClient │ │ McpBlackboardBridge │
13
+ * │ (remote agent side) │ │ (server side) │
14
+ * │ │ │ │
15
+ * │ listTools() │──────► │ handleRPC() │
16
+ * │ callTool(name, args) │ │ ├─ tools/list │
17
+ * │ │◄────── │ └─ tools/call │
18
+ * └─────────────────────────┘ │ │ │
19
+ * │ │ ▼ │
20
+ * McpTransport interface │ BlackboardMCPTools │
21
+ * (in-process or future SSE/WS) │ (read/write/list...) │
22
+ * └─────────────────────────┘
23
+ *
24
+ * `McpInProcessTransport` wires a client directly to a bridge instance
25
+ * (zero I/O, ideal for testing and single-machine multi-board setups).
26
+ * Any transport that satisfies `McpTransport` can be substituted for
27
+ * network delivery (SSE, WebSocket, stdio) without changing callers.
28
+ *
29
+ * `McpBridgeRouter` manages multiple named bridges (one per blackboard)
30
+ * and routes calls to the correct bridge by board name.
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * import { McpBlackboardBridge, McpBridgeClient, McpInProcessTransport } from 'network-ai';
35
+ *
36
+ * // Server side
37
+ * const bridge = new McpBlackboardBridge(myBlackboard);
38
+ *
39
+ * // Client side (in-process)
40
+ * const client = new McpBridgeClient(new McpInProcessTransport(bridge));
41
+ *
42
+ * const tools = await client.listTools();
43
+ * const result = await client.callTool('blackboard_read', { key: 'status', agent_id: 'agent-1' });
44
+ * ```
45
+ *
46
+ * @example Multi-board router
47
+ * ```typescript
48
+ * const router = new McpBridgeRouter();
49
+ * router.register('prod', new McpBlackboardBridge(prodBoard));
50
+ * router.register('staging', new McpBlackboardBridge(stagingBoard));
51
+ *
52
+ * const prodClient = router.getClient('prod');
53
+ * await prodClient.callTool('blackboard_write', { key: 'deploy', value: '"ok"', agent_id: 'ci' });
54
+ * ```
55
+ *
56
+ * @module McpBridge
57
+ * @version 1.0.0
58
+ * @license MIT
59
+ */
60
+ Object.defineProperty(exports, "__esModule", { value: true });
61
+ exports.McpBridgeRouter = exports.McpBridgeClient = exports.McpInProcessTransport = exports.McpBlackboardBridge = void 0;
62
+ const mcp_blackboard_tools_1 = require("./mcp-blackboard-tools");
63
+ /**
64
+ * MCP server bridge that exposes a blackboard via JSON-RPC 2.0.
65
+ *
66
+ * Wraps a `BlackboardMCPTools` instance and handles:
67
+ * - `tools/list` → returns all five tool definitions
68
+ * - `tools/call` → dispatches to the appropriate tool handler
69
+ *
70
+ * The bridge is transport-agnostic: pass a `McpJsonRpcRequest` to
71
+ * `handleRPC()` and receive a `McpJsonRpcResponse`.
72
+ */
73
+ class McpBlackboardBridge {
74
+ _tools;
75
+ name;
76
+ /**
77
+ * @param blackboard Any object satisfying `IBlackboard`, or a
78
+ * pre-built `BlackboardMCPTools` instance.
79
+ * @param options Optional configuration.
80
+ */
81
+ constructor(blackboard, options = {}) {
82
+ this._tools =
83
+ blackboard instanceof mcp_blackboard_tools_1.BlackboardMCPTools
84
+ ? blackboard
85
+ : new mcp_blackboard_tools_1.BlackboardMCPTools(blackboard);
86
+ this.name = options.name ?? 'blackboard';
87
+ }
88
+ // --------------------------------------------------------------------------
89
+ // JSON-RPC 2.0 ENTRY POINT
90
+ // --------------------------------------------------------------------------
91
+ /**
92
+ * Handle a single JSON-RPC 2.0 request and return the matching response.
93
+ * Never rejects — errors are encoded as `{ error: { code, message } }`.
94
+ */
95
+ async handleRPC(request) {
96
+ if (!request || request.jsonrpc !== '2.0') {
97
+ return this._error(null, -32600 /* McpErrorCode.InvalidRequest */, 'Invalid JSON-RPC 2.0 request');
98
+ }
99
+ const { id, method } = request;
100
+ try {
101
+ switch (method) {
102
+ case 'tools/list':
103
+ return this._ok(id, await this._handleListTools());
104
+ case 'tools/call':
105
+ return this._ok(id, await this._handleCallTool(request.params));
106
+ default:
107
+ return this._error(id, -32601 /* McpErrorCode.MethodNotFound */, `Method not found: "${method}"`);
108
+ }
109
+ }
110
+ catch (err) {
111
+ return this._error(id, -32603 /* McpErrorCode.InternalError */, err instanceof Error ? err.message : String(err));
112
+ }
113
+ }
114
+ // --------------------------------------------------------------------------
115
+ // CONVENIENCE — direct access without JSON-RPC wrapping
116
+ // --------------------------------------------------------------------------
117
+ /** Returns all tool definitions exposed by this bridge. */
118
+ listTools() {
119
+ return this._tools.getDefinitions();
120
+ }
121
+ /**
122
+ * Call a specific tool directly (bypasses JSON-RPC framing).
123
+ * Useful when the bridge and caller share the same process.
124
+ */
125
+ async callTool(name, args) {
126
+ return this._tools.call(name, args);
127
+ }
128
+ // --------------------------------------------------------------------------
129
+ // PRIVATE — method handlers
130
+ // --------------------------------------------------------------------------
131
+ async _handleListTools() {
132
+ return { tools: this._tools.getDefinitions() };
133
+ }
134
+ async _handleCallTool(params) {
135
+ if (!params || typeof params !== 'object') {
136
+ throw Object.assign(new Error('tools/call requires params object with "name" and "arguments"'), { code: -32602 /* McpErrorCode.InvalidParams */ });
137
+ }
138
+ const p = params;
139
+ const toolName = p['name'];
140
+ const toolArgs = p['arguments'] ?? {};
141
+ if (typeof toolName !== 'string' || !toolName) {
142
+ throw Object.assign(new Error('tools/call: "name" must be a non-empty string'), { code: -32602 /* McpErrorCode.InvalidParams */ });
143
+ }
144
+ if (typeof toolArgs !== 'object' || toolArgs === null || Array.isArray(toolArgs)) {
145
+ throw Object.assign(new Error('tools/call: "arguments" must be an object'), { code: -32602 /* McpErrorCode.InvalidParams */ });
146
+ }
147
+ const result = await this._tools.call(toolName, toolArgs);
148
+ return {
149
+ content: [{ type: 'text', text: JSON.stringify(result) }],
150
+ isError: !result.ok,
151
+ };
152
+ }
153
+ // --------------------------------------------------------------------------
154
+ // PRIVATE — response helpers
155
+ // --------------------------------------------------------------------------
156
+ _ok(id, result) {
157
+ return { jsonrpc: '2.0', id, result };
158
+ }
159
+ _error(id, code, message, data) {
160
+ return {
161
+ jsonrpc: '2.0',
162
+ id,
163
+ error: { code, message, ...(data !== undefined ? { data } : {}) },
164
+ };
165
+ }
166
+ }
167
+ exports.McpBlackboardBridge = McpBlackboardBridge;
168
+ // ============================================================================
169
+ // IN-PROCESS TRANSPORT
170
+ // ============================================================================
171
+ /**
172
+ * Zero-I/O transport that routes calls directly to a `McpBlackboardBridge`.
173
+ *
174
+ * Use this when the client and server share the same process — no
175
+ * serialization, no network, instant responses. Ideal for:
176
+ * - Unit and integration tests
177
+ * - Single-machine multi-board setups
178
+ * - Development and debugging
179
+ *
180
+ * Replace with a network transport (SSE, WebSocket, stdio pipe) when you
181
+ * need cross-machine communication.
182
+ */
183
+ class McpInProcessTransport {
184
+ bridge;
185
+ _idCounter = 0;
186
+ constructor(bridge) {
187
+ this.bridge = bridge;
188
+ }
189
+ async send(request) {
190
+ return this.bridge.handleRPC(request);
191
+ }
192
+ /**
193
+ * Generate a unique numeric request ID suitable for `McpJsonRpcRequest.id`.
194
+ * Useful when callers don't need to track IDs manually.
195
+ */
196
+ nextId() {
197
+ return ++this._idCounter;
198
+ }
199
+ }
200
+ exports.McpInProcessTransport = McpInProcessTransport;
201
+ // ============================================================================
202
+ // MCP BRIDGE CLIENT
203
+ // ============================================================================
204
+ /**
205
+ * Client that communicates with a `McpBlackboardBridge` via any `McpTransport`.
206
+ *
207
+ * Provides high-level methods (`listTools`, `callTool`) so callers never
208
+ * have to construct raw JSON-RPC requests.
209
+ */
210
+ class McpBridgeClient {
211
+ transport;
212
+ _idCounter = 0;
213
+ constructor(transport) {
214
+ this.transport = transport;
215
+ }
216
+ // --------------------------------------------------------------------------
217
+ // HIGH-LEVEL API
218
+ // --------------------------------------------------------------------------
219
+ /**
220
+ * List all tools exposed by the connected bridge.
221
+ *
222
+ * @returns Array of `MCPToolDefinition` objects.
223
+ * @throws If the transport returns an RPC error.
224
+ */
225
+ async listTools() {
226
+ const response = await this._send('tools/list', undefined);
227
+ const result = response.result;
228
+ return result.tools;
229
+ }
230
+ /**
231
+ * Call a named tool on the connected bridge.
232
+ *
233
+ * @param name Tool name (e.g. `'blackboard_read'`).
234
+ * @param args Tool arguments matching the tool's `inputSchema`.
235
+ * @returns Parsed `BlackboardToolResult` from the content block.
236
+ * @throws If the transport returns a JSON-RPC protocol error.
237
+ */
238
+ async callTool(name, args) {
239
+ const response = await this._send('tools/call', { name, arguments: args });
240
+ const callResult = response.result;
241
+ const text = callResult.content[0]?.text ?? '{}';
242
+ return JSON.parse(text);
243
+ }
244
+ /**
245
+ * Send a raw JSON-RPC request and return the response.
246
+ * The `id` is auto-assigned if not provided.
247
+ *
248
+ * @throws If the server returns a JSON-RPC error response.
249
+ */
250
+ async sendRaw(method, params) {
251
+ return this._send(method, params);
252
+ }
253
+ // --------------------------------------------------------------------------
254
+ // PRIVATE
255
+ // --------------------------------------------------------------------------
256
+ async _send(method, params) {
257
+ const id = ++this._idCounter;
258
+ const request = {
259
+ jsonrpc: '2.0',
260
+ id,
261
+ method,
262
+ ...(params !== undefined ? { params } : {}),
263
+ };
264
+ const response = await this.transport.send(request);
265
+ if (response.error) {
266
+ const { code, message, data } = response.error;
267
+ const err = new Error(`MCP error ${code}: ${message}`);
268
+ Object.assign(err, { code, data });
269
+ throw err;
270
+ }
271
+ return response;
272
+ }
273
+ }
274
+ exports.McpBridgeClient = McpBridgeClient;
275
+ // ============================================================================
276
+ // MCP BRIDGE ROUTER
277
+ // ============================================================================
278
+ /**
279
+ * Routes MCP calls across multiple named `McpBlackboardBridge` instances
280
+ * (one per blackboard).
281
+ *
282
+ * Agents address a specific blackboard by name:
283
+ * ```typescript
284
+ * const client = router.getClient('prod');
285
+ * await client.callTool('blackboard_write', { ... });
286
+ * ```
287
+ *
288
+ * The router also supports direct RPC routing without creating a client:
289
+ * ```typescript
290
+ * await router.route('prod', { jsonrpc: '2.0', id: 1, method: 'tools/list' });
291
+ * ```
292
+ */
293
+ class McpBridgeRouter {
294
+ _bridges = new Map();
295
+ /**
296
+ * Register a bridge under `name`.
297
+ * @throws If `name` is already registered.
298
+ */
299
+ register(name, bridge) {
300
+ if (typeof name !== 'string' || !name) {
301
+ throw new TypeError('McpBridgeRouter.register: name must be a non-empty string');
302
+ }
303
+ if (this._bridges.has(name)) {
304
+ throw new Error(`McpBridgeRouter: bridge "${name}" is already registered`);
305
+ }
306
+ this._bridges.set(name, bridge);
307
+ }
308
+ /**
309
+ * Unregister a bridge by name. No-op if not found.
310
+ * @returns `true` if a bridge was removed, `false` otherwise.
311
+ */
312
+ unregister(name) {
313
+ return this._bridges.delete(name);
314
+ }
315
+ /**
316
+ * Returns `true` if a bridge with `name` is registered.
317
+ */
318
+ has(name) {
319
+ return this._bridges.has(name);
320
+ }
321
+ /**
322
+ * List all registered bridge names.
323
+ */
324
+ listBridges() {
325
+ return Array.from(this._bridges.keys());
326
+ }
327
+ /**
328
+ * Get the `McpBlackboardBridge` registered under `name`.
329
+ * @throws If `name` is not registered.
330
+ */
331
+ getBridge(name) {
332
+ const bridge = this._bridges.get(name);
333
+ if (!bridge) {
334
+ throw new Error(`McpBridgeRouter: no bridge registered for "${name}"`);
335
+ }
336
+ return bridge;
337
+ }
338
+ /**
339
+ * Route a raw JSON-RPC request to the bridge named `boardName`.
340
+ * @throws If `boardName` is not registered.
341
+ */
342
+ async route(boardName, request) {
343
+ return this.getBridge(boardName).handleRPC(request);
344
+ }
345
+ /**
346
+ * Get a `McpBridgeClient` backed by an in-process transport to the bridge
347
+ * registered under `boardName`.
348
+ *
349
+ * @throws If `boardName` is not registered.
350
+ */
351
+ getClient(boardName) {
352
+ const bridge = this.getBridge(boardName);
353
+ return new McpBridgeClient(new McpInProcessTransport(bridge));
354
+ }
355
+ }
356
+ exports.McpBridgeRouter = McpBridgeRouter;
357
+ //# sourceMappingURL=mcp-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../../../lib/mcp-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ /**
3
+ * MCPToolConsumer — Connect to external MCP servers and consume their tools.
4
+ *
5
+ * Implements `MCPServerConnection` for the MCPAdapter, providing:
6
+ * - Stdio-based client transport (spawn child process)
7
+ * - SSE-based client transport (HTTP long-poll)
8
+ * - Auto-discovery of remote tools with caching
9
+ * - Permission-gated remote tool execution
10
+ *
11
+ * BYOC: No external MCP client library required.
12
+ *
13
+ * @module MCPToolConsumer
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.MCPToolConsumer = exports.HttpClientTransport = exports.StdioClientTransport = void 0;
17
+ const events_1 = require("events");
18
+ // ============================================================================
19
+ // STDIO CLIENT TRANSPORT
20
+ // ============================================================================
21
+ /**
22
+ * Stdio-based MCP client transport.
23
+ * Spawns a child process and communicates via stdin/stdout JSON-RPC.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const transport = new StdioClientTransport('npx', ['some-mcp-server']);
28
+ * const consumer = new MCPToolConsumer({ transport });
29
+ * ```
30
+ */
31
+ class StdioClientTransport {
32
+ command;
33
+ args;
34
+ process = null;
35
+ pendingRequests = new Map();
36
+ nextId = 1;
37
+ buffer = '';
38
+ spawnFn = null;
39
+ constructor(command, args = []) {
40
+ this.command = command;
41
+ this.args = args;
42
+ }
43
+ async send(request) {
44
+ if (!this.process)
45
+ await this.start();
46
+ const id = this.nextId++;
47
+ const req = { ...request, id };
48
+ return new Promise((resolve, reject) => {
49
+ this.pendingRequests.set(id, { resolve, reject });
50
+ this.process.stdin.write(JSON.stringify(req) + '\n');
51
+ });
52
+ }
53
+ async close() {
54
+ if (this.process) {
55
+ this.process.kill();
56
+ this.process = null;
57
+ }
58
+ for (const { reject } of this.pendingRequests.values()) {
59
+ reject(new Error('Transport closed'));
60
+ }
61
+ this.pendingRequests.clear();
62
+ }
63
+ async start() {
64
+ if (!this.spawnFn) {
65
+ // Dynamic import to avoid bundling child_process in browser contexts
66
+ const cp = await import('child_process');
67
+ this.spawnFn = cp.spawn;
68
+ }
69
+ this.process = this.spawnFn(this.command, this.args, {
70
+ stdio: ['pipe', 'pipe', 'pipe'],
71
+ });
72
+ this.process.stdout.on('data', (chunk) => {
73
+ this.buffer += chunk.toString();
74
+ this.processBuffer();
75
+ });
76
+ this.process.on('exit', () => {
77
+ for (const { reject } of this.pendingRequests.values()) {
78
+ reject(new Error('MCP server process exited'));
79
+ }
80
+ this.pendingRequests.clear();
81
+ });
82
+ }
83
+ processBuffer() {
84
+ const lines = this.buffer.split('\n');
85
+ this.buffer = lines.pop() ?? '';
86
+ for (const line of lines) {
87
+ const trimmed = line.trim();
88
+ if (!trimmed)
89
+ continue;
90
+ try {
91
+ const response = JSON.parse(trimmed);
92
+ if (response.id !== undefined && this.pendingRequests.has(response.id)) {
93
+ const { resolve } = this.pendingRequests.get(response.id);
94
+ this.pendingRequests.delete(response.id);
95
+ resolve(response);
96
+ }
97
+ }
98
+ catch {
99
+ // Not valid JSON — skip
100
+ }
101
+ }
102
+ }
103
+ }
104
+ exports.StdioClientTransport = StdioClientTransport;
105
+ // ============================================================================
106
+ // HTTP CLIENT TRANSPORT
107
+ // ============================================================================
108
+ /**
109
+ * HTTP-based MCP client transport.
110
+ * Sends JSON-RPC over HTTP POST requests to an MCP server endpoint.
111
+ */
112
+ class HttpClientTransport {
113
+ url;
114
+ headers;
115
+ nextId = 1;
116
+ constructor(url, headers = {}) {
117
+ this.url = url;
118
+ this.headers = headers;
119
+ }
120
+ async send(request) {
121
+ const id = this.nextId++;
122
+ const req = { ...request, id };
123
+ const response = await fetch(this.url, {
124
+ method: 'POST',
125
+ headers: { 'Content-Type': 'application/json', ...this.headers },
126
+ body: JSON.stringify(req),
127
+ });
128
+ if (!response.ok) {
129
+ throw new Error(`MCP HTTP error: ${response.status} ${response.statusText}`);
130
+ }
131
+ return response.json();
132
+ }
133
+ async close() {
134
+ // HTTP is stateless — nothing to close
135
+ }
136
+ }
137
+ exports.HttpClientTransport = HttpClientTransport;
138
+ // ============================================================================
139
+ // MCP TOOL CONSUMER
140
+ // ============================================================================
141
+ /**
142
+ * Consume tools from an external MCP server.
143
+ * Implements MCPServerConnection for use with MCPAdapter.
144
+ *
145
+ * @example
146
+ * ```ts
147
+ * const transport = new HttpClientTransport('http://localhost:3001/mcp');
148
+ * const consumer = new MCPToolConsumer({ transport });
149
+ *
150
+ * // Use with MCPAdapter:
151
+ * const adapter = new MCPAdapter();
152
+ * adapter.initialize({ options: { serverConnection: consumer } });
153
+ * await adapter.discoverServerTools();
154
+ * ```
155
+ */
156
+ class MCPToolConsumer extends events_1.EventEmitter {
157
+ transport;
158
+ toolCache = null;
159
+ toolCacheTime = 0;
160
+ toolCacheTtlMs;
161
+ callTimeoutMs;
162
+ prefix;
163
+ toolInfo = new Map();
164
+ initialized = false;
165
+ constructor(options) {
166
+ super();
167
+ this.transport = options.transport;
168
+ this.toolCacheTtlMs = options.toolCacheTtlMs ?? 60_000;
169
+ this.callTimeoutMs = options.callTimeoutMs ?? 30_000;
170
+ this.prefix = options.prefix ?? 'mcp';
171
+ }
172
+ /**
173
+ * Initialize the MCP connection (send initialize handshake).
174
+ */
175
+ async initialize(clientInfo) {
176
+ if (this.initialized)
177
+ return;
178
+ const response = await this.transport.send({
179
+ jsonrpc: '2.0',
180
+ id: 0,
181
+ method: 'initialize',
182
+ params: {
183
+ protocolVersion: '2024-11-05',
184
+ capabilities: {},
185
+ clientInfo: clientInfo ?? { name: 'network-ai', version: '5.4.0' },
186
+ },
187
+ });
188
+ if (response.error) {
189
+ throw new Error(`MCP initialize failed: ${response.error.message}`);
190
+ }
191
+ this.initialized = true;
192
+ }
193
+ /**
194
+ * List available tools from the remote MCP server.
195
+ * Results are cached for `toolCacheTtlMs`.
196
+ */
197
+ async listTools() {
198
+ if (!this.initialized)
199
+ await this.initialize();
200
+ const now = Date.now();
201
+ if (this.toolCache && (now - this.toolCacheTime) < this.toolCacheTtlMs) {
202
+ return this.toolCache;
203
+ }
204
+ const response = await this.transport.send({
205
+ jsonrpc: '2.0',
206
+ id: 0,
207
+ method: 'tools/list',
208
+ });
209
+ if (response.error) {
210
+ throw new Error(`tools/list failed: ${response.error.message}`);
211
+ }
212
+ const result = response.result;
213
+ const tools = result?.tools ?? [];
214
+ this.toolCache = tools;
215
+ this.toolCacheTime = now;
216
+ // Update tool info registry
217
+ for (const tool of tools) {
218
+ if (!this.toolInfo.has(tool.name)) {
219
+ this.toolInfo.set(tool.name, {
220
+ tool,
221
+ serverPrefix: this.prefix,
222
+ lastDiscovered: now,
223
+ callCount: 0,
224
+ errorCount: 0,
225
+ });
226
+ }
227
+ }
228
+ this.emit('tools-discovered', tools);
229
+ return tools;
230
+ }
231
+ /**
232
+ * Call a tool on the remote MCP server.
233
+ */
234
+ async callTool(name, args) {
235
+ if (!this.initialized)
236
+ await this.initialize();
237
+ const info = this.toolInfo.get(name);
238
+ if (info)
239
+ info.callCount++;
240
+ const resultPromise = this.transport.send({
241
+ jsonrpc: '2.0',
242
+ id: 0,
243
+ method: 'tools/call',
244
+ params: { name, arguments: args },
245
+ });
246
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`Tool call timeout: ${name}`)), this.callTimeoutMs));
247
+ try {
248
+ const response = await Promise.race([resultPromise, timeoutPromise]);
249
+ if (response.error) {
250
+ if (info)
251
+ info.errorCount++;
252
+ return {
253
+ content: [{ type: 'text', text: response.error.message }],
254
+ isError: true,
255
+ };
256
+ }
257
+ const result = response.result;
258
+ return result ?? { content: [{ type: 'text', text: 'No result' }] };
259
+ }
260
+ catch (err) {
261
+ if (info)
262
+ info.errorCount++;
263
+ throw err;
264
+ }
265
+ }
266
+ /** Close the transport connection */
267
+ async close() {
268
+ await this.transport.close();
269
+ this.toolCache = null;
270
+ this.initialized = false;
271
+ }
272
+ /** Get info about discovered tools */
273
+ getToolInfo() {
274
+ return [...this.toolInfo.values()];
275
+ }
276
+ /** Invalidate the tool cache to force re-discovery */
277
+ invalidateCache() {
278
+ this.toolCache = null;
279
+ this.toolCacheTime = 0;
280
+ }
281
+ /** Get the prefix used for agent naming */
282
+ getPrefix() {
283
+ return this.prefix;
284
+ }
285
+ }
286
+ exports.MCPToolConsumer = MCPToolConsumer;
287
+ //# sourceMappingURL=mcp-tool-consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-consumer.js","sourceRoot":"","sources":["../../../lib/mcp-tool-consumer.ts"],"names":[],"mappings":"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"}