network-ai 4.15.3 → 5.1.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.
- package/INTEGRATION_GUIDE.md +12 -5
- package/QUICKSTART.md +32 -5
- package/README.md +42 -17
- package/bin/dashboard.ts +146 -0
- package/bin/mcp-server.ts +3 -2
- package/dist/adapters/adapter-registry.d.ts +33 -1
- package/dist/adapters/adapter-registry.d.ts.map +1 -1
- package/dist/adapters/adapter-registry.js +49 -0
- package/dist/adapters/adapter-registry.js.map +1 -1
- package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
- package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
- package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
- package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
- package/dist/adapters/browser-agent-adapter.d.ts +121 -0
- package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
- package/dist/adapters/browser-agent-adapter.js +219 -0
- package/dist/adapters/browser-agent-adapter.js.map +1 -0
- package/dist/adapters/copilot-adapter.d.ts +59 -0
- package/dist/adapters/copilot-adapter.d.ts.map +1 -0
- package/dist/adapters/copilot-adapter.js +132 -0
- package/dist/adapters/copilot-adapter.js.map +1 -0
- package/dist/adapters/custom-adapter.d.ts +1 -1
- package/dist/adapters/custom-adapter.js +1 -1
- package/dist/adapters/index.d.ts +17 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +25 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/langchain-adapter.js +1 -1
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/langgraph-adapter.d.ts +70 -0
- package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
- package/dist/adapters/langgraph-adapter.js +119 -0
- package/dist/adapters/langgraph-adapter.js.map +1 -0
- package/dist/adapters/mcp-adapter.d.ts +1 -1
- package/dist/adapters/mcp-adapter.js +3 -3
- package/dist/adapters/mcp-adapter.js.map +1 -1
- package/dist/adapters/openai-agents-adapter.d.ts +100 -0
- package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
- package/dist/adapters/openai-agents-adapter.js +118 -0
- package/dist/adapters/openai-agents-adapter.js.map +1 -0
- package/dist/adapters/openclaw-adapter.d.ts +1 -1
- package/dist/adapters/openclaw-adapter.js +3 -3
- package/dist/adapters/openclaw-adapter.js.map +1 -1
- package/dist/adapters/orchestrator-adapter.d.ts +118 -0
- package/dist/adapters/orchestrator-adapter.d.ts.map +1 -0
- package/dist/adapters/orchestrator-adapter.js +219 -0
- package/dist/adapters/orchestrator-adapter.js.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.js +163 -0
- package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
- package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
- package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/vertex-ai-adapter.js +166 -0
- package/dist/adapters/vertex-ai-adapter.js.map +1 -0
- package/dist/bin/dashboard.d.ts +11 -0
- package/dist/bin/dashboard.d.ts.map +1 -0
- package/dist/bin/dashboard.js +135 -0
- package/dist/bin/dashboard.js.map +1 -0
- package/dist/bin/mcp-server.js +3 -2
- package/dist/bin/mcp-server.js.map +1 -1
- package/dist/demo-control-plane.d.ts +12 -0
- package/dist/demo-control-plane.d.ts.map +1 -0
- package/dist/demo-control-plane.js +147 -0
- package/dist/demo-control-plane.js.map +1 -0
- package/dist/demo-worktree-dashboard.d.ts +2 -0
- package/dist/demo-worktree-dashboard.d.ts.map +1 -0
- package/dist/demo-worktree-dashboard.js +131 -0
- package/dist/demo-worktree-dashboard.js.map +1 -0
- package/dist/examples/01-hello-swarm.d.ts +13 -0
- package/dist/examples/01-hello-swarm.d.ts.map +1 -0
- package/dist/examples/01-hello-swarm.js +165 -0
- package/dist/examples/01-hello-swarm.js.map +1 -0
- package/dist/examples/02-fsm-pipeline.d.ts +20 -0
- package/dist/examples/02-fsm-pipeline.d.ts.map +1 -0
- package/dist/examples/02-fsm-pipeline.js +189 -0
- package/dist/examples/02-fsm-pipeline.js.map +1 -0
- package/dist/examples/03-parallel-agents.d.ts +21 -0
- package/dist/examples/03-parallel-agents.d.ts.map +1 -0
- package/dist/examples/03-parallel-agents.js +192 -0
- package/dist/examples/03-parallel-agents.js.map +1 -0
- package/dist/examples/05-code-review-swarm.d.ts +21 -0
- package/dist/examples/05-code-review-swarm.d.ts.map +1 -0
- package/dist/examples/05-code-review-swarm.js +1177 -0
- package/dist/examples/05-code-review-swarm.js.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts +24 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.js +263 -0
- package/dist/examples/06-ai-pipeline-demo.js.map +1 -0
- package/dist/examples/07-full-showcase.d.ts +27 -0
- package/dist/examples/07-full-showcase.d.ts.map +1 -0
- package/dist/examples/07-full-showcase.js +946 -0
- package/dist/examples/07-full-showcase.js.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts +19 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.js +186 -0
- package/dist/examples/08-control-plane-stress-demo.js.map +1 -0
- package/dist/examples/09-real-langchain.d.ts +19 -0
- package/dist/examples/09-real-langchain.d.ts.map +1 -0
- package/dist/examples/09-real-langchain.js +231 -0
- package/dist/examples/09-real-langchain.js.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts +16 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js +270 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
- package/dist/examples/demo-runner.d.ts +2 -0
- package/dist/examples/demo-runner.d.ts.map +1 -0
- package/dist/examples/demo-runner.js +119 -0
- package/dist/examples/demo-runner.js.map +1 -0
- package/dist/index.d.ts +113 -559
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +310 -1074
- package/dist/index.js.map +1 -1
- package/dist/lib/adapter-test-harness.d.ts +88 -0
- package/dist/lib/adapter-test-harness.d.ts.map +1 -0
- package/dist/lib/adapter-test-harness.js +118 -0
- package/dist/lib/adapter-test-harness.js.map +1 -0
- package/dist/lib/agent-conversation.d.ts +115 -0
- package/dist/lib/agent-conversation.d.ts.map +1 -0
- package/dist/lib/agent-conversation.js +155 -0
- package/dist/lib/agent-conversation.js.map +1 -0
- package/dist/lib/agent-debate.d.ts +115 -0
- package/dist/lib/agent-debate.d.ts.map +1 -0
- package/dist/lib/agent-debate.js +146 -0
- package/dist/lib/agent-debate.js.map +1 -0
- package/dist/lib/agent-memory.d.ts +157 -0
- package/dist/lib/agent-memory.d.ts.map +1 -0
- package/dist/lib/agent-memory.js +336 -0
- package/dist/lib/agent-memory.js.map +1 -0
- package/dist/lib/agent-vcr.d.ts +133 -0
- package/dist/lib/agent-vcr.d.ts.map +1 -0
- package/dist/lib/agent-vcr.js +218 -0
- package/dist/lib/agent-vcr.js.map +1 -0
- package/dist/lib/anomaly-detector.d.ts +112 -0
- package/dist/lib/anomaly-detector.d.ts.map +1 -0
- package/dist/lib/anomaly-detector.js +178 -0
- package/dist/lib/anomaly-detector.js.map +1 -0
- package/dist/lib/approval-inbox.d.ts +147 -0
- package/dist/lib/approval-inbox.d.ts.map +1 -0
- package/dist/lib/approval-inbox.js +385 -0
- package/dist/lib/approval-inbox.js.map +1 -0
- package/dist/lib/auth-guardian.d.ts +170 -0
- package/dist/lib/auth-guardian.d.ts.map +1 -0
- package/dist/lib/auth-guardian.js +604 -0
- package/dist/lib/auth-guardian.js.map +1 -0
- package/dist/lib/auth-validator.d.ts +70 -0
- package/dist/lib/auth-validator.d.ts.map +1 -0
- package/dist/lib/auth-validator.js +32 -0
- package/dist/lib/auth-validator.js.map +1 -0
- package/dist/lib/blackboard-validator.d.ts +56 -0
- package/dist/lib/blackboard-validator.d.ts.map +1 -1
- package/dist/lib/blackboard-validator.js +181 -4
- package/dist/lib/blackboard-validator.js.map +1 -1
- package/dist/lib/comparison-runner.d.ts +99 -0
- package/dist/lib/comparison-runner.d.ts.map +1 -0
- package/dist/lib/comparison-runner.js +138 -0
- package/dist/lib/comparison-runner.js.map +1 -0
- package/dist/lib/config-watcher.d.ts +109 -0
- package/dist/lib/config-watcher.d.ts.map +1 -0
- package/dist/lib/config-watcher.js +215 -0
- package/dist/lib/config-watcher.js.map +1 -0
- package/dist/lib/control-plane.d.ts +128 -0
- package/dist/lib/control-plane.d.ts.map +1 -0
- package/dist/lib/control-plane.js +527 -0
- package/dist/lib/control-plane.js.map +1 -0
- package/dist/lib/cost-governor.d.ts +105 -0
- package/dist/lib/cost-governor.d.ts.map +1 -0
- package/dist/lib/cost-governor.js +128 -0
- package/dist/lib/cost-governor.js.map +1 -0
- package/dist/lib/cost-heatmap.d.ts +104 -0
- package/dist/lib/cost-heatmap.d.ts.map +1 -0
- package/dist/lib/cost-heatmap.js +161 -0
- package/dist/lib/cost-heatmap.js.map +1 -0
- package/dist/lib/coverage-reporter.d.ts +92 -0
- package/dist/lib/coverage-reporter.d.ts.map +1 -0
- package/dist/lib/coverage-reporter.js +177 -0
- package/dist/lib/coverage-reporter.js.map +1 -0
- package/dist/lib/dashboard-server.d.ts +71 -0
- package/dist/lib/dashboard-server.d.ts.map +1 -0
- package/dist/lib/dashboard-server.js +403 -0
- package/dist/lib/dashboard-server.js.map +1 -0
- package/dist/lib/dry-run.d.ts +73 -0
- package/dist/lib/dry-run.d.ts.map +1 -0
- package/dist/lib/dry-run.js +130 -0
- package/dist/lib/dry-run.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +38 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/event-bus.d.ts +167 -0
- package/dist/lib/event-bus.d.ts.map +1 -0
- package/dist/lib/event-bus.js +229 -0
- package/dist/lib/event-bus.js.map +1 -0
- package/dist/lib/explainability.d.ts +85 -0
- package/dist/lib/explainability.d.ts.map +1 -0
- package/dist/lib/explainability.js +102 -0
- package/dist/lib/explainability.js.map +1 -0
- package/dist/lib/goal-dsl.d.ts +157 -0
- package/dist/lib/goal-dsl.d.ts.map +1 -0
- package/dist/lib/goal-dsl.js +391 -0
- package/dist/lib/goal-dsl.js.map +1 -0
- package/dist/lib/job-queue.d.ts +183 -0
- package/dist/lib/job-queue.d.ts.map +1 -0
- package/dist/lib/job-queue.js +310 -0
- package/dist/lib/job-queue.js.map +1 -0
- package/dist/lib/learning-loop.d.ts +113 -0
- package/dist/lib/learning-loop.d.ts.map +1 -0
- package/dist/lib/learning-loop.js +181 -0
- package/dist/lib/learning-loop.js.map +1 -0
- package/dist/lib/lifecycle-hooks.d.ts +116 -0
- package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
- package/dist/lib/lifecycle-hooks.js +148 -0
- package/dist/lib/lifecycle-hooks.js.map +1 -0
- package/dist/lib/locked-blackboard.d.ts.map +1 -1
- package/dist/lib/locked-blackboard.js +9 -5
- package/dist/lib/locked-blackboard.js.map +1 -1
- package/dist/lib/mcp-tool-consumer.d.ts +153 -0
- package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
- package/dist/lib/mcp-tool-consumer.js +320 -0
- package/dist/lib/mcp-tool-consumer.js.map +1 -0
- package/dist/lib/metrics.d.ts +119 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +284 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/orchestrator-types.d.ts +309 -0
- package/dist/lib/orchestrator-types.d.ts.map +1 -0
- package/dist/lib/orchestrator-types.js +61 -0
- package/dist/lib/orchestrator-types.js.map +1 -0
- package/dist/lib/otel-bridge.d.ts +74 -0
- package/dist/lib/otel-bridge.d.ts.map +1 -0
- package/dist/lib/otel-bridge.js +167 -0
- package/dist/lib/otel-bridge.js.map +1 -0
- package/dist/lib/playground.d.ts +76 -0
- package/dist/lib/playground.d.ts.map +1 -0
- package/dist/lib/playground.js +224 -0
- package/dist/lib/playground.js.map +1 -0
- package/dist/lib/quadtree.d.ts +114 -0
- package/dist/lib/quadtree.d.ts.map +1 -0
- package/dist/lib/quadtree.js +259 -0
- package/dist/lib/quadtree.js.map +1 -0
- package/dist/lib/shared-blackboard.d.ts +101 -0
- package/dist/lib/shared-blackboard.d.ts.map +1 -0
- package/dist/lib/shared-blackboard.js +249 -0
- package/dist/lib/shared-blackboard.js.map +1 -0
- package/dist/lib/speculative-executor.d.ts +89 -0
- package/dist/lib/speculative-executor.d.ts.map +1 -0
- package/dist/lib/speculative-executor.js +107 -0
- package/dist/lib/speculative-executor.js.map +1 -0
- package/dist/lib/swarm-transport.d.ts +150 -0
- package/dist/lib/swarm-transport.d.ts.map +1 -0
- package/dist/lib/swarm-transport.js +307 -0
- package/dist/lib/swarm-transport.js.map +1 -0
- package/dist/lib/task-decomposer.d.ts +41 -0
- package/dist/lib/task-decomposer.d.ts.map +1 -0
- package/dist/lib/task-decomposer.js +272 -0
- package/dist/lib/task-decomposer.js.map +1 -0
- package/dist/lib/timeline-scrubber.d.ts +84 -0
- package/dist/lib/timeline-scrubber.d.ts.map +1 -0
- package/dist/lib/timeline-scrubber.js +173 -0
- package/dist/lib/timeline-scrubber.js.map +1 -0
- package/dist/lib/topology.d.ts +361 -0
- package/dist/lib/topology.d.ts.map +1 -0
- package/dist/lib/topology.js +591 -0
- package/dist/lib/topology.js.map +1 -0
- package/dist/lib/work-tree-dashboard.d.ts +130 -0
- package/dist/lib/work-tree-dashboard.d.ts.map +1 -0
- package/dist/lib/work-tree-dashboard.js +583 -0
- package/dist/lib/work-tree-dashboard.js.map +1 -0
- package/dist/lib/work-tree-ui.d.ts +107 -0
- package/dist/lib/work-tree-ui.d.ts.map +1 -0
- package/dist/lib/work-tree-ui.js +333 -0
- package/dist/lib/work-tree-ui.js.map +1 -0
- package/dist/lib/work-tree.d.ts +184 -0
- package/dist/lib/work-tree.d.ts.map +1 -0
- package/dist/lib/work-tree.js +480 -0
- package/dist/lib/work-tree.js.map +1 -0
- package/dist/security.d.ts +95 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +267 -4
- package/dist/security.js.map +1 -1
- package/package.json +8 -6
- package/types/agent-adapter.d.ts +5 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Distributed Swarm Transport — HTTP/JSON-RPC transport layer
|
|
4
|
+
*
|
|
5
|
+
* Enables multi-node swarm orchestration over the network.
|
|
6
|
+
* Provides:
|
|
7
|
+
* - SwarmTransportServer — HTTP server that exposes SwarmOrchestrator methods
|
|
8
|
+
* - SwarmTransportClient — HTTP client that proxies calls to a remote server
|
|
9
|
+
* - Message envelope with auth, correlation IDs, and TTL
|
|
10
|
+
*
|
|
11
|
+
* Uses Node built-in `http` module — no external dependencies.
|
|
12
|
+
* Communication format: JSON-RPC 2.0 over HTTP POST.
|
|
13
|
+
*
|
|
14
|
+
* Usage (server):
|
|
15
|
+
* const server = new SwarmTransportServer(orchestrator, { port: 4000 });
|
|
16
|
+
* await server.start();
|
|
17
|
+
*
|
|
18
|
+
* Usage (client):
|
|
19
|
+
* const client = new SwarmTransportClient('http://node-2:4000');
|
|
20
|
+
* const result = await client.delegateTask(agentId, payload);
|
|
21
|
+
*
|
|
22
|
+
* @module SwarmTransport
|
|
23
|
+
* @version 1.0.0
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.SwarmTransportClient = exports.SwarmTransportServer = void 0;
|
|
27
|
+
const http_1 = require("http");
|
|
28
|
+
const events_1 = require("events");
|
|
29
|
+
const crypto_1 = require("crypto");
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// SERVER
|
|
32
|
+
// ============================================================================
|
|
33
|
+
/**
|
|
34
|
+
* HTTP transport server for distributed swarm orchestration.
|
|
35
|
+
*
|
|
36
|
+
* Exposes registered methods over HTTP POST with JSON-RPC 2.0 protocol.
|
|
37
|
+
* Supports HMAC authentication, node allowlisting, TTL enforcement,
|
|
38
|
+
* and request size limits.
|
|
39
|
+
*/
|
|
40
|
+
class SwarmTransportServer extends events_1.EventEmitter {
|
|
41
|
+
server = null;
|
|
42
|
+
handlers = new Map();
|
|
43
|
+
config;
|
|
44
|
+
constructor(config = {}) {
|
|
45
|
+
super();
|
|
46
|
+
this.config = {
|
|
47
|
+
port: config.port ?? 4000,
|
|
48
|
+
hostname: config.hostname ?? '127.0.0.1',
|
|
49
|
+
sharedSecret: config.sharedSecret ?? '',
|
|
50
|
+
maxBodyBytes: config.maxBodyBytes ?? 1_048_576,
|
|
51
|
+
allowedNodes: config.allowedNodes ?? [],
|
|
52
|
+
nodeId: config.nodeId ?? `node-${(0, crypto_1.randomBytes)(4).toString('hex')}`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Register a method handler */
|
|
56
|
+
register(method, handler) {
|
|
57
|
+
this.handlers.set(method, handler);
|
|
58
|
+
}
|
|
59
|
+
/** Register multiple handlers at once */
|
|
60
|
+
registerAll(handlers) {
|
|
61
|
+
for (const [method, handler] of Object.entries(handlers)) {
|
|
62
|
+
this.handlers.set(method, handler);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Start the transport server */
|
|
66
|
+
async start() {
|
|
67
|
+
if (this.server)
|
|
68
|
+
return;
|
|
69
|
+
this.server = (0, http_1.createServer)((req, res) => this.handleRequest(req, res));
|
|
70
|
+
await new Promise((resolve) => {
|
|
71
|
+
this.server.listen(this.config.port, this.config.hostname, () => {
|
|
72
|
+
this.emit('listening', { port: this.config.port, hostname: this.config.hostname });
|
|
73
|
+
resolve();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/** Stop the transport server */
|
|
78
|
+
async stop() {
|
|
79
|
+
if (!this.server)
|
|
80
|
+
return;
|
|
81
|
+
await new Promise((resolve, reject) => {
|
|
82
|
+
this.server.close((err) => (err ? reject(err) : resolve()));
|
|
83
|
+
});
|
|
84
|
+
this.server = null;
|
|
85
|
+
this.emit('stopped');
|
|
86
|
+
}
|
|
87
|
+
/** Get the node ID */
|
|
88
|
+
get nodeId() {
|
|
89
|
+
return this.config.nodeId;
|
|
90
|
+
}
|
|
91
|
+
/** Whether the server is running */
|
|
92
|
+
get isRunning() {
|
|
93
|
+
return this.server !== null && this.server.listening;
|
|
94
|
+
}
|
|
95
|
+
// -----------------------------------------------------------------------
|
|
96
|
+
// Internal
|
|
97
|
+
// -----------------------------------------------------------------------
|
|
98
|
+
async handleRequest(req, res) {
|
|
99
|
+
res.setHeader('Content-Type', 'application/json');
|
|
100
|
+
// Only POST allowed
|
|
101
|
+
if (req.method !== 'POST') {
|
|
102
|
+
this.sendResponse(res, {
|
|
103
|
+
jsonrpc: '2.0', id: '', error: { code: -32600, message: 'Only POST allowed' },
|
|
104
|
+
});
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Health endpoint
|
|
108
|
+
if (req.url === '/health') {
|
|
109
|
+
this.sendResponse(res, {
|
|
110
|
+
jsonrpc: '2.0', id: 'health',
|
|
111
|
+
result: { nodeId: this.config.nodeId, methods: Array.from(this.handlers.keys()), uptime: process.uptime() },
|
|
112
|
+
});
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const body = await this.readBody(req);
|
|
117
|
+
const envelope = JSON.parse(body);
|
|
118
|
+
// Validate envelope
|
|
119
|
+
if (envelope.jsonrpc !== '2.0' || !envelope.method || !envelope.id) {
|
|
120
|
+
this.sendResponse(res, {
|
|
121
|
+
jsonrpc: '2.0', id: envelope?.id ?? '',
|
|
122
|
+
error: { code: -32600, message: 'Invalid JSON-RPC 2.0 request' },
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Check node allowlist
|
|
127
|
+
if (this.config.allowedNodes.length > 0 && envelope.meta?.sourceNode) {
|
|
128
|
+
if (!this.config.allowedNodes.includes(envelope.meta.sourceNode)) {
|
|
129
|
+
this.sendResponse(res, {
|
|
130
|
+
jsonrpc: '2.0', id: envelope.id,
|
|
131
|
+
error: { code: -32001, message: 'Source node not allowed' },
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Verify HMAC
|
|
137
|
+
if (this.config.sharedSecret && envelope.meta?.signature) {
|
|
138
|
+
const expected = this.computeHmac(envelope.method, envelope.params, envelope.meta.timestamp);
|
|
139
|
+
if (envelope.meta.signature !== expected) {
|
|
140
|
+
this.sendResponse(res, {
|
|
141
|
+
jsonrpc: '2.0', id: envelope.id,
|
|
142
|
+
error: { code: -32002, message: 'Invalid signature' },
|
|
143
|
+
});
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else if (this.config.sharedSecret && !envelope.meta?.signature) {
|
|
148
|
+
this.sendResponse(res, {
|
|
149
|
+
jsonrpc: '2.0', id: envelope.id,
|
|
150
|
+
error: { code: -32003, message: 'Signature required' },
|
|
151
|
+
});
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Check TTL
|
|
155
|
+
if (envelope.meta?.ttlMs && envelope.meta.ttlMs > 0) {
|
|
156
|
+
const age = Date.now() - envelope.meta.timestamp;
|
|
157
|
+
if (age > envelope.meta.ttlMs) {
|
|
158
|
+
this.sendResponse(res, {
|
|
159
|
+
jsonrpc: '2.0', id: envelope.id,
|
|
160
|
+
error: { code: -32004, message: 'Message expired' },
|
|
161
|
+
});
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Find handler
|
|
166
|
+
const handler = this.handlers.get(envelope.method);
|
|
167
|
+
if (!handler) {
|
|
168
|
+
this.sendResponse(res, {
|
|
169
|
+
jsonrpc: '2.0', id: envelope.id,
|
|
170
|
+
error: { code: -32601, message: `Method not found: ${envelope.method}` },
|
|
171
|
+
});
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// Execute
|
|
175
|
+
this.emit('request', { method: envelope.method, id: envelope.id, source: envelope.meta?.sourceNode });
|
|
176
|
+
const result = await handler(envelope.params);
|
|
177
|
+
this.sendResponse(res, { jsonrpc: '2.0', id: envelope.id, result });
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
this.sendResponse(res, {
|
|
181
|
+
jsonrpc: '2.0', id: '',
|
|
182
|
+
error: { code: -32700, message: err instanceof Error ? err.message : 'Parse error' },
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
readBody(req) {
|
|
187
|
+
return new Promise((resolve, reject) => {
|
|
188
|
+
const chunks = [];
|
|
189
|
+
let size = 0;
|
|
190
|
+
req.on('data', (chunk) => {
|
|
191
|
+
size += chunk.length;
|
|
192
|
+
if (size > this.config.maxBodyBytes) {
|
|
193
|
+
req.destroy();
|
|
194
|
+
reject(new Error('Request body too large'));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
chunks.push(chunk);
|
|
198
|
+
});
|
|
199
|
+
req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
|
|
200
|
+
req.on('error', reject);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
sendResponse(res, response) {
|
|
204
|
+
const body = JSON.stringify(response);
|
|
205
|
+
res.writeHead(response.error ? 400 : 200, { 'Content-Length': Buffer.byteLength(body) });
|
|
206
|
+
res.end(body);
|
|
207
|
+
}
|
|
208
|
+
computeHmac(method, params, timestamp) {
|
|
209
|
+
const payload = `${method}:${JSON.stringify(params)}:${timestamp}`;
|
|
210
|
+
return (0, crypto_1.createHmac)('sha256', this.config.sharedSecret).update(payload).digest('hex');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.SwarmTransportServer = SwarmTransportServer;
|
|
214
|
+
// ============================================================================
|
|
215
|
+
// CLIENT
|
|
216
|
+
// ============================================================================
|
|
217
|
+
/**
|
|
218
|
+
* HTTP transport client for distributed swarm orchestration.
|
|
219
|
+
*
|
|
220
|
+
* Proxies method calls to a remote SwarmTransportServer over HTTP POST.
|
|
221
|
+
* Supports HMAC authentication, correlation IDs, and TTL.
|
|
222
|
+
*/
|
|
223
|
+
class SwarmTransportClient extends events_1.EventEmitter {
|
|
224
|
+
config;
|
|
225
|
+
constructor(config) {
|
|
226
|
+
super();
|
|
227
|
+
this.config = {
|
|
228
|
+
url: config.url.replace(/\/$/, ''),
|
|
229
|
+
sharedSecret: config.sharedSecret ?? '',
|
|
230
|
+
nodeId: config.nodeId ?? `client-${(0, crypto_1.randomBytes)(4).toString('hex')}`,
|
|
231
|
+
timeoutMs: config.timeoutMs ?? 30_000,
|
|
232
|
+
ttlMs: config.ttlMs ?? 60_000,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Call a remote method.
|
|
237
|
+
* @returns The result from the remote handler.
|
|
238
|
+
* @throws If the remote returns an error or the request times out.
|
|
239
|
+
*/
|
|
240
|
+
async call(method, params = {}) {
|
|
241
|
+
const id = (0, crypto_1.randomBytes)(8).toString('hex');
|
|
242
|
+
const correlationId = (0, crypto_1.randomBytes)(8).toString('hex');
|
|
243
|
+
const timestamp = Date.now();
|
|
244
|
+
const meta = {
|
|
245
|
+
correlationId,
|
|
246
|
+
sourceNode: this.config.nodeId,
|
|
247
|
+
timestamp,
|
|
248
|
+
ttlMs: this.config.ttlMs,
|
|
249
|
+
};
|
|
250
|
+
// Sign if shared secret is configured
|
|
251
|
+
if (this.config.sharedSecret) {
|
|
252
|
+
const payload = `${method}:${JSON.stringify(params)}:${timestamp}`;
|
|
253
|
+
meta.signature = (0, crypto_1.createHmac)('sha256', this.config.sharedSecret).update(payload).digest('hex');
|
|
254
|
+
}
|
|
255
|
+
const envelope = {
|
|
256
|
+
jsonrpc: '2.0',
|
|
257
|
+
id,
|
|
258
|
+
method,
|
|
259
|
+
params,
|
|
260
|
+
meta,
|
|
261
|
+
};
|
|
262
|
+
const body = JSON.stringify(envelope);
|
|
263
|
+
const controller = new AbortController();
|
|
264
|
+
const timer = setTimeout(() => controller.abort(), this.config.timeoutMs);
|
|
265
|
+
try {
|
|
266
|
+
const response = await fetch(this.config.url, {
|
|
267
|
+
method: 'POST',
|
|
268
|
+
headers: { 'Content-Type': 'application/json', 'Content-Length': String(Buffer.byteLength(body)) },
|
|
269
|
+
body,
|
|
270
|
+
signal: controller.signal,
|
|
271
|
+
});
|
|
272
|
+
const data = await response.json();
|
|
273
|
+
if (data.error) {
|
|
274
|
+
const err = new Error(data.error.message);
|
|
275
|
+
err['code'] = data.error.code;
|
|
276
|
+
throw err;
|
|
277
|
+
}
|
|
278
|
+
this.emit('response', { method, id, correlationId, durationMs: Date.now() - timestamp });
|
|
279
|
+
return data.result;
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
clearTimeout(timer);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/** Get the node ID */
|
|
286
|
+
get nodeId() {
|
|
287
|
+
return this.config.nodeId;
|
|
288
|
+
}
|
|
289
|
+
/** Convenience: delegate a task to a remote orchestrator */
|
|
290
|
+
async delegateTask(agentId, payload) {
|
|
291
|
+
return this.call('delegateTask', { agentId, payload });
|
|
292
|
+
}
|
|
293
|
+
/** Convenience: read from remote blackboard */
|
|
294
|
+
async blackboardRead(key) {
|
|
295
|
+
return this.call('blackboard_read', { key });
|
|
296
|
+
}
|
|
297
|
+
/** Convenience: write to remote blackboard */
|
|
298
|
+
async blackboardWrite(key, value, proposer) {
|
|
299
|
+
return this.call('blackboard_write', { key, value, proposer });
|
|
300
|
+
}
|
|
301
|
+
/** Convenience: query remote budget status */
|
|
302
|
+
async budgetStatus() {
|
|
303
|
+
return this.call('budget_status', {});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
exports.SwarmTransportClient = SwarmTransportClient;
|
|
307
|
+
//# sourceMappingURL=swarm-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm-transport.js","sourceRoot":"","sources":["../../lib/swarm-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task decomposition engine for parallel multi-agent execution.
|
|
3
|
+
*
|
|
4
|
+
* Breaks complex tasks into parallel sub-agent calls, routes them through
|
|
5
|
+
* the adapter registry, caches results on the blackboard, and synthesizes
|
|
6
|
+
* outputs using configurable strategies (merge, vote, chain, first-success).
|
|
7
|
+
*
|
|
8
|
+
* @module TaskDecomposer
|
|
9
|
+
*/
|
|
10
|
+
import { AdapterRegistry } from '../adapters/adapter-registry';
|
|
11
|
+
import { SharedBlackboard } from './shared-blackboard';
|
|
12
|
+
import { AuthGuardian } from './auth-guardian';
|
|
13
|
+
import type { SkillContext, ParallelTask, ParallelExecutionResult, SynthesisStrategy } from './orchestrator-types';
|
|
14
|
+
export declare class TaskDecomposer {
|
|
15
|
+
private blackboard;
|
|
16
|
+
private authGuardian;
|
|
17
|
+
private adapterRegistry;
|
|
18
|
+
/** Maximum number of tasks to run concurrently (0 = unlimited). */
|
|
19
|
+
private maxConcurrency;
|
|
20
|
+
constructor(blackboard: SharedBlackboard, authGuardian: AuthGuardian, adapterRegistry: AdapterRegistry, options?: {
|
|
21
|
+
maxConcurrency?: number;
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Decomposes a complex task into parallel sub-agent calls
|
|
25
|
+
* This is the "Wall Breaker" - transforms impossible monolithic tasks
|
|
26
|
+
* into manageable parallel executions
|
|
27
|
+
*/
|
|
28
|
+
executeParallel(tasks: ParallelTask[], synthesisStrategy: SynthesisStrategy | undefined, context: SkillContext): Promise<ParallelExecutionResult>;
|
|
29
|
+
private executeSingleTask;
|
|
30
|
+
private synthesize;
|
|
31
|
+
private generateMergeSummary;
|
|
32
|
+
private hashPayload;
|
|
33
|
+
/**
|
|
34
|
+
* Execute async functions with a bounded concurrency pool.
|
|
35
|
+
* @param items Items to process
|
|
36
|
+
* @param fn Async function to apply to each item
|
|
37
|
+
* @param limit Max concurrent executions (0 = unlimited)
|
|
38
|
+
*/
|
|
39
|
+
private runWithConcurrencyLimit;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=task-decomposer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-decomposer.d.ts","sourceRoot":"","sources":["../../lib/task-decomposer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,KAAK,EACV,YAAY,EAGZ,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAG9B,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAkB;IACzC,mEAAmE;IACnE,OAAO,CAAC,cAAc,CAAS;gBAG7B,UAAU,EAAE,gBAAgB,EAC5B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE;IAiBvC;;;;OAIG;IACG,eAAe,CACnB,KAAK,EAAE,YAAY,EAAE,EACrB,iBAAiB,EAAE,iBAAiB,YAAU,EAC9C,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,uBAAuB,CAAC;YA2ErB,iBAAiB;IAiF/B,OAAO,CAAC,UAAU;IA8DlB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,WAAW;IAYnB;;;;;OAKG;YACW,uBAAuB;CA0BtC"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Task decomposition engine for parallel multi-agent execution.
|
|
4
|
+
*
|
|
5
|
+
* Breaks complex tasks into parallel sub-agent calls, routes them through
|
|
6
|
+
* the adapter registry, caches results on the blackboard, and synthesizes
|
|
7
|
+
* outputs using configurable strategies (merge, vote, chain, first-success).
|
|
8
|
+
*
|
|
9
|
+
* @module TaskDecomposer
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TaskDecomposer = void 0;
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
14
|
+
const adapter_registry_1 = require("../adapters/adapter-registry");
|
|
15
|
+
const security_1 = require("../security");
|
|
16
|
+
const errors_1 = require("./errors");
|
|
17
|
+
const shared_blackboard_1 = require("./shared-blackboard");
|
|
18
|
+
const auth_guardian_1 = require("./auth-guardian");
|
|
19
|
+
const orchestrator_types_1 = require("./orchestrator-types");
|
|
20
|
+
class TaskDecomposer {
|
|
21
|
+
blackboard;
|
|
22
|
+
authGuardian;
|
|
23
|
+
adapterRegistry;
|
|
24
|
+
/** Maximum number of tasks to run concurrently (0 = unlimited). */
|
|
25
|
+
maxConcurrency;
|
|
26
|
+
constructor(blackboard, authGuardian, adapterRegistry, options) {
|
|
27
|
+
if (!blackboard || !(blackboard instanceof shared_blackboard_1.SharedBlackboard)) {
|
|
28
|
+
throw new errors_1.ValidationError('blackboard must be an instance of SharedBlackboard');
|
|
29
|
+
}
|
|
30
|
+
if (!authGuardian || !(authGuardian instanceof auth_guardian_1.AuthGuardian)) {
|
|
31
|
+
throw new errors_1.ValidationError('authGuardian must be an instance of AuthGuardian');
|
|
32
|
+
}
|
|
33
|
+
if (!adapterRegistry || !(adapterRegistry instanceof adapter_registry_1.AdapterRegistry)) {
|
|
34
|
+
throw new errors_1.ValidationError('adapterRegistry must be an instance of AdapterRegistry');
|
|
35
|
+
}
|
|
36
|
+
this.blackboard = blackboard;
|
|
37
|
+
this.authGuardian = authGuardian;
|
|
38
|
+
this.adapterRegistry = adapterRegistry;
|
|
39
|
+
this.maxConcurrency = options?.maxConcurrency ?? 5;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Decomposes a complex task into parallel sub-agent calls
|
|
43
|
+
* This is the "Wall Breaker" - transforms impossible monolithic tasks
|
|
44
|
+
* into manageable parallel executions
|
|
45
|
+
*/
|
|
46
|
+
async executeParallel(tasks, synthesisStrategy = 'merge', context) {
|
|
47
|
+
if (!tasks || !Array.isArray(tasks)) {
|
|
48
|
+
throw new errors_1.ValidationError('tasks must be an array');
|
|
49
|
+
}
|
|
50
|
+
if (tasks.length === 0) {
|
|
51
|
+
throw new errors_1.ValidationError('tasks array must not be empty');
|
|
52
|
+
}
|
|
53
|
+
if (!context || typeof context !== 'object' || !context.agentId) {
|
|
54
|
+
throw new errors_1.ValidationError('context is required and must include agentId');
|
|
55
|
+
}
|
|
56
|
+
// No hard parallel limit — caller controls concurrency via task count
|
|
57
|
+
const startTime = Date.now();
|
|
58
|
+
const individualResults = [];
|
|
59
|
+
// Check blackboard for cached results first
|
|
60
|
+
const cachedTasks = [];
|
|
61
|
+
const uncachedTasks = [];
|
|
62
|
+
for (const task of tasks) {
|
|
63
|
+
const cacheKey = `task:${task.agentType}:${this.hashPayload(task.taskPayload)}`;
|
|
64
|
+
const cached = this.blackboard.read(cacheKey);
|
|
65
|
+
if (cached) {
|
|
66
|
+
individualResults.push({
|
|
67
|
+
agentType: task.agentType,
|
|
68
|
+
success: true,
|
|
69
|
+
result: cached.value,
|
|
70
|
+
executionTime: 0, // From cache
|
|
71
|
+
});
|
|
72
|
+
cachedTasks.push(task);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
uncachedTasks.push(task);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Execute uncached tasks with concurrency cap
|
|
79
|
+
if (uncachedTasks.length > 0) {
|
|
80
|
+
const results = await this.runWithConcurrencyLimit(uncachedTasks, task => this.executeSingleTask(task, context), this.maxConcurrency);
|
|
81
|
+
for (let i = 0; i < results.length; i++) {
|
|
82
|
+
const task = uncachedTasks[i];
|
|
83
|
+
const result = results[i];
|
|
84
|
+
individualResults.push(result);
|
|
85
|
+
// Cache successful results
|
|
86
|
+
if (result.success) {
|
|
87
|
+
const cacheKey = `task:${task.agentType}:${this.hashPayload(task.taskPayload)}`;
|
|
88
|
+
this.blackboard.write(cacheKey, result.result, context.agentId, 3600, 'system-orchestrator-token'); // 1 hour TTL
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Synthesize results based on strategy
|
|
93
|
+
const synthesizedResult = this.synthesize(individualResults, synthesisStrategy);
|
|
94
|
+
const totalTime = Date.now() - startTime;
|
|
95
|
+
const successCount = individualResults.filter(r => r.success).length;
|
|
96
|
+
return {
|
|
97
|
+
synthesizedResult,
|
|
98
|
+
individualResults,
|
|
99
|
+
executionMetrics: {
|
|
100
|
+
totalTime,
|
|
101
|
+
successRate: successCount / individualResults.length,
|
|
102
|
+
synthesisStrategy,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async executeSingleTask(task, context) {
|
|
107
|
+
const taskStart = Date.now();
|
|
108
|
+
try {
|
|
109
|
+
// Build the handoff message
|
|
110
|
+
const handoff = {
|
|
111
|
+
handoffId: (0, crypto_1.randomUUID)(),
|
|
112
|
+
sourceAgent: context.agentId,
|
|
113
|
+
targetAgent: task.agentType,
|
|
114
|
+
taskType: 'delegate',
|
|
115
|
+
payload: task.taskPayload,
|
|
116
|
+
metadata: {
|
|
117
|
+
priority: 1,
|
|
118
|
+
deadline: Date.now() + orchestrator_types_1.CONFIG.defaultTimeout,
|
|
119
|
+
parentTaskId: context.taskId ?? null,
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
// Sanitize the instruction before sending to adapter
|
|
123
|
+
let sanitizedInstruction = task.taskPayload.instruction;
|
|
124
|
+
try {
|
|
125
|
+
sanitizedInstruction = security_1.InputSanitizer.sanitizeString(task.taskPayload.instruction, 10000);
|
|
126
|
+
}
|
|
127
|
+
catch { /* use original if sanitization fails */ }
|
|
128
|
+
// Use namespace-scoped snapshot -- target agent only sees keys it's allowed to see
|
|
129
|
+
const scopedSnapshot = this.blackboard.getScopedSnapshot(task.agentType);
|
|
130
|
+
// Route through the adapter registry (framework-agnostic)
|
|
131
|
+
const agentPayload = {
|
|
132
|
+
action: 'execute',
|
|
133
|
+
params: {},
|
|
134
|
+
handoff: {
|
|
135
|
+
handoffId: handoff.handoffId,
|
|
136
|
+
sourceAgent: handoff.sourceAgent,
|
|
137
|
+
targetAgent: handoff.targetAgent,
|
|
138
|
+
taskType: handoff.taskType,
|
|
139
|
+
instruction: sanitizedInstruction,
|
|
140
|
+
context: handoff.payload.context,
|
|
141
|
+
constraints: handoff.payload.constraints,
|
|
142
|
+
expectedOutput: handoff.payload.expectedOutput,
|
|
143
|
+
metadata: handoff.metadata,
|
|
144
|
+
},
|
|
145
|
+
blackboardSnapshot: scopedSnapshot,
|
|
146
|
+
};
|
|
147
|
+
const agentContext = {
|
|
148
|
+
agentId: context.agentId,
|
|
149
|
+
taskId: context.taskId,
|
|
150
|
+
sessionId: context.sessionId,
|
|
151
|
+
};
|
|
152
|
+
const result = await this.adapterRegistry.executeAgent(task.agentType, agentPayload, agentContext);
|
|
153
|
+
// Sanitize adapter output before returning/caching
|
|
154
|
+
let sanitizedData = result.data;
|
|
155
|
+
try {
|
|
156
|
+
sanitizedData = security_1.InputSanitizer.sanitizeObject(result.data);
|
|
157
|
+
}
|
|
158
|
+
catch { /* use raw if sanitization fails */ }
|
|
159
|
+
return {
|
|
160
|
+
agentType: task.agentType,
|
|
161
|
+
success: true,
|
|
162
|
+
result: sanitizedData,
|
|
163
|
+
executionTime: Date.now() - taskStart,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return {
|
|
168
|
+
agentType: task.agentType,
|
|
169
|
+
success: false,
|
|
170
|
+
result: {
|
|
171
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
172
|
+
recoverable: true,
|
|
173
|
+
},
|
|
174
|
+
executionTime: Date.now() - taskStart,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
synthesize(results, strategy) {
|
|
179
|
+
const successfulResults = results.filter(r => r.success);
|
|
180
|
+
if (successfulResults.length === 0) {
|
|
181
|
+
return {
|
|
182
|
+
error: 'All parallel tasks failed',
|
|
183
|
+
individualErrors: results.map(r => ({
|
|
184
|
+
agent: r.agentType,
|
|
185
|
+
error: r.result,
|
|
186
|
+
})),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
switch (strategy) {
|
|
190
|
+
case 'merge':
|
|
191
|
+
// Combine all results into a unified object
|
|
192
|
+
return {
|
|
193
|
+
merged: true,
|
|
194
|
+
contributions: successfulResults.map(r => ({
|
|
195
|
+
source: r.agentType,
|
|
196
|
+
data: r.result,
|
|
197
|
+
})),
|
|
198
|
+
summary: this.generateMergeSummary(successfulResults),
|
|
199
|
+
};
|
|
200
|
+
case 'vote':
|
|
201
|
+
// Return the result with highest "confidence" (simplified: most data)
|
|
202
|
+
const scored = successfulResults.map(r => ({
|
|
203
|
+
result: r,
|
|
204
|
+
score: JSON.stringify(r.result).length,
|
|
205
|
+
}));
|
|
206
|
+
scored.sort((a, b) => b.score - a.score);
|
|
207
|
+
return {
|
|
208
|
+
voted: true,
|
|
209
|
+
winner: scored[0].result.agentType,
|
|
210
|
+
result: scored[0].result.result,
|
|
211
|
+
};
|
|
212
|
+
case 'chain':
|
|
213
|
+
// Results should already be ordered; return the final one
|
|
214
|
+
return {
|
|
215
|
+
chained: true,
|
|
216
|
+
finalResult: successfulResults[successfulResults.length - 1].result,
|
|
217
|
+
chainLength: successfulResults.length,
|
|
218
|
+
};
|
|
219
|
+
case 'first-success':
|
|
220
|
+
// Return the first successful result
|
|
221
|
+
return {
|
|
222
|
+
firstSuccess: true,
|
|
223
|
+
source: successfulResults[0].agentType,
|
|
224
|
+
result: successfulResults[0].result,
|
|
225
|
+
};
|
|
226
|
+
default:
|
|
227
|
+
return successfulResults.map(r => r.result);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
generateMergeSummary(results) {
|
|
231
|
+
const agents = results.map(r => r.agentType).join(', ');
|
|
232
|
+
return `Synthesized from ${results.length} agents: ${agents}`;
|
|
233
|
+
}
|
|
234
|
+
hashPayload(payload) {
|
|
235
|
+
// Simple hash for cache key generation
|
|
236
|
+
const str = JSON.stringify(payload);
|
|
237
|
+
let hash = 0;
|
|
238
|
+
for (let i = 0; i < str.length; i++) {
|
|
239
|
+
const char = str.charCodeAt(i);
|
|
240
|
+
hash = ((hash << 5) - hash) + char;
|
|
241
|
+
hash = hash & hash;
|
|
242
|
+
}
|
|
243
|
+
return Math.abs(hash).toString(16);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Execute async functions with a bounded concurrency pool.
|
|
247
|
+
* @param items Items to process
|
|
248
|
+
* @param fn Async function to apply to each item
|
|
249
|
+
* @param limit Max concurrent executions (0 = unlimited)
|
|
250
|
+
*/
|
|
251
|
+
async runWithConcurrencyLimit(items, fn, limit) {
|
|
252
|
+
if (limit <= 0 || items.length <= limit) {
|
|
253
|
+
return Promise.all(items.map(fn));
|
|
254
|
+
}
|
|
255
|
+
const results = new Array(items.length);
|
|
256
|
+
let nextIndex = 0;
|
|
257
|
+
async function worker() {
|
|
258
|
+
while (nextIndex < items.length) {
|
|
259
|
+
const idx = nextIndex++;
|
|
260
|
+
results[idx] = await fn(items[idx]);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const workers = [];
|
|
264
|
+
for (let i = 0; i < Math.min(limit, items.length); i++) {
|
|
265
|
+
workers.push(worker());
|
|
266
|
+
}
|
|
267
|
+
await Promise.all(workers);
|
|
268
|
+
return results;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
exports.TaskDecomposer = TaskDecomposer;
|
|
272
|
+
//# sourceMappingURL=task-decomposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-decomposer.js","sourceRoot":"","sources":["../../lib/task-decomposer.ts"],"names":[],"mappings":"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"}
|