@cogitator-ai/workflows 0.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/LICENSE +21 -0
- package/README.md +97 -0
- package/dist/builder.d.ts +39 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +224 -0
- package/dist/builder.js.map +1 -0
- package/dist/checkpoint.d.ts +33 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +108 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/executor.d.ts +24 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +207 -0
- package/dist/executor.js.map +1 -0
- package/dist/human/approval-store.d.ts +95 -0
- package/dist/human/approval-store.d.ts.map +1 -0
- package/dist/human/approval-store.js +377 -0
- package/dist/human/approval-store.js.map +1 -0
- package/dist/human/human-node.d.ts +104 -0
- package/dist/human/human-node.d.ts.map +1 -0
- package/dist/human/human-node.js +342 -0
- package/dist/human/human-node.js.map +1 -0
- package/dist/human/index.d.ts +17 -0
- package/dist/human/index.d.ts.map +1 -0
- package/dist/human/index.js +17 -0
- package/dist/human/index.js.map +1 -0
- package/dist/human/notifiers.d.ts +85 -0
- package/dist/human/notifiers.d.ts.map +1 -0
- package/dist/human/notifiers.js +289 -0
- package/dist/human/notifiers.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/manager/index.d.ts +19 -0
- package/dist/manager/index.d.ts.map +1 -0
- package/dist/manager/index.js +17 -0
- package/dist/manager/index.js.map +1 -0
- package/dist/manager/run-store.d.ts +78 -0
- package/dist/manager/run-store.d.ts.map +1 -0
- package/dist/manager/run-store.js +390 -0
- package/dist/manager/run-store.js.map +1 -0
- package/dist/manager/scheduler.d.ts +159 -0
- package/dist/manager/scheduler.d.ts.map +1 -0
- package/dist/manager/scheduler.js +355 -0
- package/dist/manager/scheduler.js.map +1 -0
- package/dist/manager/workflow-manager.d.ts +114 -0
- package/dist/manager/workflow-manager.d.ts.map +1 -0
- package/dist/manager/workflow-manager.js +460 -0
- package/dist/manager/workflow-manager.js.map +1 -0
- package/dist/nodes/agent.d.ts +24 -0
- package/dist/nodes/agent.d.ts.map +1 -0
- package/dist/nodes/agent.js +37 -0
- package/dist/nodes/agent.js.map +1 -0
- package/dist/nodes/base.d.ts +12 -0
- package/dist/nodes/base.d.ts.map +1 -0
- package/dist/nodes/base.js +5 -0
- package/dist/nodes/base.js.map +1 -0
- package/dist/nodes/function.d.ts +27 -0
- package/dist/nodes/function.d.ts.map +1 -0
- package/dist/nodes/function.js +29 -0
- package/dist/nodes/function.js.map +1 -0
- package/dist/nodes/index.d.ts +8 -0
- package/dist/nodes/index.d.ts.map +1 -0
- package/dist/nodes/index.js +8 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/tool.d.ts +19 -0
- package/dist/nodes/tool.d.ts.map +1 -0
- package/dist/nodes/tool.js +26 -0
- package/dist/nodes/tool.js.map +1 -0
- package/dist/observability/exporters.d.ts +93 -0
- package/dist/observability/exporters.d.ts.map +1 -0
- package/dist/observability/exporters.js +330 -0
- package/dist/observability/exporters.js.map +1 -0
- package/dist/observability/index.d.ts +17 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +17 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts +114 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +435 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/span-attributes.d.ts +95 -0
- package/dist/observability/span-attributes.d.ts.map +1 -0
- package/dist/observability/span-attributes.js +142 -0
- package/dist/observability/span-attributes.js.map +1 -0
- package/dist/observability/tracer.d.ts +110 -0
- package/dist/observability/tracer.d.ts.map +1 -0
- package/dist/observability/tracer.js +409 -0
- package/dist/observability/tracer.js.map +1 -0
- package/dist/patterns/index.d.ts +15 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +15 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/map-reduce.d.ts +223 -0
- package/dist/patterns/map-reduce.d.ts.map +1 -0
- package/dist/patterns/map-reduce.js +378 -0
- package/dist/patterns/map-reduce.js.map +1 -0
- package/dist/saga/circuit-breaker.d.ts +153 -0
- package/dist/saga/circuit-breaker.d.ts.map +1 -0
- package/dist/saga/circuit-breaker.js +306 -0
- package/dist/saga/circuit-breaker.js.map +1 -0
- package/dist/saga/compensation.d.ts +134 -0
- package/dist/saga/compensation.d.ts.map +1 -0
- package/dist/saga/compensation.js +240 -0
- package/dist/saga/compensation.js.map +1 -0
- package/dist/saga/dead-letter.d.ts +113 -0
- package/dist/saga/dead-letter.d.ts.map +1 -0
- package/dist/saga/dead-letter.js +307 -0
- package/dist/saga/dead-letter.js.map +1 -0
- package/dist/saga/idempotency.d.ts +95 -0
- package/dist/saga/idempotency.d.ts.map +1 -0
- package/dist/saga/idempotency.js +266 -0
- package/dist/saga/idempotency.js.map +1 -0
- package/dist/saga/index.d.ts +16 -0
- package/dist/saga/index.d.ts.map +1 -0
- package/dist/saga/index.js +16 -0
- package/dist/saga/index.js.map +1 -0
- package/dist/saga/retry.d.ts +59 -0
- package/dist/saga/retry.d.ts.map +1 -0
- package/dist/saga/retry.js +222 -0
- package/dist/saga/retry.js.map +1 -0
- package/dist/scheduler.d.ts +37 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +151 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/subworkflows/index.d.ts +16 -0
- package/dist/subworkflows/index.d.ts.map +1 -0
- package/dist/subworkflows/index.js +16 -0
- package/dist/subworkflows/index.js.map +1 -0
- package/dist/subworkflows/parallel-subworkflows.d.ts +139 -0
- package/dist/subworkflows/parallel-subworkflows.d.ts.map +1 -0
- package/dist/subworkflows/parallel-subworkflows.js +270 -0
- package/dist/subworkflows/parallel-subworkflows.js.map +1 -0
- package/dist/subworkflows/subworkflow-node.d.ts +136 -0
- package/dist/subworkflows/subworkflow-node.d.ts.map +1 -0
- package/dist/subworkflows/subworkflow-node.js +164 -0
- package/dist/subworkflows/subworkflow-node.js.map +1 -0
- package/dist/timers/cron-parser.d.ts +110 -0
- package/dist/timers/cron-parser.d.ts.map +1 -0
- package/dist/timers/cron-parser.js +412 -0
- package/dist/timers/cron-parser.js.map +1 -0
- package/dist/timers/index.d.ts +18 -0
- package/dist/timers/index.d.ts.map +1 -0
- package/dist/timers/index.js +18 -0
- package/dist/timers/index.js.map +1 -0
- package/dist/timers/timer-manager.d.ts +219 -0
- package/dist/timers/timer-manager.d.ts.map +1 -0
- package/dist/timers/timer-manager.js +351 -0
- package/dist/timers/timer-manager.js.map +1 -0
- package/dist/timers/timer-node.d.ts +144 -0
- package/dist/timers/timer-node.d.ts.map +1 -0
- package/dist/timers/timer-node.js +246 -0
- package/dist/timers/timer-node.js.map +1 -0
- package/dist/timers/timer-store.d.ts +90 -0
- package/dist/timers/timer-store.d.ts.map +1 -0
- package/dist/timers/timer-store.js +357 -0
- package/dist/timers/timer-store.js.map +1 -0
- package/dist/triggers/cron-trigger.d.ts +102 -0
- package/dist/triggers/cron-trigger.d.ts.map +1 -0
- package/dist/triggers/cron-trigger.js +309 -0
- package/dist/triggers/cron-trigger.js.map +1 -0
- package/dist/triggers/index.d.ts +14 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +10 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/rate-limiter.d.ts +130 -0
- package/dist/triggers/rate-limiter.d.ts.map +1 -0
- package/dist/triggers/rate-limiter.js +294 -0
- package/dist/triggers/rate-limiter.js.map +1 -0
- package/dist/triggers/trigger-manager.d.ts +166 -0
- package/dist/triggers/trigger-manager.d.ts.map +1 -0
- package/dist/triggers/trigger-manager.js +436 -0
- package/dist/triggers/trigger-manager.js.map +1 -0
- package/dist/triggers/webhook-trigger.d.ts +150 -0
- package/dist/triggers/webhook-trigger.d.ts.map +1 -0
- package/dist/triggers/webhook-trigger.js +452 -0
- package/dist/triggers/webhook-trigger.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel subworkflow execution
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Execute multiple subworkflows in parallel
|
|
6
|
+
* - Configurable concurrency
|
|
7
|
+
* - Aggregate results
|
|
8
|
+
* - Partial failure handling
|
|
9
|
+
*/
|
|
10
|
+
import { executeSubworkflow, } from './subworkflow-node';
|
|
11
|
+
/**
|
|
12
|
+
* Execute subworkflows with concurrency limit
|
|
13
|
+
*/
|
|
14
|
+
async function executeWithConcurrency(items, concurrency, continueOnError, onComplete) {
|
|
15
|
+
const results = new Map();
|
|
16
|
+
const pending = [];
|
|
17
|
+
let nextIndex = 0;
|
|
18
|
+
let stopExecution = false;
|
|
19
|
+
const executeNext = async () => {
|
|
20
|
+
if (stopExecution)
|
|
21
|
+
return;
|
|
22
|
+
const index = nextIndex++;
|
|
23
|
+
if (index >= items.length)
|
|
24
|
+
return;
|
|
25
|
+
const item = items[index];
|
|
26
|
+
try {
|
|
27
|
+
const result = await item.execute();
|
|
28
|
+
results.set(item.id, { result });
|
|
29
|
+
onComplete?.(item.id, result);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
33
|
+
results.set(item.id, { error: err });
|
|
34
|
+
if (!continueOnError) {
|
|
35
|
+
stopExecution = true;
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
onComplete?.(item.id, undefined, err);
|
|
39
|
+
}
|
|
40
|
+
await executeNext();
|
|
41
|
+
};
|
|
42
|
+
const initialBatch = Math.min(concurrency, items.length);
|
|
43
|
+
for (let i = 0; i < initialBatch; i++) {
|
|
44
|
+
pending.push(executeNext());
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
await Promise.all(pending);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
}
|
|
51
|
+
return results;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Execute multiple subworkflows in parallel
|
|
55
|
+
*/
|
|
56
|
+
export async function executeParallelSubworkflows(parentState, config, context) {
|
|
57
|
+
const startTime = Date.now();
|
|
58
|
+
const definitions = typeof config.subworkflows === 'function'
|
|
59
|
+
? config.subworkflows(parentState)
|
|
60
|
+
: config.subworkflows;
|
|
61
|
+
const concurrency = config.concurrency ?? Infinity;
|
|
62
|
+
const continueOnError = config.continueOnError ?? false;
|
|
63
|
+
const maxDepth = config.maxDepth ?? 10;
|
|
64
|
+
let completed = 0;
|
|
65
|
+
let successful = 0;
|
|
66
|
+
let failed = 0;
|
|
67
|
+
const emitProgress = () => {
|
|
68
|
+
if (config.onProgress) {
|
|
69
|
+
config.onProgress({
|
|
70
|
+
total: definitions.length,
|
|
71
|
+
completed,
|
|
72
|
+
successful,
|
|
73
|
+
failed,
|
|
74
|
+
pending: definitions.length - completed,
|
|
75
|
+
running: Math.min(concurrency, definitions.length - completed),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
emitProgress();
|
|
80
|
+
const executionItems = definitions.map((def) => ({
|
|
81
|
+
id: def.id,
|
|
82
|
+
execute: async () => {
|
|
83
|
+
const subConfig = {
|
|
84
|
+
...def.config,
|
|
85
|
+
onError: def.config.onError ?? config.onError,
|
|
86
|
+
maxDepth: def.config.maxDepth ?? maxDepth,
|
|
87
|
+
shareCheckpoints: def.config.shareCheckpoints ?? config.shareCheckpoints,
|
|
88
|
+
};
|
|
89
|
+
config.onSubworkflowStart?.(def.id, subConfig);
|
|
90
|
+
const result = await executeSubworkflow(parentState, subConfig, {
|
|
91
|
+
...context,
|
|
92
|
+
depth: context.depth + 1,
|
|
93
|
+
});
|
|
94
|
+
return result;
|
|
95
|
+
},
|
|
96
|
+
}));
|
|
97
|
+
const rawResults = await executeWithConcurrency(executionItems, concurrency, continueOnError, (id, result, error) => {
|
|
98
|
+
completed++;
|
|
99
|
+
if (error) {
|
|
100
|
+
failed++;
|
|
101
|
+
}
|
|
102
|
+
else if (result) {
|
|
103
|
+
if (result.success) {
|
|
104
|
+
successful++;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
failed++;
|
|
108
|
+
}
|
|
109
|
+
config.onSubworkflowComplete?.(id, result);
|
|
110
|
+
}
|
|
111
|
+
emitProgress();
|
|
112
|
+
});
|
|
113
|
+
const results = new Map();
|
|
114
|
+
const errors = new Map();
|
|
115
|
+
let skipped = 0;
|
|
116
|
+
for (const [id, { result, error }] of rawResults) {
|
|
117
|
+
if (error) {
|
|
118
|
+
errors.set(id, error);
|
|
119
|
+
}
|
|
120
|
+
else if (result) {
|
|
121
|
+
results.set(id, result);
|
|
122
|
+
if (result.skipped) {
|
|
123
|
+
skipped++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const overallSuccess = failed === 0 || continueOnError;
|
|
128
|
+
const newParentState = overallSuccess
|
|
129
|
+
? config.aggregator(results, parentState)
|
|
130
|
+
: parentState;
|
|
131
|
+
return {
|
|
132
|
+
success: overallSuccess,
|
|
133
|
+
parentState: newParentState,
|
|
134
|
+
results,
|
|
135
|
+
errors,
|
|
136
|
+
duration: Date.now() - startTime,
|
|
137
|
+
stats: {
|
|
138
|
+
total: definitions.length,
|
|
139
|
+
successful,
|
|
140
|
+
failed,
|
|
141
|
+
skipped,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Create a parallel subworkflows node factory
|
|
147
|
+
*/
|
|
148
|
+
export function parallelSubworkflows(name, config) {
|
|
149
|
+
return { name, ...config };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create a fan-out/fan-in pattern
|
|
153
|
+
* Fans out to multiple identical subworkflows with different inputs
|
|
154
|
+
*/
|
|
155
|
+
export function fanOutFanIn(name, config) {
|
|
156
|
+
return {
|
|
157
|
+
name,
|
|
158
|
+
concurrency: config.concurrency,
|
|
159
|
+
continueOnError: config.continueOnError,
|
|
160
|
+
subworkflows: (state) => config.getInputs(state).map(({ id, input }) => ({
|
|
161
|
+
id,
|
|
162
|
+
config: {
|
|
163
|
+
name: `${name}:${id}`,
|
|
164
|
+
workflow: config.workflow,
|
|
165
|
+
inputMapper: () => input,
|
|
166
|
+
outputMapper: (_result, parentState) => parentState,
|
|
167
|
+
},
|
|
168
|
+
})),
|
|
169
|
+
aggregator: (results, state) => {
|
|
170
|
+
const workflowResults = new Map();
|
|
171
|
+
for (const [id, result] of results) {
|
|
172
|
+
if (result.childResult) {
|
|
173
|
+
workflowResults.set(id, result.childResult);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return config.aggregator(workflowResults, state);
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Create a scatter-gather pattern
|
|
182
|
+
* Scatters work across multiple workflows and gathers results
|
|
183
|
+
*/
|
|
184
|
+
export function scatterGather(name, config) {
|
|
185
|
+
const subworkflows = [];
|
|
186
|
+
for (const [id, workflow] of config.workflows) {
|
|
187
|
+
subworkflows.push({
|
|
188
|
+
id,
|
|
189
|
+
config: {
|
|
190
|
+
name: `${name}:${id}`,
|
|
191
|
+
workflow: workflow,
|
|
192
|
+
inputMapper: (state) => config.inputMapper(state, id),
|
|
193
|
+
outputMapper: (_result, parentState) => parentState,
|
|
194
|
+
timeout: config.timeout,
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
name,
|
|
200
|
+
subworkflows,
|
|
201
|
+
concurrency: config.concurrency,
|
|
202
|
+
continueOnError: true,
|
|
203
|
+
aggregator: (results, state) => {
|
|
204
|
+
const workflowResults = new Map();
|
|
205
|
+
for (const [id, result] of results) {
|
|
206
|
+
if (result.childResult) {
|
|
207
|
+
workflowResults.set(id, result.childResult);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return config.outputMapper(workflowResults, state);
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Create a race pattern
|
|
216
|
+
* Executes multiple subworkflows and returns the first successful result
|
|
217
|
+
*/
|
|
218
|
+
export async function raceSubworkflows(parentState, subworkflows, context) {
|
|
219
|
+
const controller = new AbortController();
|
|
220
|
+
const { signal } = controller;
|
|
221
|
+
const promises = subworkflows.map(async (config) => {
|
|
222
|
+
if (signal.aborted) {
|
|
223
|
+
throw new Error('Race cancelled');
|
|
224
|
+
}
|
|
225
|
+
const result = await executeSubworkflow(parentState, config, {
|
|
226
|
+
...context,
|
|
227
|
+
depth: context.depth + 1,
|
|
228
|
+
});
|
|
229
|
+
if (result.success && !result.skipped) {
|
|
230
|
+
controller.abort();
|
|
231
|
+
return result;
|
|
232
|
+
}
|
|
233
|
+
throw new Error('Subworkflow did not succeed');
|
|
234
|
+
});
|
|
235
|
+
try {
|
|
236
|
+
const result = await Promise.any(promises);
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Create a fallback pattern
|
|
245
|
+
* Tries subworkflows in order until one succeeds
|
|
246
|
+
*/
|
|
247
|
+
export async function fallbackSubworkflows(parentState, subworkflows, context) {
|
|
248
|
+
let lastResult;
|
|
249
|
+
let lastError;
|
|
250
|
+
for (const config of subworkflows) {
|
|
251
|
+
try {
|
|
252
|
+
const result = await executeSubworkflow(parentState, config, {
|
|
253
|
+
...context,
|
|
254
|
+
depth: context.depth + 1,
|
|
255
|
+
});
|
|
256
|
+
if (result.success && !result.skipped) {
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
lastResult = result;
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (lastResult) {
|
|
266
|
+
return lastResult;
|
|
267
|
+
}
|
|
268
|
+
throw lastError ?? new Error('All fallback subworkflows failed');
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=parallel-subworkflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-subworkflows.js","sourceRoot":"","sources":["../../src/subworkflows/parallel-subworkflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subworkflow node implementation
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - State mapping parent ↔ child
|
|
6
|
+
* - Error propagation strategies
|
|
7
|
+
* - Recursive workflows with depth limits
|
|
8
|
+
* - Shared checkpoints
|
|
9
|
+
* - Timeout support
|
|
10
|
+
*/
|
|
11
|
+
import type { Workflow, WorkflowState, WorkflowResult, CheckpointStore } from '@cogitator-ai/types';
|
|
12
|
+
import type { Cogitator } from '@cogitator-ai/core';
|
|
13
|
+
/**
|
|
14
|
+
* Error handling strategy for subworkflows
|
|
15
|
+
*/
|
|
16
|
+
export type SubworkflowErrorStrategy = 'propagate' | 'catch' | 'retry' | 'ignore';
|
|
17
|
+
/**
|
|
18
|
+
* Subworkflow retry configuration
|
|
19
|
+
*/
|
|
20
|
+
export interface SubworkflowRetryConfig {
|
|
21
|
+
maxAttempts: number;
|
|
22
|
+
delay?: number;
|
|
23
|
+
backoff?: 'linear' | 'exponential';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Subworkflow configuration
|
|
27
|
+
*/
|
|
28
|
+
export interface SubworkflowConfig<PS extends WorkflowState, CS extends WorkflowState> {
|
|
29
|
+
name: string;
|
|
30
|
+
/**
|
|
31
|
+
* The child workflow to execute
|
|
32
|
+
*/
|
|
33
|
+
workflow: Workflow<CS>;
|
|
34
|
+
/**
|
|
35
|
+
* Map parent state to child initial state
|
|
36
|
+
*/
|
|
37
|
+
inputMapper: (parentState: PS, context: SubworkflowContext) => Partial<CS>;
|
|
38
|
+
/**
|
|
39
|
+
* Map child result back to parent state
|
|
40
|
+
*/
|
|
41
|
+
outputMapper: (childResult: WorkflowResult<CS>, parentState: PS, context: SubworkflowContext) => PS;
|
|
42
|
+
/**
|
|
43
|
+
* Error handling strategy
|
|
44
|
+
* @default 'propagate'
|
|
45
|
+
*/
|
|
46
|
+
onError?: SubworkflowErrorStrategy;
|
|
47
|
+
/**
|
|
48
|
+
* Retry config when onError is 'retry'
|
|
49
|
+
*/
|
|
50
|
+
retryConfig?: SubworkflowRetryConfig;
|
|
51
|
+
/**
|
|
52
|
+
* Maximum nesting depth
|
|
53
|
+
* @default 10
|
|
54
|
+
*/
|
|
55
|
+
maxDepth?: number;
|
|
56
|
+
/**
|
|
57
|
+
* Timeout for subworkflow execution (ms)
|
|
58
|
+
*/
|
|
59
|
+
timeout?: number;
|
|
60
|
+
/**
|
|
61
|
+
* Share checkpoint store with parent
|
|
62
|
+
* @default true
|
|
63
|
+
*/
|
|
64
|
+
shareCheckpoints?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Called before subworkflow starts
|
|
67
|
+
*/
|
|
68
|
+
onStart?: (childState: Partial<CS>, context: SubworkflowContext) => void;
|
|
69
|
+
/**
|
|
70
|
+
* Called after subworkflow completes
|
|
71
|
+
*/
|
|
72
|
+
onComplete?: (result: WorkflowResult<CS>, context: SubworkflowContext) => void;
|
|
73
|
+
/**
|
|
74
|
+
* Called on subworkflow error
|
|
75
|
+
*/
|
|
76
|
+
onChildError?: (error: Error, context: SubworkflowContext) => void;
|
|
77
|
+
/**
|
|
78
|
+
* Condition to run subworkflow
|
|
79
|
+
*/
|
|
80
|
+
condition?: (parentState: PS, context: SubworkflowContext) => boolean;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Subworkflow execution context
|
|
84
|
+
*/
|
|
85
|
+
export interface SubworkflowContext {
|
|
86
|
+
cogitator: Cogitator;
|
|
87
|
+
parentWorkflowId: string;
|
|
88
|
+
parentRunId: string;
|
|
89
|
+
parentNodeId: string;
|
|
90
|
+
depth: number;
|
|
91
|
+
checkpointStore?: CheckpointStore;
|
|
92
|
+
metadata?: Record<string, unknown>;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Subworkflow result
|
|
96
|
+
*/
|
|
97
|
+
export interface SubworkflowResult<PS extends WorkflowState, CS extends WorkflowState> {
|
|
98
|
+
success: boolean;
|
|
99
|
+
parentState: PS;
|
|
100
|
+
childResult?: WorkflowResult<CS>;
|
|
101
|
+
error?: Error;
|
|
102
|
+
skipped: boolean;
|
|
103
|
+
duration: number;
|
|
104
|
+
depth: number;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Error thrown when max depth is exceeded
|
|
108
|
+
*/
|
|
109
|
+
export declare class MaxDepthExceededError extends Error {
|
|
110
|
+
readonly depth: number;
|
|
111
|
+
readonly maxDepth: number;
|
|
112
|
+
constructor(depth: number, maxDepth: number);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Execute a subworkflow
|
|
116
|
+
*/
|
|
117
|
+
export declare function executeSubworkflow<PS extends WorkflowState, CS extends WorkflowState>(parentState: PS, config: SubworkflowConfig<PS, CS>, context: SubworkflowContext): Promise<SubworkflowResult<PS, CS>>;
|
|
118
|
+
/**
|
|
119
|
+
* Create a subworkflow node factory
|
|
120
|
+
*/
|
|
121
|
+
export declare function subworkflowNode<PS extends WorkflowState, CS extends WorkflowState>(name: string, config: Omit<SubworkflowConfig<PS, CS>, 'name'>): SubworkflowConfig<PS, CS>;
|
|
122
|
+
/**
|
|
123
|
+
* Create a simple subworkflow that just passes state through
|
|
124
|
+
*/
|
|
125
|
+
export declare function simpleSubworkflow<S extends WorkflowState>(name: string, workflow: Workflow<S>, options?: Partial<Omit<SubworkflowConfig<S, S>, 'name' | 'workflow' | 'inputMapper' | 'outputMapper'>>): SubworkflowConfig<S, S>;
|
|
126
|
+
/**
|
|
127
|
+
* Create a subworkflow that extracts a subset of parent state
|
|
128
|
+
*/
|
|
129
|
+
export declare function nestedSubworkflow<PS extends WorkflowState, K extends keyof PS, CS extends WorkflowState = PS[K] extends WorkflowState ? PS[K] : never>(name: string, workflow: Workflow<CS>, stateKey: K, options?: Partial<Omit<SubworkflowConfig<PS, CS>, 'name' | 'workflow' | 'inputMapper' | 'outputMapper'>>): SubworkflowConfig<PS, CS>;
|
|
130
|
+
/**
|
|
131
|
+
* Create a conditional subworkflow
|
|
132
|
+
*/
|
|
133
|
+
export declare function conditionalSubworkflow<PS extends WorkflowState, CS extends WorkflowState>(name: string, config: Omit<SubworkflowConfig<PS, CS>, 'name'> & {
|
|
134
|
+
condition: (state: PS) => boolean;
|
|
135
|
+
}): SubworkflowConfig<PS, CS>;
|
|
136
|
+
//# sourceMappingURL=subworkflow-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subworkflow-node.d.ts","sourceRoot":"","sources":["../../src/subworkflows/subworkflow-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subworkflow node implementation
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - State mapping parent ↔ child
|
|
6
|
+
* - Error propagation strategies
|
|
7
|
+
* - Recursive workflows with depth limits
|
|
8
|
+
* - Shared checkpoints
|
|
9
|
+
* - Timeout support
|
|
10
|
+
*/
|
|
11
|
+
import { WorkflowExecutor } from '../executor';
|
|
12
|
+
/**
|
|
13
|
+
* Error thrown when max depth is exceeded
|
|
14
|
+
*/
|
|
15
|
+
export class MaxDepthExceededError extends Error {
|
|
16
|
+
depth;
|
|
17
|
+
maxDepth;
|
|
18
|
+
constructor(depth, maxDepth) {
|
|
19
|
+
super(`Maximum subworkflow depth exceeded: ${depth} > ${maxDepth}`);
|
|
20
|
+
this.name = 'MaxDepthExceededError';
|
|
21
|
+
this.depth = depth;
|
|
22
|
+
this.maxDepth = maxDepth;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Execute a subworkflow
|
|
27
|
+
*/
|
|
28
|
+
export async function executeSubworkflow(parentState, config, context) {
|
|
29
|
+
const startTime = Date.now();
|
|
30
|
+
const maxDepth = config.maxDepth ?? 10;
|
|
31
|
+
if (context.depth > maxDepth) {
|
|
32
|
+
throw new MaxDepthExceededError(context.depth, maxDepth);
|
|
33
|
+
}
|
|
34
|
+
if (config.condition && !config.condition(parentState, context)) {
|
|
35
|
+
return {
|
|
36
|
+
success: true,
|
|
37
|
+
parentState,
|
|
38
|
+
skipped: true,
|
|
39
|
+
duration: Date.now() - startTime,
|
|
40
|
+
depth: context.depth,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const childInput = config.inputMapper(parentState, context);
|
|
44
|
+
config.onStart?.(childInput, context);
|
|
45
|
+
const executor = new WorkflowExecutor(context.cogitator, config.shareCheckpoints !== false ? context.checkpointStore : undefined);
|
|
46
|
+
const executeOptions = {
|
|
47
|
+
checkpoint: config.shareCheckpoints !== false && !!context.checkpointStore,
|
|
48
|
+
metadata: {
|
|
49
|
+
...context.metadata,
|
|
50
|
+
parentWorkflowId: context.parentWorkflowId,
|
|
51
|
+
parentRunId: context.parentRunId,
|
|
52
|
+
parentNodeId: context.parentNodeId,
|
|
53
|
+
depth: context.depth,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
let lastError;
|
|
57
|
+
let childResult;
|
|
58
|
+
const maxAttempts = config.onError === 'retry' && config.retryConfig
|
|
59
|
+
? config.retryConfig.maxAttempts
|
|
60
|
+
: 1;
|
|
61
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
62
|
+
try {
|
|
63
|
+
const executePromise = executor.execute(config.workflow, childInput, executeOptions);
|
|
64
|
+
if (config.timeout) {
|
|
65
|
+
childResult = await Promise.race([
|
|
66
|
+
executePromise,
|
|
67
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Subworkflow timeout exceeded')), config.timeout)),
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
childResult = await executePromise;
|
|
72
|
+
}
|
|
73
|
+
config.onComplete?.(childResult, context);
|
|
74
|
+
const newParentState = config.outputMapper(childResult, parentState, context);
|
|
75
|
+
return {
|
|
76
|
+
success: true,
|
|
77
|
+
parentState: newParentState,
|
|
78
|
+
childResult,
|
|
79
|
+
skipped: false,
|
|
80
|
+
duration: Date.now() - startTime,
|
|
81
|
+
depth: context.depth,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
86
|
+
config.onChildError?.(lastError, context);
|
|
87
|
+
if (attempt < maxAttempts - 1 && config.retryConfig) {
|
|
88
|
+
const delay = config.retryConfig.delay ?? 1000;
|
|
89
|
+
const actualDelay = config.retryConfig.backoff === 'exponential'
|
|
90
|
+
? delay * Math.pow(2, attempt)
|
|
91
|
+
: delay * (attempt + 1);
|
|
92
|
+
await new Promise((resolve) => setTimeout(resolve, actualDelay));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
switch (config.onError) {
|
|
97
|
+
case 'ignore':
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
parentState,
|
|
101
|
+
error: lastError,
|
|
102
|
+
skipped: false,
|
|
103
|
+
duration: Date.now() - startTime,
|
|
104
|
+
depth: context.depth,
|
|
105
|
+
};
|
|
106
|
+
case 'catch':
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
parentState,
|
|
110
|
+
error: lastError,
|
|
111
|
+
skipped: false,
|
|
112
|
+
duration: Date.now() - startTime,
|
|
113
|
+
depth: context.depth,
|
|
114
|
+
};
|
|
115
|
+
case 'propagate':
|
|
116
|
+
case 'retry':
|
|
117
|
+
default:
|
|
118
|
+
throw lastError;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create a subworkflow node factory
|
|
123
|
+
*/
|
|
124
|
+
export function subworkflowNode(name, config) {
|
|
125
|
+
return { name, ...config };
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Create a simple subworkflow that just passes state through
|
|
129
|
+
*/
|
|
130
|
+
export function simpleSubworkflow(name, workflow, options = {}) {
|
|
131
|
+
return {
|
|
132
|
+
name,
|
|
133
|
+
workflow,
|
|
134
|
+
inputMapper: (state) => state,
|
|
135
|
+
outputMapper: (result) => result.state,
|
|
136
|
+
...options,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a subworkflow that extracts a subset of parent state
|
|
141
|
+
*/
|
|
142
|
+
export function nestedSubworkflow(name, workflow, stateKey, options = {}) {
|
|
143
|
+
return {
|
|
144
|
+
name,
|
|
145
|
+
workflow,
|
|
146
|
+
inputMapper: (state) => state[stateKey],
|
|
147
|
+
outputMapper: (result, parentState) => ({
|
|
148
|
+
...parentState,
|
|
149
|
+
[stateKey]: result.state,
|
|
150
|
+
}),
|
|
151
|
+
...options,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Create a conditional subworkflow
|
|
156
|
+
*/
|
|
157
|
+
export function conditionalSubworkflow(name, config) {
|
|
158
|
+
return {
|
|
159
|
+
...config,
|
|
160
|
+
name,
|
|
161
|
+
condition: (state) => config.condition(state),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=subworkflow-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subworkflow-node.js","sourceRoot":"","sources":["../../src/subworkflows/subworkflow-node.ts"],"names":[],"mappings":"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"}
|