network-ai 5.10.2 → 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,167 @@
1
+ "use strict";
2
+ /**
3
+ * RLM Adapter — Recursive Language Model integration
4
+ *
5
+ * Connects the SwarmOrchestrator to any RLM-compatible HTTP endpoint
6
+ * (see arxiv 2512.24601 / alexzhang13/rlm). BYOC — bring your own client.
7
+ *
8
+ * The adapter serialises each `AgentPayload` into a prompt string and POST it
9
+ * to `<endpoint>/completion`. The server responds with a JSON body whose
10
+ * `text` (or `content`) field becomes the agent result data.
11
+ *
12
+ * Usage:
13
+ * ```typescript
14
+ * const adapter = new RLMAdapter();
15
+ * adapter.registerAgent('rlm-planner', {
16
+ * endpoint: 'http://localhost:8080',
17
+ * model: 'rlm-7b',
18
+ * maxDepth: 3,
19
+ * });
20
+ * await adapter.initialize({});
21
+ * const result = await adapter.executeAgent('rlm-planner', payload, ctx);
22
+ * ```
23
+ *
24
+ * @module RLMAdapter
25
+ * @version 1.0.0
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.RLMAdapter = void 0;
29
+ const base_adapter_1 = require("./base-adapter");
30
+ // ---------------------------------------------------------------------------
31
+ // Adapter
32
+ // ---------------------------------------------------------------------------
33
+ /**
34
+ * Adapter for RLM-compatible recursive language-model servers.
35
+ */
36
+ class RLMAdapter extends base_adapter_1.BaseAdapter {
37
+ name = 'rlm';
38
+ version = '1.0.0';
39
+ agentConfigs = new Map();
40
+ get capabilities() {
41
+ return {
42
+ streaming: false,
43
+ parallel: true,
44
+ bidirectional: false,
45
+ discovery: false,
46
+ authentication: false,
47
+ statefulSessions: false,
48
+ };
49
+ }
50
+ async initialize(config) {
51
+ await super.initialize(config);
52
+ }
53
+ /**
54
+ * Register an agent backed by an RLM endpoint.
55
+ *
56
+ * @param agentId Unique agent identifier used when calling `executeAgent`.
57
+ * @param config Per-agent RLM configuration.
58
+ */
59
+ registerAgent(agentId, config) {
60
+ if (!agentId || typeof agentId !== 'string') {
61
+ throw new TypeError('RLMAdapter.registerAgent: agentId must be a non-empty string');
62
+ }
63
+ if (!config.endpoint || typeof config.endpoint !== 'string') {
64
+ throw new TypeError('RLMAdapter.registerAgent: config.endpoint must be a non-empty string');
65
+ }
66
+ this.agentConfigs.set(agentId, { config });
67
+ this.registerLocalAgent({
68
+ id: agentId,
69
+ name: agentId,
70
+ description: `RLM agent at ${config.endpoint}`,
71
+ capabilities: ['completion'],
72
+ status: 'available',
73
+ });
74
+ }
75
+ async executeAgent(agentId, payload, context) {
76
+ this.ensureReady();
77
+ const stored = this.agentConfigs.get(agentId);
78
+ if (!stored) {
79
+ return this.errorResult('AGENT_NOT_FOUND', `RLMAdapter: no agent registered with id "${agentId}"`, false);
80
+ }
81
+ const { config } = stored;
82
+ const startMs = Date.now();
83
+ try {
84
+ const prompt = this._buildPrompt(config.systemPrompt, payload);
85
+ const requestBody = {
86
+ prompt,
87
+ model: config.model ?? 'rlm-default',
88
+ max_depth: config.maxDepth ?? 1,
89
+ agent_id: agentId,
90
+ task_id: context.taskId,
91
+ session_id: context.sessionId,
92
+ metadata: context.metadata,
93
+ };
94
+ const responseBody = await this._post(config, `${config.endpoint}/completion`, requestBody);
95
+ const text = typeof responseBody['text'] === 'string'
96
+ ? responseBody['text']
97
+ : typeof responseBody['content'] === 'string'
98
+ ? responseBody['content']
99
+ : JSON.stringify(responseBody);
100
+ return this.successResult({ text, raw: responseBody }, Date.now() - startMs);
101
+ }
102
+ catch (err) {
103
+ return this.errorResult('RLM_REQUEST_FAILED', err instanceof Error ? err.message : String(err), true, err);
104
+ }
105
+ }
106
+ // --------------------------------------------------------------------------
107
+ // Private helpers
108
+ // --------------------------------------------------------------------------
109
+ /** Build a plain-text prompt from the agent config + payload. */
110
+ _buildPrompt(systemPrompt, payload) {
111
+ const parts = [];
112
+ if (systemPrompt)
113
+ parts.push(systemPrompt);
114
+ parts.push(`Action: ${payload.action}`);
115
+ if (payload.params && Object.keys(payload.params).length > 0) {
116
+ try {
117
+ parts.push(`Params: ${JSON.stringify(payload.params)}`);
118
+ }
119
+ catch {
120
+ parts.push('Params: [unserializable]');
121
+ }
122
+ }
123
+ if (payload.handoff) {
124
+ parts.push(`Instruction: ${payload.handoff.instruction ?? ''}`);
125
+ }
126
+ return parts.join('\n');
127
+ }
128
+ /**
129
+ * Send a POST request using the BYOC client when provided,
130
+ * otherwise fall back to the built-in `fetch`-based transport.
131
+ */
132
+ async _post(config, url, body) {
133
+ const timeoutMs = config.timeoutMs ?? 60_000;
134
+ if (config.client) {
135
+ const result = await config.client.post(url, body, {
136
+ headers: config.headers,
137
+ timeoutMs,
138
+ });
139
+ return result;
140
+ }
141
+ // Built-in fetch transport with timeout via AbortController
142
+ const controller = new AbortController();
143
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
144
+ try {
145
+ const headers = {
146
+ 'Content-Type': 'application/json',
147
+ ...(config.headers ?? {}),
148
+ };
149
+ const response = await fetch(url, {
150
+ method: 'POST',
151
+ headers,
152
+ body: JSON.stringify(body),
153
+ signal: controller.signal,
154
+ });
155
+ if (!response.ok) {
156
+ throw new Error(`RLM HTTP ${response.status}: ${response.statusText}`);
157
+ }
158
+ const json = await response.json();
159
+ return json;
160
+ }
161
+ finally {
162
+ clearTimeout(timer);
163
+ }
164
+ }
165
+ }
166
+ exports.RLMAdapter = RLMAdapter;
167
+ //# sourceMappingURL=rlm-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlm-adapter.js","sourceRoot":"","sources":["../../../adapters/rlm-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ /**
3
+ * Semantic Kernel Adapter
4
+ *
5
+ * Integrates Microsoft Semantic Kernel agents and functions with the
6
+ * SwarmOrchestrator. Semantic Kernel is Microsoft's enterprise SDK for
7
+ * building AI-powered apps with plugins, planners, and memory.
8
+ *
9
+ * Usage:
10
+ * const adapter = new SemanticKernelAdapter();
11
+ * adapter.registerKernel("planner", myKernel);
12
+ * adapter.registerFunction("summarise", mySKFunction);
13
+ * await registry.addAdapter(adapter);
14
+ *
15
+ * Then in the orchestrator:
16
+ * delegateTask({ targetAgent: "semantic-kernel:planner", ... })
17
+ *
18
+ * @module SemanticKernelAdapter
19
+ * @version 1.0.0
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.SemanticKernelAdapter = void 0;
23
+ const base_adapter_1 = require("./base-adapter");
24
+ class SemanticKernelAdapter extends base_adapter_1.BaseAdapter {
25
+ name = 'semantic-kernel';
26
+ version = '1.0.0';
27
+ entries = new Map();
28
+ get capabilities() {
29
+ return {
30
+ streaming: false,
31
+ parallel: true,
32
+ bidirectional: false,
33
+ discovery: true,
34
+ authentication: true,
35
+ statefulSessions: true,
36
+ };
37
+ }
38
+ // --- Registration ---
39
+ registerKernel(agentId, kernel, metadata) {
40
+ this.entries.set(agentId, { type: 'kernel', kernel });
41
+ this.registerLocalAgent({
42
+ id: agentId,
43
+ name: agentId,
44
+ description: metadata?.description ?? `Semantic Kernel: ${agentId}`,
45
+ capabilities: metadata?.capabilities ?? ['planner', 'plugins', 'prompt'],
46
+ status: 'available',
47
+ });
48
+ }
49
+ registerFunction(agentId, fn, metadata) {
50
+ this.entries.set(agentId, { type: 'function', fn });
51
+ this.registerLocalAgent({
52
+ id: agentId,
53
+ name: fn.name || agentId,
54
+ description: metadata?.description ?? `SK Function: ${fn.name || agentId}`,
55
+ capabilities: metadata?.capabilities ?? ['function'],
56
+ status: 'available',
57
+ });
58
+ }
59
+ // --- Execution ---
60
+ async executeAgent(agentId, payload, context) {
61
+ this.ensureReady();
62
+ const entry = this.entries.get(agentId);
63
+ if (!entry) {
64
+ return this.errorResult('AGENT_NOT_FOUND', `Semantic Kernel entry "${agentId}" is not registered`, false);
65
+ }
66
+ const startTime = Date.now();
67
+ try {
68
+ if (entry.type === 'function') {
69
+ return await this.executeSKFunction(entry.fn, payload, startTime);
70
+ }
71
+ return await this.executeKernel(entry.kernel, payload, startTime);
72
+ }
73
+ catch (error) {
74
+ return this.errorResult('SK_ERROR', error instanceof Error ? error.message : 'Semantic Kernel execution failed', true, error);
75
+ }
76
+ }
77
+ // --- Private helpers ---
78
+ async executeSKFunction(fn, payload, startTime) {
79
+ const args = this.buildArgs(payload);
80
+ const result = await fn.invoke(args);
81
+ return this.successResult(this.normalizeResult(result), Date.now() - startTime);
82
+ }
83
+ async executeKernel(kernel, payload, startTime) {
84
+ const goal = payload.handoff?.instruction || JSON.stringify(payload.params);
85
+ const args = this.buildArgs(payload);
86
+ // Strategy 1: Use planner if available and we have a goal
87
+ if (kernel.runPlan && payload.handoff?.instruction) {
88
+ const plan = await kernel.runPlan(goal, args);
89
+ return this.successResult({
90
+ response: plan.result,
91
+ steps: plan.steps,
92
+ error: plan.error,
93
+ }, Date.now() - startTime);
94
+ }
95
+ // Strategy 2: Invoke a named function
96
+ if (kernel.invokeFunction && payload.params?.functionName) {
97
+ const result = await kernel.invokeFunction(String(payload.params.functionName), args);
98
+ return this.successResult(this.normalizeResult(result), Date.now() - startTime);
99
+ }
100
+ // Strategy 3: Invoke a prompt directly
101
+ if (kernel.invokePrompt) {
102
+ const result = await kernel.invokePrompt(goal, args);
103
+ return this.successResult(this.normalizeResult(result), Date.now() - startTime);
104
+ }
105
+ return this.errorResult('NO_METHOD', 'Kernel has no callable method (runPlan, invokeFunction, invokePrompt)', false);
106
+ }
107
+ buildArgs(payload) {
108
+ const args = { ...payload.params };
109
+ if (payload.handoff?.instruction)
110
+ args.input = payload.handoff.instruction;
111
+ if (payload.blackboardSnapshot)
112
+ args.context = payload.blackboardSnapshot;
113
+ return args;
114
+ }
115
+ normalizeResult(result) {
116
+ return {
117
+ response: result.value ?? result.toString?.() ?? '',
118
+ metadata: result.metadata,
119
+ };
120
+ }
121
+ }
122
+ exports.SemanticKernelAdapter = SemanticKernelAdapter;
123
+ //# sourceMappingURL=semantic-kernel-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-kernel-adapter.js","sourceRoot":"","sources":["../../../adapters/semantic-kernel-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * StreamingBaseAdapter — Abstract base for all streaming-capable adapters.
4
+ *
5
+ * Extends {@link BaseAdapter} with a default `executeAgentStream()` that wraps
6
+ * the non-streaming `executeAgent()` result as a single `StreamingChunk`.
7
+ * Subclasses override `executeAgentStream()` and/or `supportsStreaming()` to
8
+ * provide genuine incremental streaming.
9
+ *
10
+ * @module StreamingBaseAdapter
11
+ * @version 1.0.0
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.StreamingBaseAdapter = void 0;
15
+ exports.collectStream = collectStream;
16
+ const base_adapter_1 = require("./base-adapter");
17
+ class StreamingBaseAdapter extends base_adapter_1.BaseAdapter {
18
+ /**
19
+ * Returns `true` when the named agent has a real streaming implementation.
20
+ * Default: `false` (fallback single-chunk wrapper is used).
21
+ * Override in subclasses that register streaming agents.
22
+ */
23
+ supportsStreaming(_agentId) {
24
+ return false;
25
+ }
26
+ /**
27
+ * Default streaming implementation — wraps `executeAgent()` as a single chunk.
28
+ *
29
+ * Subclasses that support genuine streaming should override this method.
30
+ * The overriding implementation should:
31
+ * 1. yield partial text chunks as they arrive
32
+ * 2. yield a final chunk with `done: true` and `text: ''`
33
+ *
34
+ * **Permission-check semantics:** Permission is checked once at the start of
35
+ * the stream (when `executeAgent` / the overriding implementation begins),
36
+ * not per-chunk. A stream is treated as a single logical operation. Keep
37
+ * stream lifetimes short and request the narrowest permission scope possible
38
+ * to minimise the window between the initial check and stream completion.
39
+ */
40
+ async *executeAgentStream(agentId, payload, context) {
41
+ const result = await this.executeAgent(agentId, payload, context);
42
+ if (!result.success) {
43
+ // Propagate the error as a single done-chunk with error text
44
+ const msg = result.error?.message ?? 'Agent execution failed';
45
+ yield { text: msg, done: true, metadata: { error: true, code: result.error?.code } };
46
+ return;
47
+ }
48
+ // Flatten data to a string for the streaming consumer
49
+ const data = result.data;
50
+ const text = typeof data === 'string' ? data :
51
+ data != null ? JSON.stringify(data) :
52
+ '';
53
+ yield { text, done: false, metadata: result.metadata };
54
+ yield { text: '', done: true, metadata: { adapter: this.name } };
55
+ }
56
+ }
57
+ exports.StreamingBaseAdapter = StreamingBaseAdapter;
58
+ /**
59
+ * Utility: drain a streaming adapter into a single accumulated result.
60
+ *
61
+ * @example
62
+ * const { output } = await collectStream(adapter.executeAgentStream('my-agent', payload, ctx));
63
+ */
64
+ async function collectStream(stream) {
65
+ const chunks = [];
66
+ let output = '';
67
+ for await (const chunk of stream) {
68
+ chunks.push(chunk);
69
+ if (chunk.text)
70
+ output += chunk.text;
71
+ }
72
+ return { output, chunks };
73
+ }
74
+ //# sourceMappingURL=streaming-base-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-base-adapter.js","sourceRoot":"","sources":["../../../adapters/streaming-base-adapter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AA+DH,sCAUC;AArED,iDAA6C;AAE7C,MAAsB,oBAAqB,SAAQ,0BAAW;IAE5D;;;;OAIG;IACH,iBAAiB,CAAC,QAAgB;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,CAAC,kBAAkB,CACvB,OAAe,EACf,OAAqB,EACrB,OAAqB;QAErB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,6DAA6D;YAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,wBAAwB,CAAC;YAC9D,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;YACrF,OAAO;QACT,CAAC;QAED,sDAAsD;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,IAAI,GACR,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,IAAI,IAAI,CAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtB,EAAE,CAAC;QAEhC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvD,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IACnE,CAAC;CACF;AAjDD,oDAiDC;AAED;;;;;GAKG;AACI,KAAK,UAAU,aAAa,CACjC,MAAqC;IAErC,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;IACvC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ /**
3
+ * Vertex AI Adapter
4
+ *
5
+ * Integrates Google Vertex AI (Gemini models, PaLM, custom endpoints)
6
+ * with the SwarmOrchestrator.
7
+ *
8
+ * Supports:
9
+ * - Gemini chat/generation (via user-supplied client)
10
+ * - Function calling / tool use
11
+ * - Multi-modal inputs (text + images)
12
+ * - Custom Vertex AI endpoints
13
+ *
14
+ * Usage:
15
+ * const adapter = new VertexAIAdapter();
16
+ * adapter.registerModel('analyst', {
17
+ * client: myVertexClient,
18
+ * model: 'gemini-2.0-flash',
19
+ * });
20
+ *
21
+ * @module VertexAIAdapter
22
+ * @version 1.0.0
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.VertexAIAdapter = void 0;
26
+ const base_adapter_1 = require("./base-adapter");
27
+ // ---------------------------------------------------------------------------
28
+ // Adapter
29
+ // ---------------------------------------------------------------------------
30
+ /**
31
+ * Adapter for Google Vertex AI (Gemini, PaLM, custom endpoints).
32
+ *
33
+ * Each registered model is exposed as a named agent. Supports
34
+ * multi-turn tool use loops when functions are configured.
35
+ */
36
+ class VertexAIAdapter extends base_adapter_1.BaseAdapter {
37
+ name = 'vertex-ai';
38
+ version = '1.0.0';
39
+ models = new Map();
40
+ get capabilities() {
41
+ return {
42
+ streaming: false,
43
+ parallel: true,
44
+ bidirectional: false,
45
+ discovery: true,
46
+ authentication: true,
47
+ statefulSessions: false,
48
+ };
49
+ }
50
+ // -----------------------------------------------------------------------
51
+ // Registration
52
+ // -----------------------------------------------------------------------
53
+ /**
54
+ * Register a Vertex AI model as a named agent.
55
+ */
56
+ registerModel(agentId, config) {
57
+ this.models.set(agentId, config);
58
+ this.registerLocalAgent({
59
+ id: agentId,
60
+ name: agentId,
61
+ status: 'available',
62
+ capabilities: [
63
+ 'generation',
64
+ ...(config.functions?.length ? ['tool-use'] : []),
65
+ ],
66
+ metadata: {
67
+ adapter: 'vertex-ai',
68
+ model: config.model ?? 'gemini-2.0-flash',
69
+ },
70
+ });
71
+ }
72
+ // -----------------------------------------------------------------------
73
+ // Execution
74
+ // -----------------------------------------------------------------------
75
+ async executeAgent(agentId, payload, _context) {
76
+ this.ensureReady();
77
+ const config = this.models.get(agentId);
78
+ if (!config) {
79
+ return this.errorResult('VERTEX_AGENT_NOT_FOUND', `No model registered as '${agentId}'`);
80
+ }
81
+ const instruction = payload.handoff?.instruction
82
+ ?? payload.params?.instruction
83
+ ?? payload.action;
84
+ const timeoutMs = config.timeoutMs ?? 60_000;
85
+ const maxIterations = config.maxIterations ?? 10;
86
+ const start = Date.now();
87
+ // Build initial contents
88
+ const userParts = [{ text: instruction }];
89
+ // Add image if provided
90
+ const imageData = payload.params?.image;
91
+ const imageMime = payload.params?.imageMimeType ?? 'image/png';
92
+ if (imageData) {
93
+ userParts.push({ inlineData: { mimeType: imageMime, data: imageData } });
94
+ }
95
+ const contents = [
96
+ { role: 'user', parts: userParts },
97
+ ];
98
+ const systemInstruction = config.systemInstruction
99
+ ? { parts: [{ text: config.systemInstruction }] }
100
+ : undefined;
101
+ const tools = config.functions?.length
102
+ ? [{ functionDeclarations: config.functions }]
103
+ : undefined;
104
+ let iterations = 0;
105
+ let totalTokens = 0;
106
+ try {
107
+ while (iterations < maxIterations) {
108
+ iterations++;
109
+ const result = await Promise.race([
110
+ config.client.generateContent({ contents, systemInstruction, tools }),
111
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Vertex AI invocation timed out')), timeoutMs)),
112
+ ]);
113
+ const response = result.response;
114
+ if (response.usageMetadata) {
115
+ totalTokens += response.usageMetadata.totalTokenCount;
116
+ }
117
+ // If no function calls or no executor, return text result
118
+ if (!response.functionCalls?.length || !config.functionExecutor) {
119
+ const durationMs = Date.now() - start;
120
+ return this.successResult({
121
+ text: response.text,
122
+ finishReason: response.finishReason,
123
+ tokensUsed: totalTokens,
124
+ safetyRatings: response.safetyRatings,
125
+ iterations,
126
+ }, durationMs);
127
+ }
128
+ // Execute function calls
129
+ contents.push({
130
+ role: 'model',
131
+ parts: response.functionCalls.map((fc) => ({
132
+ text: JSON.stringify({ functionCall: { name: fc.name, args: fc.args } }),
133
+ })),
134
+ });
135
+ const functionResults = [];
136
+ for (const fc of response.functionCalls) {
137
+ const fnResult = await config.functionExecutor(fc.name, fc.args);
138
+ functionResults.push({
139
+ text: JSON.stringify({ functionResponse: { name: fc.name, response: fnResult } }),
140
+ });
141
+ }
142
+ contents.push({ role: 'function', parts: functionResults });
143
+ }
144
+ // Max iterations
145
+ const durationMs = Date.now() - start;
146
+ return this.successResult({
147
+ text: 'Max function-call iterations reached',
148
+ tokensUsed: totalTokens,
149
+ iterations,
150
+ exhausted: true,
151
+ }, durationMs);
152
+ }
153
+ catch (err) {
154
+ return this.errorResult('VERTEX_EXECUTION_FAILED', err instanceof Error ? err.message : String(err));
155
+ }
156
+ }
157
+ // -----------------------------------------------------------------------
158
+ // Lifecycle
159
+ // -----------------------------------------------------------------------
160
+ async shutdown() {
161
+ this.models.clear();
162
+ await super.shutdown();
163
+ }
164
+ }
165
+ exports.VertexAIAdapter = VertexAIAdapter;
166
+ //# sourceMappingURL=vertex-ai-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertex-ai-adapter.js","sourceRoot":"","sources":["../../../adapters/vertex-ai-adapter.ts"],"names":[],"mappings":"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"}