@defai.digital/agent-parallel 13.4.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.
@@ -0,0 +1,494 @@
1
+ /**
2
+ * Parallel Agent Orchestrator
3
+ *
4
+ * Main orchestration logic for executing multiple agents in parallel
5
+ * with DAG-based dependency management.
6
+ *
7
+ * Invariants:
8
+ * - INV-APE-001: Concurrent agents MUST NOT exceed maxConcurrentAgents
9
+ * - INV-APE-002: Dependencies honored (DAG ordering)
10
+ * - INV-APE-003: Shared context immutable during execution
11
+ * - INV-APE-004: Result aggregation follows configured strategy
12
+ * - INV-APE-005: Timeout enforced per-agent independently
13
+ */
14
+ import { createDefaultAgentParallelExecutionConfig, ParallelExecutionErrorCodes, } from '@defai.digital/contracts';
15
+ import { createDAGAnalyzer, DAGAnalysisError } from './dag-analyzer.js';
16
+ import { createContextManager } from './context-manager.js';
17
+ import { createResultAggregator } from './result-aggregator.js';
18
+ /**
19
+ * Error thrown during parallel execution
20
+ */
21
+ export class ParallelExecutionError extends Error {
22
+ code;
23
+ taskId;
24
+ constructor(code, message, taskId) {
25
+ super(message);
26
+ this.code = code;
27
+ this.taskId = taskId;
28
+ this.name = 'ParallelExecutionError';
29
+ }
30
+ }
31
+ /**
32
+ * Creates a parallel agent orchestrator
33
+ */
34
+ export function createAgentParallelOrchestrator(options) {
35
+ const { agentExecutor, defaultConfig, onProgress } = options;
36
+ const dagAnalyzer = createDAGAnalyzer();
37
+ const contextManager = createContextManager();
38
+ const resultAggregator = createResultAggregator();
39
+ const config = {
40
+ ...createDefaultAgentParallelExecutionConfig(),
41
+ ...defaultConfig,
42
+ };
43
+ // Track active executions for proper cancellation scoping
44
+ // Each execution has its own cancelled state to prevent cross-execution interference
45
+ const activeExecutions = new Map();
46
+ let currentGroupId = null;
47
+ /**
48
+ * Check if a specific execution is cancelled
49
+ */
50
+ function isCancelled(groupId) {
51
+ return activeExecutions.get(groupId)?.cancelled ?? false;
52
+ }
53
+ /**
54
+ * Mark an execution as cancelled
55
+ */
56
+ function setCancelled(groupId) {
57
+ const execution = activeExecutions.get(groupId);
58
+ if (execution) {
59
+ execution.cancelled = true;
60
+ }
61
+ }
62
+ /**
63
+ * Emit progress event
64
+ */
65
+ function emitProgress(event, groupId) {
66
+ const gId = groupId ?? currentGroupId;
67
+ if (onProgress && gId) {
68
+ onProgress({
69
+ ...event,
70
+ timestamp: new Date().toISOString(),
71
+ groupId: gId,
72
+ });
73
+ }
74
+ }
75
+ /**
76
+ * Execute a single task with timeout
77
+ * INV-APE-005: Timeout enforced independently
78
+ */
79
+ async function executeTask(task, sharedContext, taskConfig, layerIndex, groupId) {
80
+ const startTime = Date.now();
81
+ const startedAt = new Date().toISOString();
82
+ emitProgress({
83
+ type: 'task.started',
84
+ taskId: task.taskId,
85
+ agentId: task.agentId,
86
+ layerIndex,
87
+ }, groupId);
88
+ // Task-specific timeout or default
89
+ const timeout = task.timeout ?? taskConfig.agentTimeout;
90
+ try {
91
+ // Check cancellation (scoped to this execution)
92
+ if (isCancelled(groupId)) {
93
+ return {
94
+ taskId: task.taskId,
95
+ agentId: task.agentId,
96
+ status: 'cancelled',
97
+ success: false,
98
+ errorCode: ParallelExecutionErrorCodes.CANCELLED,
99
+ durationMs: Date.now() - startTime,
100
+ layer: layerIndex,
101
+ startedAt,
102
+ completedAt: new Date().toISOString(),
103
+ retryCount: 0,
104
+ };
105
+ }
106
+ // Check if agent exists
107
+ const exists = await agentExecutor.exists(task.agentId);
108
+ if (!exists) {
109
+ const errorMsg = `Agent "${task.agentId}" not found`;
110
+ const result = {
111
+ taskId: task.taskId,
112
+ agentId: task.agentId,
113
+ status: 'failed',
114
+ success: false,
115
+ error: errorMsg,
116
+ errorCode: ParallelExecutionErrorCodes.AGENT_NOT_FOUND,
117
+ durationMs: Date.now() - startTime,
118
+ layer: layerIndex,
119
+ startedAt,
120
+ completedAt: new Date().toISOString(),
121
+ retryCount: 0,
122
+ };
123
+ emitProgress({
124
+ type: 'task.failed',
125
+ taskId: task.taskId,
126
+ agentId: task.agentId,
127
+ layerIndex,
128
+ message: errorMsg,
129
+ });
130
+ return result;
131
+ }
132
+ // Build input with shared context
133
+ const input = taskConfig.shareContext && sharedContext
134
+ ? { ...sharedContext, __taskInput: task.input }
135
+ : task.input;
136
+ // Execute with timeout
137
+ // Build execution request, only include optional fields if defined
138
+ const execRequest = {
139
+ agentId: task.agentId,
140
+ input,
141
+ timeout,
142
+ };
143
+ if (task.provider)
144
+ execRequest.provider = task.provider;
145
+ if (task.model)
146
+ execRequest.model = task.model;
147
+ const executePromise = agentExecutor.execute(execRequest);
148
+ // Create timeout with cleanup to prevent memory leak
149
+ let timeoutId;
150
+ const timeoutPromise = new Promise((_, reject) => {
151
+ timeoutId = setTimeout(() => {
152
+ reject(new Error(`Task timeout after ${timeout}ms`));
153
+ }, timeout);
154
+ });
155
+ let execResult;
156
+ try {
157
+ execResult = await Promise.race([executePromise, timeoutPromise]);
158
+ }
159
+ finally {
160
+ // Clean up timeout to prevent memory leak
161
+ if (timeoutId !== undefined) {
162
+ clearTimeout(timeoutId);
163
+ }
164
+ }
165
+ const completedAt = new Date().toISOString();
166
+ const durationMs = Date.now() - startTime;
167
+ if (execResult.success) {
168
+ emitProgress({
169
+ type: 'task.completed',
170
+ taskId: task.taskId,
171
+ agentId: task.agentId,
172
+ layerIndex,
173
+ });
174
+ return {
175
+ taskId: task.taskId,
176
+ agentId: task.agentId,
177
+ status: 'completed',
178
+ success: true,
179
+ output: execResult.output,
180
+ durationMs,
181
+ layer: layerIndex,
182
+ startedAt,
183
+ completedAt,
184
+ retryCount: 0,
185
+ };
186
+ }
187
+ else {
188
+ emitProgress({
189
+ type: 'task.failed',
190
+ taskId: task.taskId,
191
+ agentId: task.agentId,
192
+ layerIndex,
193
+ message: execResult.error ?? 'Task execution failed',
194
+ });
195
+ return {
196
+ taskId: task.taskId,
197
+ agentId: task.agentId,
198
+ status: 'failed',
199
+ success: false,
200
+ error: execResult.error,
201
+ errorCode: execResult.errorCode ?? ParallelExecutionErrorCodes.TASK_FAILED,
202
+ durationMs,
203
+ layer: layerIndex,
204
+ startedAt,
205
+ completedAt,
206
+ retryCount: 0,
207
+ };
208
+ }
209
+ }
210
+ catch (error) {
211
+ const completedAt = new Date().toISOString();
212
+ const durationMs = Date.now() - startTime;
213
+ const isTimeout = error instanceof Error && error.message.includes('timeout');
214
+ emitProgress({
215
+ type: 'task.failed',
216
+ taskId: task.taskId,
217
+ agentId: task.agentId,
218
+ layerIndex,
219
+ message: error instanceof Error ? error.message : 'Unknown error',
220
+ });
221
+ return {
222
+ taskId: task.taskId,
223
+ agentId: task.agentId,
224
+ status: isTimeout ? 'timeout' : 'failed',
225
+ success: false,
226
+ error: error instanceof Error ? error.message : 'Unknown error',
227
+ errorCode: isTimeout
228
+ ? ParallelExecutionErrorCodes.TASK_TIMEOUT
229
+ : ParallelExecutionErrorCodes.TASK_FAILED,
230
+ durationMs,
231
+ layer: layerIndex,
232
+ startedAt,
233
+ completedAt,
234
+ retryCount: 0,
235
+ };
236
+ }
237
+ }
238
+ /**
239
+ * Execute a layer of tasks with concurrency limit
240
+ * INV-APE-001: Respects maxConcurrentAgents
241
+ */
242
+ async function executeLayer(layer, sharedContext, taskConfig, failedTaskIds, groupId) {
243
+ const results = [];
244
+ const pending = new Set();
245
+ emitProgress({
246
+ type: 'layer.started',
247
+ layerIndex: layer.index,
248
+ totalTasks: layer.tasks.length,
249
+ }, groupId);
250
+ // Filter out tasks whose dependencies failed
251
+ // INV-APE-201: Dependency cascading
252
+ const tasksToExecute = [];
253
+ const skippedTasks = [];
254
+ for (const task of layer.tasks) {
255
+ const dependencyFailed = task.dependencies.some((depId) => failedTaskIds.has(depId));
256
+ if (dependencyFailed) {
257
+ skippedTasks.push(task);
258
+ }
259
+ else {
260
+ tasksToExecute.push(task);
261
+ }
262
+ }
263
+ // Mark skipped tasks
264
+ for (const task of skippedTasks) {
265
+ const now = new Date().toISOString();
266
+ const result = {
267
+ taskId: task.taskId,
268
+ agentId: task.agentId,
269
+ status: 'skipped',
270
+ success: false,
271
+ error: 'Dependency failed',
272
+ errorCode: ParallelExecutionErrorCodes.DEPENDENCY_FAILED,
273
+ durationMs: 0,
274
+ layer: layer.index,
275
+ startedAt: now,
276
+ completedAt: now,
277
+ retryCount: 0,
278
+ };
279
+ results.push(result);
280
+ failedTaskIds.add(task.taskId);
281
+ emitProgress({
282
+ type: 'task.skipped',
283
+ taskId: task.taskId,
284
+ agentId: task.agentId,
285
+ layerIndex: layer.index,
286
+ message: 'Dependency failed',
287
+ }, groupId);
288
+ }
289
+ // Execute remaining tasks with concurrency control
290
+ let taskIndex = 0;
291
+ async function executeAndCollect(task) {
292
+ const result = await executeTask(task, sharedContext, taskConfig, layer.index, groupId);
293
+ results.push(result);
294
+ if (!result.success) {
295
+ failedTaskIds.add(task.taskId);
296
+ // Handle failFast strategy (scoped to this execution)
297
+ if (taskConfig.failureStrategy === 'failFast' && !isCancelled(groupId)) {
298
+ setCancelled(groupId);
299
+ }
300
+ }
301
+ }
302
+ // INV-APE-001: Concurrency limit enforcement
303
+ while (taskIndex < tasksToExecute.length || pending.size > 0) {
304
+ // Check cancellation (scoped to this execution)
305
+ if (isCancelled(groupId) && taskConfig.failureStrategy === 'failFast') {
306
+ // Mark remaining as cancelled
307
+ while (taskIndex < tasksToExecute.length) {
308
+ const task = tasksToExecute[taskIndex++];
309
+ const now = new Date().toISOString();
310
+ results.push({
311
+ taskId: task.taskId,
312
+ agentId: task.agentId,
313
+ status: 'cancelled',
314
+ success: false,
315
+ errorCode: ParallelExecutionErrorCodes.CANCELLED,
316
+ durationMs: 0,
317
+ layer: layer.index,
318
+ startedAt: now,
319
+ completedAt: now,
320
+ retryCount: 0,
321
+ });
322
+ }
323
+ break;
324
+ }
325
+ // Start new tasks up to concurrency limit
326
+ while (pending.size < taskConfig.maxConcurrentAgents &&
327
+ taskIndex < tasksToExecute.length) {
328
+ const task = tasksToExecute[taskIndex++];
329
+ const promise = executeAndCollect(task).finally(() => {
330
+ pending.delete(promise);
331
+ });
332
+ pending.add(promise);
333
+ }
334
+ // Wait for at least one to complete
335
+ if (pending.size > 0) {
336
+ await Promise.race(pending);
337
+ }
338
+ }
339
+ emitProgress({
340
+ type: 'layer.completed',
341
+ layerIndex: layer.index,
342
+ completedTasks: results.filter((r) => r.success).length,
343
+ failedTasks: results.filter((r) => !r.success).length,
344
+ }, groupId);
345
+ return results;
346
+ }
347
+ return {
348
+ getConfig() {
349
+ return { ...config };
350
+ },
351
+ buildExecutionPlan(tasks) {
352
+ const planId = crypto.randomUUID();
353
+ const analysis = dagAnalyzer.analyze(tasks);
354
+ const layers = analysis.layers.map((layer) => ({
355
+ index: layer.index,
356
+ tasks: layer.tasks,
357
+ taskCount: layer.tasks.length,
358
+ }));
359
+ return {
360
+ planId,
361
+ layers,
362
+ totalTasks: tasks.length,
363
+ totalLayers: analysis.totalLayers,
364
+ maxParallelism: analysis.maxParallelism,
365
+ hasCycles: analysis.hasCycles,
366
+ createdAt: new Date().toISOString(),
367
+ };
368
+ },
369
+ async executeParallel(tasks, configOverride, sharedContext) {
370
+ const groupId = crypto.randomUUID();
371
+ currentGroupId = groupId;
372
+ // Register this execution with its own cancellation state
373
+ activeExecutions.set(groupId, { cancelled: false });
374
+ const startTime = Date.now();
375
+ const startedAt = new Date().toISOString();
376
+ // Merge config
377
+ const taskConfig = {
378
+ ...config,
379
+ ...configOverride,
380
+ };
381
+ // Setup context if provided
382
+ // INV-APE-003: Context frozen before execution
383
+ // INV-APE-300: Context snapshot timing
384
+ if (sharedContext && taskConfig.shareContext) {
385
+ contextManager.create(sharedContext);
386
+ }
387
+ emitProgress({
388
+ type: 'execution.started',
389
+ totalTasks: tasks.length,
390
+ }, groupId);
391
+ try {
392
+ // Analyze DAG
393
+ // INV-APE-002: Dependencies honored
394
+ // INV-APE-200: Cycles detected
395
+ const analysis = dagAnalyzer.analyze(tasks);
396
+ // Track failed tasks for dependency cascading
397
+ const failedTaskIds = new Set();
398
+ // Execute layers sequentially, tasks within layers in parallel
399
+ const allResults = [];
400
+ let peakConcurrency = 0;
401
+ for (const layer of analysis.layers) {
402
+ if (isCancelled(groupId) && taskConfig.failureStrategy === 'failFast') {
403
+ // Mark remaining layers as cancelled
404
+ for (const task of layer.tasks) {
405
+ const now = new Date().toISOString();
406
+ allResults.push({
407
+ taskId: task.taskId,
408
+ agentId: task.agentId,
409
+ status: 'cancelled',
410
+ success: false,
411
+ errorCode: ParallelExecutionErrorCodes.CANCELLED,
412
+ durationMs: 0,
413
+ layer: layer.index,
414
+ startedAt: now,
415
+ completedAt: now,
416
+ retryCount: 0,
417
+ });
418
+ }
419
+ continue;
420
+ }
421
+ const layerResults = await executeLayer(layer, sharedContext, taskConfig, failedTaskIds, groupId);
422
+ allResults.push(...layerResults);
423
+ // Track peak concurrency
424
+ const layerConcurrency = Math.min(layer.tasks.length, taskConfig.maxConcurrentAgents);
425
+ if (layerConcurrency > peakConcurrency) {
426
+ peakConcurrency = layerConcurrency;
427
+ }
428
+ }
429
+ // Aggregate results
430
+ // INV-APE-004: Follows configured strategy
431
+ const aggregatedOutput = resultAggregator.aggregate(allResults, {
432
+ strategy: taskConfig.resultAggregation,
433
+ });
434
+ const completedAt = new Date().toISOString();
435
+ const totalDurationMs = Date.now() - startTime;
436
+ const failedTasks = allResults
437
+ .filter((r) => !r.success && r.status !== 'cancelled' && r.status !== 'skipped')
438
+ .map((r) => r.taskId);
439
+ const cancelledTasks = allResults
440
+ .filter((r) => r.status === 'cancelled')
441
+ .map((r) => r.taskId);
442
+ const skippedTasks = allResults
443
+ .filter((r) => r.status === 'skipped')
444
+ .map((r) => r.taskId);
445
+ emitProgress({
446
+ type: 'execution.completed',
447
+ totalTasks: tasks.length,
448
+ completedTasks: allResults.filter((r) => r.success).length,
449
+ failedTasks: failedTasks.length,
450
+ }, groupId);
451
+ return {
452
+ groupId,
453
+ taskResults: allResults,
454
+ aggregatedOutput,
455
+ allSucceeded: failedTasks.length === 0 && cancelledTasks.length === 0,
456
+ failedTasks,
457
+ cancelledTasks: cancelledTasks.length > 0 ? cancelledTasks : undefined,
458
+ skippedTasks: skippedTasks.length > 0 ? skippedTasks : undefined,
459
+ totalDurationMs,
460
+ tasksExecuted: allResults.filter((r) => r.status !== 'skipped' && r.status !== 'cancelled').length,
461
+ tasksSkipped: skippedTasks.length + cancelledTasks.length,
462
+ layerCount: analysis.totalLayers,
463
+ peakConcurrency,
464
+ config: taskConfig,
465
+ startedAt,
466
+ completedAt,
467
+ };
468
+ }
469
+ catch (error) {
470
+ // Handle DAG analysis errors
471
+ if (error instanceof DAGAnalysisError) {
472
+ throw new ParallelExecutionError(error.code, error.message);
473
+ }
474
+ throw error;
475
+ }
476
+ finally {
477
+ // Cleanup - remove execution state to prevent memory leak
478
+ contextManager.clear();
479
+ activeExecutions.delete(groupId);
480
+ currentGroupId = null;
481
+ }
482
+ },
483
+ cancel() {
484
+ // Cancel all active executions
485
+ for (const [gId, state] of activeExecutions) {
486
+ state.cancelled = true;
487
+ emitProgress({
488
+ type: 'execution.cancelled',
489
+ }, gId);
490
+ }
491
+ },
492
+ };
493
+ }
494
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Result Aggregator
3
+ *
4
+ * Combines results from parallel agent execution based on configured strategy.
5
+ *
6
+ * Invariants:
7
+ * - INV-APE-004: Result aggregation follows configured strategy
8
+ */
9
+ import type { AgentParallelTaskResult } from '@defai.digital/contracts';
10
+ import type { ResultAggregator, CustomAggregator, AggregationStrategy } from './types.js';
11
+ /**
12
+ * Merge strategy: Combine all outputs into single object
13
+ * INV-APE-004: Later tasks override earlier for same keys
14
+ */
15
+ declare function mergeResults(results: AgentParallelTaskResult[]): unknown;
16
+ /**
17
+ * List strategy: Return array of individual results
18
+ * INV-APE-004: Ordered by task definition order (taskId)
19
+ */
20
+ declare function listResults(results: AgentParallelTaskResult[]): unknown;
21
+ /**
22
+ * First success strategy: Return first successful result
23
+ * INV-APE-004: First by layer, then by completion time
24
+ */
25
+ declare function firstSuccessResult(results: AgentParallelTaskResult[]): unknown;
26
+ /**
27
+ * Creates a result aggregator
28
+ */
29
+ export declare function createResultAggregator(): ResultAggregator;
30
+ /**
31
+ * Built-in aggregation strategies for convenience
32
+ */
33
+ export declare const AggregationStrategies: {
34
+ /**
35
+ * Merge all successful outputs into single object
36
+ */
37
+ readonly merge: typeof mergeResults;
38
+ /**
39
+ * Return array of all successful results
40
+ */
41
+ readonly list: typeof listResults;
42
+ /**
43
+ * Return first successful result only
44
+ */
45
+ readonly firstSuccess: typeof firstSuccessResult;
46
+ /**
47
+ * Create custom strategy from function
48
+ */
49
+ readonly custom: (fn: CustomAggregator) => CustomAggregator;
50
+ };
51
+ /**
52
+ * Utility: Create a keyed aggregator that groups results by a key
53
+ */
54
+ export declare function createKeyedAggregator(keyFn: (result: AgentParallelTaskResult) => string): CustomAggregator;
55
+ /**
56
+ * Utility: Create aggregator that filters by success and transforms
57
+ */
58
+ export declare function createTransformAggregator<T>(transform: (output: unknown, result: AgentParallelTaskResult) => T): CustomAggregator;
59
+ /**
60
+ * Get aggregation strategy from string
61
+ */
62
+ export declare function getAggregationStrategy(name: string): AggregationStrategy;
63
+ export {};
64
+ //# sourceMappingURL=result-aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-aggregator.d.ts","sourceRoot":"","sources":["../src/result-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,KAAK,EACV,gBAAgB,EAEhB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAmCpB;;;GAGG;AACH,iBAAS,YAAY,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,OAAO,CA4BjE;AAED;;;GAGG;AACH,iBAAS,WAAW,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAUhE;AAED;;;GAGG;AACH,iBAAS,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAevE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAqCzD;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB;IAChC;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;0BACU,gBAAgB;CACrB,CAAC;AAEX;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,MAAM,GACjD,gBAAgB,CAgBlB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,uBAAuB,KAAK,CAAC,GACjE,gBAAgB,CAMlB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,GACX,mBAAmB,CAQrB"}