@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.
- package/LICENSE +38 -0
- package/dist/context-manager.d.ts +35 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +156 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/dag-analyzer.d.ts +32 -0
- package/dist/dag-analyzer.d.ts.map +1 -0
- package/dist/dag-analyzer.js +237 -0
- package/dist/dag-analyzer.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator.d.ts +27 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +494 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/result-aggregator.d.ts +64 -0
- package/dist/result-aggregator.d.ts.map +1 -0
- package/dist/result-aggregator.js +187 -0
- package/dist/result-aggregator.js.map +1 -0
- package/dist/types.d.ts +207 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +54 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
- package/src/context-manager.ts +194 -0
- package/src/dag-analyzer.ts +285 -0
- package/src/index.ts +70 -0
- package/src/orchestrator.ts +595 -0
- package/src/result-aggregator.ts +238 -0
- package/src/types.ts +320 -0
|
@@ -0,0 +1,187 @@
|
|
|
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
|
+
/**
|
|
10
|
+
* Deep merge two objects
|
|
11
|
+
* Later values override earlier values
|
|
12
|
+
*/
|
|
13
|
+
function deepMerge(target, source) {
|
|
14
|
+
const result = { ...target };
|
|
15
|
+
for (const [key, value] of Object.entries(source)) {
|
|
16
|
+
if (value &&
|
|
17
|
+
typeof value === 'object' &&
|
|
18
|
+
!Array.isArray(value) &&
|
|
19
|
+
result[key] &&
|
|
20
|
+
typeof result[key] === 'object' &&
|
|
21
|
+
!Array.isArray(result[key])) {
|
|
22
|
+
// Recursively merge objects
|
|
23
|
+
result[key] = deepMerge(result[key], value);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Override with new value
|
|
27
|
+
result[key] = value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Merge strategy: Combine all outputs into single object
|
|
34
|
+
* INV-APE-004: Later tasks override earlier for same keys
|
|
35
|
+
*/
|
|
36
|
+
function mergeResults(results) {
|
|
37
|
+
const merged = {};
|
|
38
|
+
// Sort by layer then completion time to ensure deterministic merge order
|
|
39
|
+
const sortedResults = [...results].sort((a, b) => {
|
|
40
|
+
// First by layer
|
|
41
|
+
const layerDiff = (a.layer ?? 0) - (b.layer ?? 0);
|
|
42
|
+
if (layerDiff !== 0)
|
|
43
|
+
return layerDiff;
|
|
44
|
+
// Then by completion time
|
|
45
|
+
const aTime = a.completedAt ? new Date(a.completedAt).getTime() : 0;
|
|
46
|
+
const bTime = b.completedAt ? new Date(b.completedAt).getTime() : 0;
|
|
47
|
+
return aTime - bTime;
|
|
48
|
+
});
|
|
49
|
+
for (const result of sortedResults) {
|
|
50
|
+
if (result.success && result.output !== undefined) {
|
|
51
|
+
if (typeof result.output === 'object' && result.output !== null && !Array.isArray(result.output)) {
|
|
52
|
+
// Deep merge object outputs
|
|
53
|
+
Object.assign(merged, deepMerge(merged, result.output));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// For non-object outputs, use agent ID as key
|
|
57
|
+
merged[result.agentId] = result.output;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* List strategy: Return array of individual results
|
|
65
|
+
* INV-APE-004: Ordered by task definition order (taskId)
|
|
66
|
+
*/
|
|
67
|
+
function listResults(results) {
|
|
68
|
+
return results
|
|
69
|
+
.filter((r) => r.success)
|
|
70
|
+
.sort((a, b) => a.taskId.localeCompare(b.taskId))
|
|
71
|
+
.map((r) => ({
|
|
72
|
+
taskId: r.taskId,
|
|
73
|
+
agentId: r.agentId,
|
|
74
|
+
output: r.output,
|
|
75
|
+
durationMs: r.durationMs,
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* First success strategy: Return first successful result
|
|
80
|
+
* INV-APE-004: First by layer, then by completion time
|
|
81
|
+
*/
|
|
82
|
+
function firstSuccessResult(results) {
|
|
83
|
+
const successResults = results
|
|
84
|
+
.filter((r) => r.success && r.output !== undefined)
|
|
85
|
+
.sort((a, b) => {
|
|
86
|
+
// First by layer
|
|
87
|
+
const layerDiff = (a.layer ?? 0) - (b.layer ?? 0);
|
|
88
|
+
if (layerDiff !== 0)
|
|
89
|
+
return layerDiff;
|
|
90
|
+
// Then by completion time
|
|
91
|
+
const aTime = a.completedAt ? new Date(a.completedAt).getTime() : 0;
|
|
92
|
+
const bTime = b.completedAt ? new Date(b.completedAt).getTime() : 0;
|
|
93
|
+
return aTime - bTime;
|
|
94
|
+
});
|
|
95
|
+
return successResults[0]?.output;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Creates a result aggregator
|
|
99
|
+
*/
|
|
100
|
+
export function createResultAggregator() {
|
|
101
|
+
return {
|
|
102
|
+
/**
|
|
103
|
+
* Aggregate task results based on strategy
|
|
104
|
+
* INV-APE-004: Follows configured strategy exactly
|
|
105
|
+
*/
|
|
106
|
+
aggregate(results, options) {
|
|
107
|
+
const { strategy, customAggregator } = options;
|
|
108
|
+
switch (strategy) {
|
|
109
|
+
case 'merge':
|
|
110
|
+
return mergeResults(results);
|
|
111
|
+
case 'list':
|
|
112
|
+
return listResults(results);
|
|
113
|
+
case 'firstSuccess':
|
|
114
|
+
return firstSuccessResult(results);
|
|
115
|
+
case 'custom':
|
|
116
|
+
if (!customAggregator) {
|
|
117
|
+
throw new Error('Custom aggregation strategy requires a customAggregator function');
|
|
118
|
+
}
|
|
119
|
+
return customAggregator(results);
|
|
120
|
+
default:
|
|
121
|
+
// Exhaustive check
|
|
122
|
+
const _exhaustive = strategy;
|
|
123
|
+
throw new Error(`Unknown aggregation strategy: ${_exhaustive}`);
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Built-in aggregation strategies for convenience
|
|
130
|
+
*/
|
|
131
|
+
export const AggregationStrategies = {
|
|
132
|
+
/**
|
|
133
|
+
* Merge all successful outputs into single object
|
|
134
|
+
*/
|
|
135
|
+
merge: mergeResults,
|
|
136
|
+
/**
|
|
137
|
+
* Return array of all successful results
|
|
138
|
+
*/
|
|
139
|
+
list: listResults,
|
|
140
|
+
/**
|
|
141
|
+
* Return first successful result only
|
|
142
|
+
*/
|
|
143
|
+
firstSuccess: firstSuccessResult,
|
|
144
|
+
/**
|
|
145
|
+
* Create custom strategy from function
|
|
146
|
+
*/
|
|
147
|
+
custom: (fn) => fn,
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Utility: Create a keyed aggregator that groups results by a key
|
|
151
|
+
*/
|
|
152
|
+
export function createKeyedAggregator(keyFn) {
|
|
153
|
+
return (results) => {
|
|
154
|
+
const grouped = {};
|
|
155
|
+
for (const result of results) {
|
|
156
|
+
if (result.success && result.output !== undefined) {
|
|
157
|
+
const key = keyFn(result);
|
|
158
|
+
if (!grouped[key]) {
|
|
159
|
+
grouped[key] = [];
|
|
160
|
+
}
|
|
161
|
+
grouped[key].push(result.output);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return grouped;
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Utility: Create aggregator that filters by success and transforms
|
|
169
|
+
*/
|
|
170
|
+
export function createTransformAggregator(transform) {
|
|
171
|
+
return (results) => {
|
|
172
|
+
return results
|
|
173
|
+
.filter((r) => r.success && r.output !== undefined)
|
|
174
|
+
.map((r) => transform(r.output, r));
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get aggregation strategy from string
|
|
179
|
+
*/
|
|
180
|
+
export function getAggregationStrategy(name) {
|
|
181
|
+
const valid = ['merge', 'list', 'firstSuccess', 'custom'];
|
|
182
|
+
if (valid.includes(name)) {
|
|
183
|
+
return name;
|
|
184
|
+
}
|
|
185
|
+
throw new Error(`Invalid aggregation strategy: ${name}. Valid strategies: ${valid.join(', ')}`);
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=result-aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-aggregator.js","sourceRoot":"","sources":["../src/result-aggregator.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Agent Execution Types
|
|
3
|
+
*
|
|
4
|
+
* Port interfaces and type definitions for parallel agent execution.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentParallelTask, AgentParallelTaskResult, AgentParallelGroupResult, AgentParallelExecutionConfig, ExecutionPlan, SharedContext } from '@defai.digital/contracts';
|
|
7
|
+
/**
|
|
8
|
+
* Agent execution request
|
|
9
|
+
*/
|
|
10
|
+
export interface AgentExecuteRequest {
|
|
11
|
+
agentId: string;
|
|
12
|
+
input: unknown;
|
|
13
|
+
provider?: string;
|
|
14
|
+
model?: string;
|
|
15
|
+
timeout?: number;
|
|
16
|
+
sessionId?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Agent execution result
|
|
20
|
+
*/
|
|
21
|
+
export interface AgentExecuteResult {
|
|
22
|
+
success: boolean;
|
|
23
|
+
agentId: string;
|
|
24
|
+
output?: unknown;
|
|
25
|
+
error?: string;
|
|
26
|
+
errorCode?: string;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Port interface for agent execution
|
|
31
|
+
* Implementations inject actual agent executor at runtime
|
|
32
|
+
*/
|
|
33
|
+
export interface AgentExecutorPort {
|
|
34
|
+
/**
|
|
35
|
+
* Execute a single agent with input
|
|
36
|
+
*/
|
|
37
|
+
execute(request: AgentExecuteRequest): Promise<AgentExecuteResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Check if an agent exists
|
|
40
|
+
*/
|
|
41
|
+
exists(agentId: string): Promise<boolean>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parallel agent orchestrator interface
|
|
45
|
+
*/
|
|
46
|
+
export interface AgentParallelOrchestrator {
|
|
47
|
+
/**
|
|
48
|
+
* Execute multiple agents in parallel with DAG-based dependency management
|
|
49
|
+
* INV-APE-001: Respects maxConcurrentAgents
|
|
50
|
+
* INV-APE-002: Honors dependencies
|
|
51
|
+
* INV-APE-003: Shared context immutable
|
|
52
|
+
*/
|
|
53
|
+
executeParallel(tasks: AgentParallelTask[], config?: Partial<AgentParallelExecutionConfig>, sharedContext?: Record<string, unknown>): Promise<AgentParallelGroupResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Build execution plan without executing
|
|
56
|
+
* Returns DAG analysis showing execution layers
|
|
57
|
+
*/
|
|
58
|
+
buildExecutionPlan(tasks: AgentParallelTask[]): ExecutionPlan;
|
|
59
|
+
/**
|
|
60
|
+
* Cancel ongoing execution
|
|
61
|
+
*/
|
|
62
|
+
cancel(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Get current configuration
|
|
65
|
+
*/
|
|
66
|
+
getConfig(): AgentParallelExecutionConfig;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Execution layer - tasks at same level can run in parallel
|
|
70
|
+
*/
|
|
71
|
+
export interface TaskLayer {
|
|
72
|
+
index: number;
|
|
73
|
+
tasks: AgentParallelTask[];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* DAG analysis result
|
|
77
|
+
*/
|
|
78
|
+
export interface DAGAnalysisResult {
|
|
79
|
+
layers: TaskLayer[];
|
|
80
|
+
totalLayers: number;
|
|
81
|
+
maxParallelism: number;
|
|
82
|
+
hasCycles: boolean;
|
|
83
|
+
cycleNodes?: string[];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* DAG analyzer interface
|
|
87
|
+
*/
|
|
88
|
+
export interface DAGAnalyzer {
|
|
89
|
+
/**
|
|
90
|
+
* Analyze tasks and build execution layers
|
|
91
|
+
* INV-APE-002: Ensures dependencies honored
|
|
92
|
+
* INV-APE-200: Detects circular dependencies
|
|
93
|
+
*/
|
|
94
|
+
analyze(tasks: AgentParallelTask[]): DAGAnalysisResult;
|
|
95
|
+
/**
|
|
96
|
+
* Validate DAG structure
|
|
97
|
+
*/
|
|
98
|
+
validate(tasks: AgentParallelTask[]): {
|
|
99
|
+
valid: boolean;
|
|
100
|
+
errors: string[];
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Context manager for shared immutable context
|
|
105
|
+
* INV-APE-003: Context immutable during execution
|
|
106
|
+
*/
|
|
107
|
+
export interface ContextManager {
|
|
108
|
+
/**
|
|
109
|
+
* Create frozen shared context
|
|
110
|
+
*/
|
|
111
|
+
create(data: Record<string, unknown>): SharedContext;
|
|
112
|
+
/**
|
|
113
|
+
* Get read-only view of context
|
|
114
|
+
*/
|
|
115
|
+
get(): SharedContext | null;
|
|
116
|
+
/**
|
|
117
|
+
* Check if context is frozen/immutable
|
|
118
|
+
*/
|
|
119
|
+
isFrozen(): boolean;
|
|
120
|
+
/**
|
|
121
|
+
* Clear context (for cleanup)
|
|
122
|
+
*/
|
|
123
|
+
clear(): void;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Result aggregation strategy
|
|
127
|
+
*/
|
|
128
|
+
export type AggregationStrategy = 'merge' | 'list' | 'firstSuccess' | 'custom';
|
|
129
|
+
/**
|
|
130
|
+
* Custom aggregation function
|
|
131
|
+
*/
|
|
132
|
+
export type CustomAggregator = (results: AgentParallelTaskResult[]) => unknown;
|
|
133
|
+
/**
|
|
134
|
+
* Result aggregator options
|
|
135
|
+
*/
|
|
136
|
+
export interface ResultAggregatorOptions {
|
|
137
|
+
strategy: AggregationStrategy;
|
|
138
|
+
customAggregator?: CustomAggregator;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Result aggregator interface
|
|
142
|
+
* INV-APE-004: Aggregation follows configured strategy
|
|
143
|
+
*/
|
|
144
|
+
export interface ResultAggregator {
|
|
145
|
+
/**
|
|
146
|
+
* Aggregate task results based on strategy
|
|
147
|
+
*/
|
|
148
|
+
aggregate(results: AgentParallelTaskResult[], options: ResultAggregatorOptions): unknown;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Progress event types
|
|
152
|
+
*/
|
|
153
|
+
export type ParallelProgressEventType = 'execution.started' | 'layer.started' | 'layer.completed' | 'task.started' | 'task.completed' | 'task.failed' | 'task.skipped' | 'execution.completed' | 'execution.cancelled';
|
|
154
|
+
/**
|
|
155
|
+
* Progress event
|
|
156
|
+
*/
|
|
157
|
+
export interface ParallelProgressEvent {
|
|
158
|
+
type: ParallelProgressEventType;
|
|
159
|
+
timestamp: string;
|
|
160
|
+
groupId: string;
|
|
161
|
+
layerIndex?: number;
|
|
162
|
+
taskId?: string;
|
|
163
|
+
agentId?: string;
|
|
164
|
+
totalTasks?: number;
|
|
165
|
+
completedTasks?: number;
|
|
166
|
+
failedTasks?: number;
|
|
167
|
+
message?: string;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Progress callback
|
|
171
|
+
*/
|
|
172
|
+
export type ParallelProgressCallback = (event: ParallelProgressEvent) => void;
|
|
173
|
+
/**
|
|
174
|
+
* Options for creating parallel orchestrator
|
|
175
|
+
*/
|
|
176
|
+
export interface AgentParallelOrchestratorOptions {
|
|
177
|
+
/**
|
|
178
|
+
* Agent executor port (for dependency injection)
|
|
179
|
+
*/
|
|
180
|
+
agentExecutor: AgentExecutorPort;
|
|
181
|
+
/**
|
|
182
|
+
* Default configuration
|
|
183
|
+
*/
|
|
184
|
+
defaultConfig?: Partial<AgentParallelExecutionConfig>;
|
|
185
|
+
/**
|
|
186
|
+
* Progress callback for execution updates
|
|
187
|
+
*/
|
|
188
|
+
onProgress?: ParallelProgressCallback;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Stub agent executor for testing
|
|
192
|
+
*/
|
|
193
|
+
export declare class StubAgentExecutor implements AgentExecutorPort {
|
|
194
|
+
private results;
|
|
195
|
+
private existingAgents;
|
|
196
|
+
/**
|
|
197
|
+
* Set expected result for an agent
|
|
198
|
+
*/
|
|
199
|
+
setResult(agentId: string, result: Partial<AgentExecuteResult>): void;
|
|
200
|
+
/**
|
|
201
|
+
* Set agent as existing
|
|
202
|
+
*/
|
|
203
|
+
setExists(agentId: string, exists: boolean): void;
|
|
204
|
+
execute(request: AgentExecuteRequest): Promise<AgentExecuteResult>;
|
|
205
|
+
exists(agentId: string): Promise<boolean>;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Agent Execution Types
|
|
3
|
+
*
|
|
4
|
+
* Port interfaces and type definitions for parallel agent execution.
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Stub Implementation (for testing)
|
|
8
|
+
// ============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Stub agent executor for testing
|
|
11
|
+
*/
|
|
12
|
+
export class StubAgentExecutor {
|
|
13
|
+
results = new Map();
|
|
14
|
+
existingAgents = new Set();
|
|
15
|
+
/**
|
|
16
|
+
* Set expected result for an agent
|
|
17
|
+
*/
|
|
18
|
+
setResult(agentId, result) {
|
|
19
|
+
this.results.set(agentId, {
|
|
20
|
+
success: true,
|
|
21
|
+
agentId,
|
|
22
|
+
durationMs: 100,
|
|
23
|
+
...result,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Set agent as existing
|
|
28
|
+
*/
|
|
29
|
+
setExists(agentId, exists) {
|
|
30
|
+
if (exists) {
|
|
31
|
+
this.existingAgents.add(agentId);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.existingAgents.delete(agentId);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async execute(request) {
|
|
38
|
+
const result = this.results.get(request.agentId);
|
|
39
|
+
if (result) {
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
// Default: return success with echo output
|
|
43
|
+
return {
|
|
44
|
+
success: true,
|
|
45
|
+
agentId: request.agentId,
|
|
46
|
+
output: { input: request.input, echo: true },
|
|
47
|
+
durationMs: 50,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async exists(agentId) {
|
|
51
|
+
return this.existingAgents.has(agentId) || this.results.has(agentId);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuQH,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACpB,OAAO,GAAoC,IAAI,GAAG,EAAE,CAAC;IACrD,cAAc,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEhD;;OAEG;IACH,SAAS,CAAC,OAAe,EAAE,MAAmC;QAC5D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;YACxB,OAAO,EAAE,IAAI;YACb,OAAO;YACP,UAAU,EAAE,GAAG;YACf,GAAG,MAAM;SACV,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAe,EAAE,MAAe;QACxC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,2CAA2C;QAC3C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;YAC5C,UAAU,EAAE,EAAE;SACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@defai.digital/agent-parallel",
|
|
3
|
+
"version": "13.4.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Parallel agent execution orchestration for AutomatosX",
|
|
6
|
+
"license": "BUSL-1.1",
|
|
7
|
+
"author": "DEFAI Private Limited",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/defai-digital/automatosx.git",
|
|
11
|
+
"directory": "packages/core/agent-parallel"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/defai-digital/automatosx#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/defai-digital/automatosx/issues"
|
|
16
|
+
},
|
|
17
|
+
"main": "dist/index.js",
|
|
18
|
+
"types": "dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"src"
|
|
28
|
+
],
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20.0.0"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@defai.digital/contracts": "13.4.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"typescript": "^5.7.2"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"zod": "^3.23.0"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc --build",
|
|
46
|
+
"clean": "rm -rf dist"
|
|
47
|
+
}
|
|
48
|
+
}
|