network-ai 4.15.2 → 5.0.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 (204) hide show
  1. package/INTEGRATION_GUIDE.md +11 -4
  2. package/QUICKSTART.md +31 -4
  3. package/README.md +37 -15
  4. package/bin/dashboard.ts +146 -0
  5. package/bin/mcp-server.ts +3 -2
  6. package/dist/adapters/adapter-registry.d.ts +33 -1
  7. package/dist/adapters/adapter-registry.d.ts.map +1 -1
  8. package/dist/adapters/adapter-registry.js +49 -0
  9. package/dist/adapters/adapter-registry.js.map +1 -1
  10. package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
  11. package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
  12. package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
  13. package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
  14. package/dist/adapters/browser-agent-adapter.d.ts +121 -0
  15. package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
  16. package/dist/adapters/browser-agent-adapter.js +219 -0
  17. package/dist/adapters/browser-agent-adapter.js.map +1 -0
  18. package/dist/adapters/copilot-adapter.d.ts +59 -0
  19. package/dist/adapters/copilot-adapter.d.ts.map +1 -0
  20. package/dist/adapters/copilot-adapter.js +132 -0
  21. package/dist/adapters/copilot-adapter.js.map +1 -0
  22. package/dist/adapters/index.d.ts +15 -1
  23. package/dist/adapters/index.d.ts.map +1 -1
  24. package/dist/adapters/index.js +22 -1
  25. package/dist/adapters/index.js.map +1 -1
  26. package/dist/adapters/langgraph-adapter.d.ts +70 -0
  27. package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
  28. package/dist/adapters/langgraph-adapter.js +119 -0
  29. package/dist/adapters/langgraph-adapter.js.map +1 -0
  30. package/dist/adapters/openai-agents-adapter.d.ts +100 -0
  31. package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
  32. package/dist/adapters/openai-agents-adapter.js +118 -0
  33. package/dist/adapters/openai-agents-adapter.js.map +1 -0
  34. package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
  35. package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
  36. package/dist/adapters/pydantic-ai-adapter.js +163 -0
  37. package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
  38. package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
  39. package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
  40. package/dist/adapters/vertex-ai-adapter.js +166 -0
  41. package/dist/adapters/vertex-ai-adapter.js.map +1 -0
  42. package/dist/bin/dashboard.d.ts +11 -0
  43. package/dist/bin/dashboard.d.ts.map +1 -0
  44. package/dist/bin/dashboard.js +135 -0
  45. package/dist/bin/dashboard.js.map +1 -0
  46. package/dist/bin/mcp-server.js +3 -2
  47. package/dist/bin/mcp-server.js.map +1 -1
  48. package/dist/index.d.ts +103 -559
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +295 -1074
  51. package/dist/index.js.map +1 -1
  52. package/dist/lib/adapter-test-harness.d.ts +88 -0
  53. package/dist/lib/adapter-test-harness.d.ts.map +1 -0
  54. package/dist/lib/adapter-test-harness.js +118 -0
  55. package/dist/lib/adapter-test-harness.js.map +1 -0
  56. package/dist/lib/agent-conversation.d.ts +115 -0
  57. package/dist/lib/agent-conversation.d.ts.map +1 -0
  58. package/dist/lib/agent-conversation.js +155 -0
  59. package/dist/lib/agent-conversation.js.map +1 -0
  60. package/dist/lib/agent-debate.d.ts +115 -0
  61. package/dist/lib/agent-debate.d.ts.map +1 -0
  62. package/dist/lib/agent-debate.js +146 -0
  63. package/dist/lib/agent-debate.js.map +1 -0
  64. package/dist/lib/agent-memory.d.ts +157 -0
  65. package/dist/lib/agent-memory.d.ts.map +1 -0
  66. package/dist/lib/agent-memory.js +336 -0
  67. package/dist/lib/agent-memory.js.map +1 -0
  68. package/dist/lib/agent-vcr.d.ts +133 -0
  69. package/dist/lib/agent-vcr.d.ts.map +1 -0
  70. package/dist/lib/agent-vcr.js +218 -0
  71. package/dist/lib/agent-vcr.js.map +1 -0
  72. package/dist/lib/anomaly-detector.d.ts +112 -0
  73. package/dist/lib/anomaly-detector.d.ts.map +1 -0
  74. package/dist/lib/anomaly-detector.js +178 -0
  75. package/dist/lib/anomaly-detector.js.map +1 -0
  76. package/dist/lib/approval-inbox.d.ts +147 -0
  77. package/dist/lib/approval-inbox.d.ts.map +1 -0
  78. package/dist/lib/approval-inbox.js +385 -0
  79. package/dist/lib/approval-inbox.js.map +1 -0
  80. package/dist/lib/auth-guardian.d.ts +170 -0
  81. package/dist/lib/auth-guardian.d.ts.map +1 -0
  82. package/dist/lib/auth-guardian.js +604 -0
  83. package/dist/lib/auth-guardian.js.map +1 -0
  84. package/dist/lib/auth-validator.d.ts +70 -0
  85. package/dist/lib/auth-validator.d.ts.map +1 -0
  86. package/dist/lib/auth-validator.js +32 -0
  87. package/dist/lib/auth-validator.js.map +1 -0
  88. package/dist/lib/blackboard-validator.d.ts +56 -0
  89. package/dist/lib/blackboard-validator.d.ts.map +1 -1
  90. package/dist/lib/blackboard-validator.js +181 -4
  91. package/dist/lib/blackboard-validator.js.map +1 -1
  92. package/dist/lib/comparison-runner.d.ts +99 -0
  93. package/dist/lib/comparison-runner.d.ts.map +1 -0
  94. package/dist/lib/comparison-runner.js +138 -0
  95. package/dist/lib/comparison-runner.js.map +1 -0
  96. package/dist/lib/config-watcher.d.ts +109 -0
  97. package/dist/lib/config-watcher.d.ts.map +1 -0
  98. package/dist/lib/config-watcher.js +215 -0
  99. package/dist/lib/config-watcher.js.map +1 -0
  100. package/dist/lib/cost-governor.d.ts +105 -0
  101. package/dist/lib/cost-governor.d.ts.map +1 -0
  102. package/dist/lib/cost-governor.js +128 -0
  103. package/dist/lib/cost-governor.js.map +1 -0
  104. package/dist/lib/cost-heatmap.d.ts +104 -0
  105. package/dist/lib/cost-heatmap.d.ts.map +1 -0
  106. package/dist/lib/cost-heatmap.js +161 -0
  107. package/dist/lib/cost-heatmap.js.map +1 -0
  108. package/dist/lib/coverage-reporter.d.ts +92 -0
  109. package/dist/lib/coverage-reporter.d.ts.map +1 -0
  110. package/dist/lib/coverage-reporter.js +177 -0
  111. package/dist/lib/coverage-reporter.js.map +1 -0
  112. package/dist/lib/dashboard-server.d.ts +71 -0
  113. package/dist/lib/dashboard-server.d.ts.map +1 -0
  114. package/dist/lib/dashboard-server.js +403 -0
  115. package/dist/lib/dashboard-server.js.map +1 -0
  116. package/dist/lib/dry-run.d.ts +73 -0
  117. package/dist/lib/dry-run.d.ts.map +1 -0
  118. package/dist/lib/dry-run.js +130 -0
  119. package/dist/lib/dry-run.js.map +1 -0
  120. package/dist/lib/errors.d.ts +15 -0
  121. package/dist/lib/errors.d.ts.map +1 -1
  122. package/dist/lib/errors.js +38 -0
  123. package/dist/lib/errors.js.map +1 -1
  124. package/dist/lib/event-bus.d.ts +167 -0
  125. package/dist/lib/event-bus.d.ts.map +1 -0
  126. package/dist/lib/event-bus.js +229 -0
  127. package/dist/lib/event-bus.js.map +1 -0
  128. package/dist/lib/explainability.d.ts +85 -0
  129. package/dist/lib/explainability.d.ts.map +1 -0
  130. package/dist/lib/explainability.js +102 -0
  131. package/dist/lib/explainability.js.map +1 -0
  132. package/dist/lib/goal-dsl.d.ts +157 -0
  133. package/dist/lib/goal-dsl.d.ts.map +1 -0
  134. package/dist/lib/goal-dsl.js +392 -0
  135. package/dist/lib/goal-dsl.js.map +1 -0
  136. package/dist/lib/job-queue.d.ts +183 -0
  137. package/dist/lib/job-queue.d.ts.map +1 -0
  138. package/dist/lib/job-queue.js +310 -0
  139. package/dist/lib/job-queue.js.map +1 -0
  140. package/dist/lib/learning-loop.d.ts +113 -0
  141. package/dist/lib/learning-loop.d.ts.map +1 -0
  142. package/dist/lib/learning-loop.js +181 -0
  143. package/dist/lib/learning-loop.js.map +1 -0
  144. package/dist/lib/lifecycle-hooks.d.ts +116 -0
  145. package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
  146. package/dist/lib/lifecycle-hooks.js +148 -0
  147. package/dist/lib/lifecycle-hooks.js.map +1 -0
  148. package/dist/lib/locked-blackboard.d.ts.map +1 -1
  149. package/dist/lib/locked-blackboard.js +9 -5
  150. package/dist/lib/locked-blackboard.js.map +1 -1
  151. package/dist/lib/mcp-tool-consumer.d.ts +153 -0
  152. package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
  153. package/dist/lib/mcp-tool-consumer.js +320 -0
  154. package/dist/lib/mcp-tool-consumer.js.map +1 -0
  155. package/dist/lib/metrics.d.ts +119 -0
  156. package/dist/lib/metrics.d.ts.map +1 -0
  157. package/dist/lib/metrics.js +284 -0
  158. package/dist/lib/metrics.js.map +1 -0
  159. package/dist/lib/orchestrator-types.d.ts +309 -0
  160. package/dist/lib/orchestrator-types.d.ts.map +1 -0
  161. package/dist/lib/orchestrator-types.js +61 -0
  162. package/dist/lib/orchestrator-types.js.map +1 -0
  163. package/dist/lib/otel-bridge.d.ts +74 -0
  164. package/dist/lib/otel-bridge.d.ts.map +1 -0
  165. package/dist/lib/otel-bridge.js +167 -0
  166. package/dist/lib/otel-bridge.js.map +1 -0
  167. package/dist/lib/playground.d.ts +76 -0
  168. package/dist/lib/playground.d.ts.map +1 -0
  169. package/dist/lib/playground.js +224 -0
  170. package/dist/lib/playground.js.map +1 -0
  171. package/dist/lib/quadtree.d.ts +114 -0
  172. package/dist/lib/quadtree.d.ts.map +1 -0
  173. package/dist/lib/quadtree.js +259 -0
  174. package/dist/lib/quadtree.js.map +1 -0
  175. package/dist/lib/shared-blackboard.d.ts +101 -0
  176. package/dist/lib/shared-blackboard.d.ts.map +1 -0
  177. package/dist/lib/shared-blackboard.js +249 -0
  178. package/dist/lib/shared-blackboard.js.map +1 -0
  179. package/dist/lib/speculative-executor.d.ts +89 -0
  180. package/dist/lib/speculative-executor.d.ts.map +1 -0
  181. package/dist/lib/speculative-executor.js +107 -0
  182. package/dist/lib/speculative-executor.js.map +1 -0
  183. package/dist/lib/swarm-transport.d.ts +150 -0
  184. package/dist/lib/swarm-transport.d.ts.map +1 -0
  185. package/dist/lib/swarm-transport.js +307 -0
  186. package/dist/lib/swarm-transport.js.map +1 -0
  187. package/dist/lib/task-decomposer.d.ts +41 -0
  188. package/dist/lib/task-decomposer.d.ts.map +1 -0
  189. package/dist/lib/task-decomposer.js +272 -0
  190. package/dist/lib/task-decomposer.js.map +1 -0
  191. package/dist/lib/timeline-scrubber.d.ts +84 -0
  192. package/dist/lib/timeline-scrubber.d.ts.map +1 -0
  193. package/dist/lib/timeline-scrubber.js +173 -0
  194. package/dist/lib/timeline-scrubber.js.map +1 -0
  195. package/dist/lib/topology.d.ts +361 -0
  196. package/dist/lib/topology.d.ts.map +1 -0
  197. package/dist/lib/topology.js +591 -0
  198. package/dist/lib/topology.js.map +1 -0
  199. package/dist/security.d.ts +95 -0
  200. package/dist/security.d.ts.map +1 -1
  201. package/dist/security.js +267 -5
  202. package/dist/security.js.map +1 -1
  203. package/package.json +7 -5
  204. package/types/agent-adapter.d.ts +5 -0
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ /**
3
+ * Namespace-scoped, identity-verified shared state for multi-agent coordination.
4
+ *
5
+ * Every write is identity-verified (agent token), namespace-checked,
6
+ * size-validated, input-sanitized, and atomically persisted through
7
+ * the pluggable {@link BlackboardBackend}.
8
+ *
9
+ * @module SharedBlackboard
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SharedBlackboard = void 0;
13
+ const blackboard_backend_1 = require("./blackboard-backend");
14
+ const security_1 = require("../security");
15
+ const errors_1 = require("./errors");
16
+ const orchestrator_types_1 = require("./orchestrator-types");
17
+ /**
18
+ * Namespace-scoped, identity-verified shared state for multi-agent coordination.
19
+ *
20
+ * Every write is identity-verified (agent token), namespace-checked,
21
+ * size-validated, input-sanitized, and atomically persisted through
22
+ * {@link LockedBlackboard}.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const bb = new SharedBlackboard('./workspace');
27
+ * bb.registerAgent('analyst', 'secret-token', ['task:', 'analytics:']);
28
+ * bb.write('task:revenue', { q4: 42_000 }, 'analyst', 3600, 'secret-token');
29
+ * const entry = bb.read('task:revenue');
30
+ * ```
31
+ */
32
+ class SharedBlackboard {
33
+ backend;
34
+ agentTokens = new Map(); // agentId -> verified token
35
+ agentNamespaces = new Map(); // agentId -> allowed prefixes
36
+ piiRedactor = null;
37
+ constructor(backendOrPath, options) {
38
+ if (typeof backendOrPath === 'string') {
39
+ if (!backendOrPath || backendOrPath.trim() === '') {
40
+ throw new errors_1.ValidationError('basePath must be a non-empty string');
41
+ }
42
+ this.backend = new blackboard_backend_1.FileBackend(backendOrPath);
43
+ }
44
+ else {
45
+ if (!backendOrPath || typeof backendOrPath !== 'object') {
46
+ throw new errors_1.ValidationError('backend must be a BlackboardBackend instance');
47
+ }
48
+ this.backend = backendOrPath;
49
+ }
50
+ if (options?.enablePIIRedaction) {
51
+ this.piiRedactor = new security_1.PIIRedactor();
52
+ }
53
+ }
54
+ /**
55
+ * Enable or disable PII redaction on writes.
56
+ */
57
+ setPIIRedaction(enabled) {
58
+ this.piiRedactor = enabled ? new security_1.PIIRedactor() : null;
59
+ }
60
+ /**
61
+ * Register a verified agent identity. Only agents with registered tokens
62
+ * can write to the blackboard. The orchestrator registers agents after
63
+ * verifying their identity through the AuthGuardian.
64
+ */
65
+ registerAgent(agentId, verificationToken, allowedNamespaces = ['*']) {
66
+ if (!agentId || typeof agentId !== 'string' || agentId.trim() === '') {
67
+ throw new errors_1.ValidationError('agentId must be a non-empty string');
68
+ }
69
+ if (!verificationToken || typeof verificationToken !== 'string') {
70
+ throw new errors_1.ValidationError('verificationToken must be a non-empty string');
71
+ }
72
+ if (!Array.isArray(allowedNamespaces)) {
73
+ throw new errors_1.ValidationError('allowedNamespaces must be an array of strings');
74
+ }
75
+ this.agentTokens.set(agentId, verificationToken);
76
+ this.agentNamespaces.set(agentId, allowedNamespaces);
77
+ }
78
+ /**
79
+ * Check if an agent is allowed to access a key based on namespace rules.
80
+ */
81
+ canAccessKey(agentId, key) {
82
+ const namespaces = this.agentNamespaces.get(agentId);
83
+ if (!namespaces)
84
+ return false;
85
+ if (namespaces.includes('*'))
86
+ return true;
87
+ return namespaces.some(ns => key.startsWith(ns));
88
+ }
89
+ /**
90
+ * Verify that the calling agent is who they claim to be.
91
+ */
92
+ verifyAgent(agentId, token) {
93
+ const registeredToken = this.agentTokens.get(agentId);
94
+ // If no token system is configured for this agent, allow (backward compat)
95
+ if (!registeredToken)
96
+ return true;
97
+ return token === registeredToken;
98
+ }
99
+ /**
100
+ * Validate value size and structure before writing.
101
+ * Prevents DoS via oversized writes and circular data.
102
+ */
103
+ validateValue(value) {
104
+ try {
105
+ const serialized = JSON.stringify(value);
106
+ if (serialized.length > orchestrator_types_1.CONFIG.maxBlackboardValueSize) {
107
+ return { valid: false, reason: `Value exceeds max size (${serialized.length} > ${orchestrator_types_1.CONFIG.maxBlackboardValueSize} bytes)` };
108
+ }
109
+ return { valid: true };
110
+ }
111
+ catch {
112
+ return { valid: false, reason: 'Value cannot be serialized (circular reference or invalid structure)' };
113
+ }
114
+ }
115
+ /**
116
+ * Sanitize a key to prevent markdown injection.
117
+ */
118
+ sanitizeKey(key) {
119
+ // Keys must be safe for markdown headings -- no #, newlines, or markdown syntax
120
+ return key.replace(/[#\n\r|`]/g, '_').slice(0, 256);
121
+ }
122
+ /**
123
+ * Read an entry from the blackboard by key.
124
+ *
125
+ * @param key - The entry key to look up
126
+ * @returns The entry, or `null` if not found or expired
127
+ * @throws {@link ValidationError} if `key` is not a non-empty string
128
+ */
129
+ read(key) {
130
+ if (!key || typeof key !== 'string') {
131
+ throw new errors_1.ValidationError('key must be a non-empty string');
132
+ }
133
+ const entry = this.backend.read(key);
134
+ if (!entry)
135
+ return null;
136
+ // Normalize field name for backward compatibility
137
+ return {
138
+ key: entry.key,
139
+ value: entry.value,
140
+ sourceAgent: entry.source_agent ?? entry.sourceAgent ?? 'unknown',
141
+ timestamp: entry.timestamp,
142
+ ttl: entry.ttl,
143
+ };
144
+ }
145
+ /**
146
+ * Write to the blackboard with identity verification, namespace checks,
147
+ * value validation, and input sanitization. Uses LockedBlackboard for
148
+ * atomic file-system writes.
149
+ *
150
+ * @param key - The key to write
151
+ * @param value - The value (will be sanitized and size-checked)
152
+ * @param sourceAgent - Agent claiming to write (verified against registered token)
153
+ * @param ttl - Optional TTL in seconds
154
+ * @param agentToken - Optional verification token for identity check
155
+ */
156
+ write(key, value, sourceAgent, ttl, agentToken) {
157
+ // 1. Verify agent identity
158
+ if (!this.verifyAgent(sourceAgent, agentToken)) {
159
+ throw new errors_1.IdentityVerificationError(sourceAgent);
160
+ }
161
+ // 2. Namespace check
162
+ if (!this.canAccessKey(sourceAgent, key)) {
163
+ throw new errors_1.NamespaceViolationError(sourceAgent, key);
164
+ }
165
+ // 3. Sanitize key
166
+ const safeKey = this.sanitizeKey(key);
167
+ // 4. Validate value size/structure
168
+ const validation = this.validateValue(value);
169
+ if (!validation.valid) {
170
+ throw new errors_1.ValidationError(validation.reason);
171
+ }
172
+ // 5. Sanitize value -- strip injection payloads from string content
173
+ let sanitizedValue;
174
+ try {
175
+ sanitizedValue = security_1.InputSanitizer.sanitizeObject(value);
176
+ }
177
+ catch {
178
+ sanitizedValue = value; // Fall back to raw if sanitization can't handle it
179
+ }
180
+ // 5b. PII redaction -- strip emails, SSNs, credit cards, phones, IPs
181
+ if (this.piiRedactor) {
182
+ const { redacted } = this.piiRedactor.redactObject(sanitizedValue);
183
+ sanitizedValue = redacted;
184
+ }
185
+ // 6. Write through backend (atomic when using FileBackend; in-memory for MemoryBackend)
186
+ const entry = this.backend.write(safeKey, sanitizedValue, sourceAgent, ttl);
187
+ // Normalize for backward compat
188
+ return {
189
+ key: entry.key,
190
+ value: entry.value,
191
+ sourceAgent: entry.source_agent ?? sourceAgent,
192
+ timestamp: entry.timestamp,
193
+ ttl: entry.ttl,
194
+ };
195
+ }
196
+ /**
197
+ * Check whether a key exists on the blackboard (not expired).
198
+ * @param key - The entry key to check
199
+ */
200
+ exists(key) {
201
+ return this.read(key) !== null;
202
+ }
203
+ /**
204
+ * Get a full snapshot of all blackboard entries.
205
+ */
206
+ getSnapshot() {
207
+ const raw = this.backend.getSnapshot();
208
+ const normalized = {};
209
+ for (const [key, entry] of Object.entries(raw)) {
210
+ normalized[key] = {
211
+ key: entry.key,
212
+ value: entry.value,
213
+ sourceAgent: entry.source_agent ?? entry.sourceAgent ?? 'unknown',
214
+ timestamp: entry.timestamp,
215
+ ttl: entry.ttl,
216
+ };
217
+ }
218
+ return normalized;
219
+ }
220
+ /**
221
+ * Get a namespace-scoped snapshot -- only returns keys an agent is allowed to see.
222
+ * Prevents data leakage between agents.
223
+ */
224
+ getScopedSnapshot(agentId) {
225
+ if (!agentId || typeof agentId !== 'string') {
226
+ throw new errors_1.ValidationError('agentId must be a non-empty string');
227
+ }
228
+ const full = this.getSnapshot();
229
+ const scoped = {};
230
+ for (const [key, entry] of Object.entries(full)) {
231
+ if (this.canAccessKey(agentId, key)) {
232
+ scoped[key] = entry;
233
+ }
234
+ }
235
+ return scoped;
236
+ }
237
+ /**
238
+ * Clear all entries (for testing).
239
+ */
240
+ clear() {
241
+ // Write an empty state through locked backend
242
+ const keys = this.backend.listKeys();
243
+ for (const key of keys) {
244
+ this.backend.delete(key);
245
+ }
246
+ }
247
+ }
248
+ exports.SharedBlackboard = SharedBlackboard;
249
+ //# sourceMappingURL=shared-blackboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-blackboard.js","sourceRoot":"","sources":["../../lib/shared-blackboard.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,6DAAmD;AAEnD,0CAA0D;AAC1D,qCAIkB;AAClB,6DAA8C;AAG9C;;;;;;;;;;;;;;GAcG;AACH,MAAa,gBAAgB;IACnB,OAAO,CAAoB;IAC3B,WAAW,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,4BAA4B;IAC1E,eAAe,GAA0B,IAAI,GAAG,EAAE,CAAC,CAAC,8BAA8B;IAClF,WAAW,GAAuB,IAAI,CAAC;IAE/C,YAAY,aAAyC,EAAE,OAA0C;QAC/F,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClD,MAAM,IAAI,wBAAe,CAAC,qCAAqC,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,gCAAW,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;gBACxD,MAAM,IAAI,wBAAe,CAAC,8CAA8C,CAAC,CAAC;YAC5E,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,EAAE,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,IAAI,sBAAW,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAgB;QAC9B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,sBAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,OAAe,EAAE,iBAAyB,EAAE,oBAA8B,CAAC,GAAG,CAAC;QAC3F,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrE,MAAM,IAAI,wBAAe,CAAC,oCAAoC,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,iBAAiB,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;YAChE,MAAM,IAAI,wBAAe,CAAC,8CAA8C,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,wBAAe,CAAC,+CAA+C,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACjD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAe,EAAE,GAAW;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAAe,EAAE,KAAc;QACjD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtD,2EAA2E;QAC3E,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,KAAK,KAAK,eAAe,CAAC;IACnC,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,KAAc;QAClC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,UAAU,CAAC,MAAM,GAAG,2BAAM,CAAC,sBAAsB,EAAE,CAAC;gBACtD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,UAAU,CAAC,MAAM,MAAM,2BAAM,CAAC,sBAAsB,SAAS,EAAE,CAAC;YAC5H,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,sEAAsE,EAAE,CAAC;QAC1G,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,GAAW;QAC7B,gFAAgF;QAChF,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;OAMG;IACH,IAAI,CAAC,GAAW;QACd,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,wBAAe,CAAC,gCAAgC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,kDAAkD;QAClD,OAAO;YACL,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAG,KAAa,CAAC,YAAY,IAAK,KAAa,CAAC,WAAW,IAAI,SAAS;YACnF,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC;IACJ,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,GAAW,EAAE,KAAc,EAAE,WAAmB,EAAE,GAAY,EAAE,UAAmB;QACvF,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,kCAAyB,CAAC,WAAW,CAAC,CAAC;QACnD,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,gCAAuB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;QAED,kBAAkB;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEtC,mCAAmC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,wBAAe,CAAC,UAAU,CAAC,MAAO,CAAC,CAAC;QAChD,CAAC;QAED,oEAAoE;QACpE,IAAI,cAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,cAAc,GAAG,yBAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,GAAG,KAAK,CAAC,CAAC,mDAAmD;QAC7E,CAAC;QAED,qEAAqE;QACrE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YACnE,cAAc,GAAG,QAAQ,CAAC;QAC5B,CAAC;QAED,wFAAwF;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAE5E,gCAAgC;QAChC,OAAO;YACL,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAG,KAAa,CAAC,YAAY,IAAI,WAAW;YACvD,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,UAAU,GAAoC,EAAE,CAAC;QACvD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,UAAU,CAAC,GAAG,CAAC,GAAG;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW,EAAG,KAAa,CAAC,YAAY,IAAK,KAAa,CAAC,WAAW,IAAI,SAAS;gBACnF,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,OAAe;QAC/B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,wBAAe,CAAC,oCAAoC,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,MAAM,GAAoC,EAAE,CAAC;QACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,8CAA8C;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AApOD,4CAoOC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * SpeculativeExecutor — Dispatch the same task to multiple agents in parallel,
3
+ * then pick the best result via confidence scoring.
4
+ *
5
+ * Uses FanOutFanIn for parallel dispatch and ConfidenceFilter for quality-based
6
+ * winner selection. Optimistic concurrency: spend the extra budget up-front
7
+ * and discard inferior results.
8
+ *
9
+ * @module SpeculativeExecutor
10
+ */
11
+ /** A candidate agent for speculative execution */
12
+ export interface SpeculativeCandidate {
13
+ agentId: string;
14
+ /** Optional label for logging/tracing */
15
+ label?: string;
16
+ /** Per-candidate timeout override (ms) */
17
+ timeoutMs?: number;
18
+ }
19
+ /** Scored result from a speculative candidate */
20
+ export interface SpeculativeResult {
21
+ agentId: string;
22
+ label?: string;
23
+ success: boolean;
24
+ data: unknown;
25
+ confidence: number;
26
+ durationMs: number;
27
+ }
28
+ /** Final outcome of speculative execution */
29
+ export interface SpeculativeOutcome {
30
+ /** The winning result (highest confidence above threshold) */
31
+ winner: SpeculativeResult | null;
32
+ /** All candidate results, sorted by confidence descending */
33
+ candidates: SpeculativeResult[];
34
+ /** Whether a winner was selected */
35
+ hasWinner: boolean;
36
+ /** Total wall-clock time for the speculative run */
37
+ totalMs: number;
38
+ /** How many candidates succeeded */
39
+ successCount: number;
40
+ }
41
+ /** Configuration for speculative execution */
42
+ export interface SpeculativeOptions {
43
+ /** Minimum confidence to be considered a valid winner (0-100, default 50) */
44
+ minConfidence?: number;
45
+ /** Global timeout for all candidates (ms, default 30000) */
46
+ timeoutMs?: number;
47
+ /** Maximum concurrent candidates (default: all) */
48
+ concurrency?: number;
49
+ }
50
+ /** Executor function: (agentId, payload) → { success, data, confidence } */
51
+ export type SpeculativeExecutorFn = (agentId: string, payload: Record<string, unknown>) => Promise<{
52
+ success: boolean;
53
+ data: unknown;
54
+ confidence: number;
55
+ }>;
56
+ /**
57
+ * Dispatch one task to multiple agents, pick the best result.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * const executor = new SpeculativeExecutor(async (agentId, payload) => {
62
+ * const result = await adapters.executeAgent(agentId, payload, ctx);
63
+ * return {
64
+ * success: result.success,
65
+ * data: result.data,
66
+ * confidence: result.data?.confidence ?? 70,
67
+ * };
68
+ * });
69
+ *
70
+ * const outcome = await executor.race(
71
+ * { instruction: 'Summarize this document', context: { doc: '...' } },
72
+ * [{ agentId: 'gpt4' }, { agentId: 'claude' }, { agentId: 'gemini' }],
73
+ * );
74
+ * if (outcome.hasWinner) {
75
+ * console.log(`Winner: ${outcome.winner!.agentId} (${outcome.winner!.confidence})`);
76
+ * }
77
+ * ```
78
+ */
79
+ export declare class SpeculativeExecutor {
80
+ private executeFn;
81
+ constructor(executeFn: SpeculativeExecutorFn);
82
+ /**
83
+ * Race the same payload across multiple candidate agents.
84
+ * Returns the highest-confidence successful result.
85
+ */
86
+ race(payload: Record<string, unknown>, candidates: SpeculativeCandidate[], options?: SpeculativeOptions): Promise<SpeculativeOutcome>;
87
+ private executeWithTimeout;
88
+ }
89
+ //# sourceMappingURL=speculative-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speculative-executor.d.ts","sourceRoot":"","sources":["../../lib/speculative-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,kDAAkD;AAClD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,6DAA6D;IAC7D,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,4EAA4E;AAC5E,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAMtE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,SAAS,CAAwB;gBAE7B,SAAS,EAAE,qBAAqB;IAI5C;;;OAGG;IACG,IAAI,CACR,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,UAAU,EAAE,oBAAoB,EAAE,EAClC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;YA0DhB,kBAAkB;CAmBjC"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /**
3
+ * SpeculativeExecutor — Dispatch the same task to multiple agents in parallel,
4
+ * then pick the best result via confidence scoring.
5
+ *
6
+ * Uses FanOutFanIn for parallel dispatch and ConfidenceFilter for quality-based
7
+ * winner selection. Optimistic concurrency: spend the extra budget up-front
8
+ * and discard inferior results.
9
+ *
10
+ * @module SpeculativeExecutor
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.SpeculativeExecutor = void 0;
14
+ // ============================================================================
15
+ // SPECULATIVE EXECUTOR
16
+ // ============================================================================
17
+ /**
18
+ * Dispatch one task to multiple agents, pick the best result.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const executor = new SpeculativeExecutor(async (agentId, payload) => {
23
+ * const result = await adapters.executeAgent(agentId, payload, ctx);
24
+ * return {
25
+ * success: result.success,
26
+ * data: result.data,
27
+ * confidence: result.data?.confidence ?? 70,
28
+ * };
29
+ * });
30
+ *
31
+ * const outcome = await executor.race(
32
+ * { instruction: 'Summarize this document', context: { doc: '...' } },
33
+ * [{ agentId: 'gpt4' }, { agentId: 'claude' }, { agentId: 'gemini' }],
34
+ * );
35
+ * if (outcome.hasWinner) {
36
+ * console.log(`Winner: ${outcome.winner!.agentId} (${outcome.winner!.confidence})`);
37
+ * }
38
+ * ```
39
+ */
40
+ class SpeculativeExecutor {
41
+ executeFn;
42
+ constructor(executeFn) {
43
+ this.executeFn = executeFn;
44
+ }
45
+ /**
46
+ * Race the same payload across multiple candidate agents.
47
+ * Returns the highest-confidence successful result.
48
+ */
49
+ async race(payload, candidates, options = {}) {
50
+ const minConfidence = options.minConfidence ?? 50;
51
+ const globalTimeout = options.timeoutMs ?? 30_000;
52
+ const concurrency = options.concurrency ?? candidates.length;
53
+ const startMs = Date.now();
54
+ // Build per-candidate promises with individual timeouts
55
+ const tasks = candidates.map(c => ({
56
+ candidate: c,
57
+ promise: this.executeWithTimeout(c.agentId, payload, c.timeoutMs ?? globalTimeout),
58
+ }));
59
+ // Execute with concurrency limit
60
+ const results = [];
61
+ for (let i = 0; i < tasks.length; i += concurrency) {
62
+ const batch = tasks.slice(i, i + concurrency);
63
+ const settled = await Promise.allSettled(batch.map(async (t) => {
64
+ const res = await t.promise;
65
+ return {
66
+ agentId: t.candidate.agentId,
67
+ label: t.candidate.label,
68
+ ...res,
69
+ };
70
+ }));
71
+ for (const s of settled) {
72
+ if (s.status === 'fulfilled') {
73
+ results.push(s.value);
74
+ }
75
+ // Rejections are silently dropped — speculative by design
76
+ }
77
+ }
78
+ // Sort by confidence descending
79
+ results.sort((a, b) => b.confidence - a.confidence);
80
+ // Pick winner: highest confidence that is successful and above threshold
81
+ const winner = results.find(r => r.success && r.confidence >= minConfidence) ?? null;
82
+ return {
83
+ winner,
84
+ candidates: results,
85
+ hasWinner: winner !== null,
86
+ totalMs: Date.now() - startMs,
87
+ successCount: results.filter(r => r.success).length,
88
+ };
89
+ }
90
+ // --------------------------------------------------------------------------
91
+ // INTERNAL
92
+ // --------------------------------------------------------------------------
93
+ async executeWithTimeout(agentId, payload, timeoutMs) {
94
+ const start = Date.now();
95
+ const resultPromise = this.executeFn(agentId, payload);
96
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`Speculative timeout for ${agentId}`)), timeoutMs));
97
+ try {
98
+ const result = await Promise.race([resultPromise, timeoutPromise]);
99
+ return { ...result, durationMs: Date.now() - start };
100
+ }
101
+ catch {
102
+ return { success: false, data: null, confidence: 0, durationMs: Date.now() - start };
103
+ }
104
+ }
105
+ }
106
+ exports.SpeculativeExecutor = SpeculativeExecutor;
107
+ //# sourceMappingURL=speculative-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speculative-executor.js","sourceRoot":"","sources":["../../lib/speculative-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Distributed Swarm Transport — HTTP/JSON-RPC transport layer
3
+ *
4
+ * Enables multi-node swarm orchestration over the network.
5
+ * Provides:
6
+ * - SwarmTransportServer — HTTP server that exposes SwarmOrchestrator methods
7
+ * - SwarmTransportClient — HTTP client that proxies calls to a remote server
8
+ * - Message envelope with auth, correlation IDs, and TTL
9
+ *
10
+ * Uses Node built-in `http` module — no external dependencies.
11
+ * Communication format: JSON-RPC 2.0 over HTTP POST.
12
+ *
13
+ * Usage (server):
14
+ * const server = new SwarmTransportServer(orchestrator, { port: 4000 });
15
+ * await server.start();
16
+ *
17
+ * Usage (client):
18
+ * const client = new SwarmTransportClient('http://node-2:4000');
19
+ * const result = await client.delegateTask(agentId, payload);
20
+ *
21
+ * @module SwarmTransport
22
+ * @version 1.0.0
23
+ */
24
+ import { EventEmitter } from 'events';
25
+ /** Transport message envelope */
26
+ export interface TransportEnvelope {
27
+ /** JSON-RPC version */
28
+ jsonrpc: '2.0';
29
+ /** Unique request ID */
30
+ id: string;
31
+ /** Remote method name */
32
+ method: string;
33
+ /** Method parameters */
34
+ params: Record<string, unknown>;
35
+ /** Metadata */
36
+ meta?: TransportMeta;
37
+ }
38
+ /** Metadata attached to transport messages */
39
+ export interface TransportMeta {
40
+ /** Correlation ID for request tracing */
41
+ correlationId: string;
42
+ /** Source node identifier */
43
+ sourceNode: string;
44
+ /** Timestamp of message creation */
45
+ timestamp: number;
46
+ /** Time-to-live in ms (0 = no expiry) */
47
+ ttlMs: number;
48
+ /** HMAC signature if auth is configured */
49
+ signature?: string;
50
+ }
51
+ /** Transport response */
52
+ export interface TransportResponse {
53
+ jsonrpc: '2.0';
54
+ id: string;
55
+ result?: unknown;
56
+ error?: {
57
+ code: number;
58
+ message: string;
59
+ data?: unknown;
60
+ };
61
+ }
62
+ /** Server configuration */
63
+ export interface TransportServerConfig {
64
+ /** Port to listen on (default: 4000) */
65
+ port?: number;
66
+ /** Hostname to bind (default: '127.0.0.1') */
67
+ hostname?: string;
68
+ /** Shared secret for HMAC authentication (optional) */
69
+ sharedSecret?: string;
70
+ /** Maximum request body size in bytes (default: 1MB) */
71
+ maxBodyBytes?: number;
72
+ /** Allowed source nodes (empty = allow all) */
73
+ allowedNodes?: string[];
74
+ /** Node identifier for this server */
75
+ nodeId?: string;
76
+ }
77
+ /** Client configuration */
78
+ export interface TransportClientConfig {
79
+ /** Remote server URL (e.g. 'http://node-2:4000') */
80
+ url: string;
81
+ /** Shared secret for HMAC authentication (must match server) */
82
+ sharedSecret?: string;
83
+ /** This node's identifier */
84
+ nodeId?: string;
85
+ /** Default request timeout in ms (default: 30000) */
86
+ timeoutMs?: number;
87
+ /** Default TTL for messages in ms (default: 60000) */
88
+ ttlMs?: number;
89
+ }
90
+ /**
91
+ * Handler function for swarm transport methods.
92
+ * Receives parsed params and returns a result.
93
+ */
94
+ export type TransportHandler = (params: Record<string, unknown>) => Promise<unknown>;
95
+ /**
96
+ * HTTP transport server for distributed swarm orchestration.
97
+ *
98
+ * Exposes registered methods over HTTP POST with JSON-RPC 2.0 protocol.
99
+ * Supports HMAC authentication, node allowlisting, TTL enforcement,
100
+ * and request size limits.
101
+ */
102
+ export declare class SwarmTransportServer extends EventEmitter {
103
+ private server;
104
+ private handlers;
105
+ private readonly config;
106
+ constructor(config?: TransportServerConfig);
107
+ /** Register a method handler */
108
+ register(method: string, handler: TransportHandler): void;
109
+ /** Register multiple handlers at once */
110
+ registerAll(handlers: Record<string, TransportHandler>): void;
111
+ /** Start the transport server */
112
+ start(): Promise<void>;
113
+ /** Stop the transport server */
114
+ stop(): Promise<void>;
115
+ /** Get the node ID */
116
+ get nodeId(): string;
117
+ /** Whether the server is running */
118
+ get isRunning(): boolean;
119
+ private handleRequest;
120
+ private readBody;
121
+ private sendResponse;
122
+ private computeHmac;
123
+ }
124
+ /**
125
+ * HTTP transport client for distributed swarm orchestration.
126
+ *
127
+ * Proxies method calls to a remote SwarmTransportServer over HTTP POST.
128
+ * Supports HMAC authentication, correlation IDs, and TTL.
129
+ */
130
+ export declare class SwarmTransportClient extends EventEmitter {
131
+ private readonly config;
132
+ constructor(config: TransportClientConfig);
133
+ /**
134
+ * Call a remote method.
135
+ * @returns The result from the remote handler.
136
+ * @throws If the remote returns an error or the request times out.
137
+ */
138
+ call(method: string, params?: Record<string, unknown>): Promise<unknown>;
139
+ /** Get the node ID */
140
+ get nodeId(): string;
141
+ /** Convenience: delegate a task to a remote orchestrator */
142
+ delegateTask(agentId: string, payload: Record<string, unknown>): Promise<unknown>;
143
+ /** Convenience: read from remote blackboard */
144
+ blackboardRead(key: string): Promise<unknown>;
145
+ /** Convenience: write to remote blackboard */
146
+ blackboardWrite(key: string, value: unknown, proposer?: string): Promise<unknown>;
147
+ /** Convenience: query remote budget status */
148
+ budgetStatus(): Promise<unknown>;
149
+ }
150
+ //# sourceMappingURL=swarm-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm-transport.d.ts","sourceRoot":"","sources":["../../lib/swarm-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAOtC,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,eAAe;IACf,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yBAAyB;AACzB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAED,2BAA2B;AAC3B,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,2BAA2B;AAC3B,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAMrF;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAE7C,MAAM,GAAE,qBAA0B;IAY9C,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAIzD,yCAAyC;IACzC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI;IAM7D,iCAAiC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B,gCAAgC;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,sBAAsB;IACtB,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,oCAAoC;IACpC,IAAI,SAAS,IAAI,OAAO,CAEvB;YAMa,aAAa;IAgG3B,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,WAAW;CAIpB;AAMD;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAE7C,MAAM,EAAE,qBAAqB;IAWzC;;;;OAIG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqDlF,sBAAsB;IACtB,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,4DAA4D;IACtD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvF,+CAA+C;IACzC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAInD,8CAA8C;IACxC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvF,8CAA8C;IACxC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAGvC"}