@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.
Files changed (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -0
  3. package/dist/builder.d.ts +39 -0
  4. package/dist/builder.d.ts.map +1 -0
  5. package/dist/builder.js +224 -0
  6. package/dist/builder.js.map +1 -0
  7. package/dist/checkpoint.d.ts +33 -0
  8. package/dist/checkpoint.d.ts.map +1 -0
  9. package/dist/checkpoint.js +108 -0
  10. package/dist/checkpoint.js.map +1 -0
  11. package/dist/executor.d.ts +24 -0
  12. package/dist/executor.d.ts.map +1 -0
  13. package/dist/executor.js +207 -0
  14. package/dist/executor.js.map +1 -0
  15. package/dist/human/approval-store.d.ts +95 -0
  16. package/dist/human/approval-store.d.ts.map +1 -0
  17. package/dist/human/approval-store.js +377 -0
  18. package/dist/human/approval-store.js.map +1 -0
  19. package/dist/human/human-node.d.ts +104 -0
  20. package/dist/human/human-node.d.ts.map +1 -0
  21. package/dist/human/human-node.js +342 -0
  22. package/dist/human/human-node.js.map +1 -0
  23. package/dist/human/index.d.ts +17 -0
  24. package/dist/human/index.d.ts.map +1 -0
  25. package/dist/human/index.js +17 -0
  26. package/dist/human/index.js.map +1 -0
  27. package/dist/human/notifiers.d.ts +85 -0
  28. package/dist/human/notifiers.d.ts.map +1 -0
  29. package/dist/human/notifiers.js +289 -0
  30. package/dist/human/notifiers.js.map +1 -0
  31. package/dist/index.d.ts +32 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +19 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/manager/index.d.ts +19 -0
  36. package/dist/manager/index.d.ts.map +1 -0
  37. package/dist/manager/index.js +17 -0
  38. package/dist/manager/index.js.map +1 -0
  39. package/dist/manager/run-store.d.ts +78 -0
  40. package/dist/manager/run-store.d.ts.map +1 -0
  41. package/dist/manager/run-store.js +390 -0
  42. package/dist/manager/run-store.js.map +1 -0
  43. package/dist/manager/scheduler.d.ts +159 -0
  44. package/dist/manager/scheduler.d.ts.map +1 -0
  45. package/dist/manager/scheduler.js +355 -0
  46. package/dist/manager/scheduler.js.map +1 -0
  47. package/dist/manager/workflow-manager.d.ts +114 -0
  48. package/dist/manager/workflow-manager.d.ts.map +1 -0
  49. package/dist/manager/workflow-manager.js +460 -0
  50. package/dist/manager/workflow-manager.js.map +1 -0
  51. package/dist/nodes/agent.d.ts +24 -0
  52. package/dist/nodes/agent.d.ts.map +1 -0
  53. package/dist/nodes/agent.js +37 -0
  54. package/dist/nodes/agent.js.map +1 -0
  55. package/dist/nodes/base.d.ts +12 -0
  56. package/dist/nodes/base.d.ts.map +1 -0
  57. package/dist/nodes/base.js +5 -0
  58. package/dist/nodes/base.js.map +1 -0
  59. package/dist/nodes/function.d.ts +27 -0
  60. package/dist/nodes/function.d.ts.map +1 -0
  61. package/dist/nodes/function.js +29 -0
  62. package/dist/nodes/function.js.map +1 -0
  63. package/dist/nodes/index.d.ts +8 -0
  64. package/dist/nodes/index.d.ts.map +1 -0
  65. package/dist/nodes/index.js +8 -0
  66. package/dist/nodes/index.js.map +1 -0
  67. package/dist/nodes/tool.d.ts +19 -0
  68. package/dist/nodes/tool.d.ts.map +1 -0
  69. package/dist/nodes/tool.js +26 -0
  70. package/dist/nodes/tool.js.map +1 -0
  71. package/dist/observability/exporters.d.ts +93 -0
  72. package/dist/observability/exporters.d.ts.map +1 -0
  73. package/dist/observability/exporters.js +330 -0
  74. package/dist/observability/exporters.js.map +1 -0
  75. package/dist/observability/index.d.ts +17 -0
  76. package/dist/observability/index.d.ts.map +1 -0
  77. package/dist/observability/index.js +17 -0
  78. package/dist/observability/index.js.map +1 -0
  79. package/dist/observability/metrics.d.ts +114 -0
  80. package/dist/observability/metrics.d.ts.map +1 -0
  81. package/dist/observability/metrics.js +435 -0
  82. package/dist/observability/metrics.js.map +1 -0
  83. package/dist/observability/span-attributes.d.ts +95 -0
  84. package/dist/observability/span-attributes.d.ts.map +1 -0
  85. package/dist/observability/span-attributes.js +142 -0
  86. package/dist/observability/span-attributes.js.map +1 -0
  87. package/dist/observability/tracer.d.ts +110 -0
  88. package/dist/observability/tracer.d.ts.map +1 -0
  89. package/dist/observability/tracer.js +409 -0
  90. package/dist/observability/tracer.js.map +1 -0
  91. package/dist/patterns/index.d.ts +15 -0
  92. package/dist/patterns/index.d.ts.map +1 -0
  93. package/dist/patterns/index.js +15 -0
  94. package/dist/patterns/index.js.map +1 -0
  95. package/dist/patterns/map-reduce.d.ts +223 -0
  96. package/dist/patterns/map-reduce.d.ts.map +1 -0
  97. package/dist/patterns/map-reduce.js +378 -0
  98. package/dist/patterns/map-reduce.js.map +1 -0
  99. package/dist/saga/circuit-breaker.d.ts +153 -0
  100. package/dist/saga/circuit-breaker.d.ts.map +1 -0
  101. package/dist/saga/circuit-breaker.js +306 -0
  102. package/dist/saga/circuit-breaker.js.map +1 -0
  103. package/dist/saga/compensation.d.ts +134 -0
  104. package/dist/saga/compensation.d.ts.map +1 -0
  105. package/dist/saga/compensation.js +240 -0
  106. package/dist/saga/compensation.js.map +1 -0
  107. package/dist/saga/dead-letter.d.ts +113 -0
  108. package/dist/saga/dead-letter.d.ts.map +1 -0
  109. package/dist/saga/dead-letter.js +307 -0
  110. package/dist/saga/dead-letter.js.map +1 -0
  111. package/dist/saga/idempotency.d.ts +95 -0
  112. package/dist/saga/idempotency.d.ts.map +1 -0
  113. package/dist/saga/idempotency.js +266 -0
  114. package/dist/saga/idempotency.js.map +1 -0
  115. package/dist/saga/index.d.ts +16 -0
  116. package/dist/saga/index.d.ts.map +1 -0
  117. package/dist/saga/index.js +16 -0
  118. package/dist/saga/index.js.map +1 -0
  119. package/dist/saga/retry.d.ts +59 -0
  120. package/dist/saga/retry.d.ts.map +1 -0
  121. package/dist/saga/retry.js +222 -0
  122. package/dist/saga/retry.js.map +1 -0
  123. package/dist/scheduler.d.ts +37 -0
  124. package/dist/scheduler.d.ts.map +1 -0
  125. package/dist/scheduler.js +151 -0
  126. package/dist/scheduler.js.map +1 -0
  127. package/dist/subworkflows/index.d.ts +16 -0
  128. package/dist/subworkflows/index.d.ts.map +1 -0
  129. package/dist/subworkflows/index.js +16 -0
  130. package/dist/subworkflows/index.js.map +1 -0
  131. package/dist/subworkflows/parallel-subworkflows.d.ts +139 -0
  132. package/dist/subworkflows/parallel-subworkflows.d.ts.map +1 -0
  133. package/dist/subworkflows/parallel-subworkflows.js +270 -0
  134. package/dist/subworkflows/parallel-subworkflows.js.map +1 -0
  135. package/dist/subworkflows/subworkflow-node.d.ts +136 -0
  136. package/dist/subworkflows/subworkflow-node.d.ts.map +1 -0
  137. package/dist/subworkflows/subworkflow-node.js +164 -0
  138. package/dist/subworkflows/subworkflow-node.js.map +1 -0
  139. package/dist/timers/cron-parser.d.ts +110 -0
  140. package/dist/timers/cron-parser.d.ts.map +1 -0
  141. package/dist/timers/cron-parser.js +412 -0
  142. package/dist/timers/cron-parser.js.map +1 -0
  143. package/dist/timers/index.d.ts +18 -0
  144. package/dist/timers/index.d.ts.map +1 -0
  145. package/dist/timers/index.js +18 -0
  146. package/dist/timers/index.js.map +1 -0
  147. package/dist/timers/timer-manager.d.ts +219 -0
  148. package/dist/timers/timer-manager.d.ts.map +1 -0
  149. package/dist/timers/timer-manager.js +351 -0
  150. package/dist/timers/timer-manager.js.map +1 -0
  151. package/dist/timers/timer-node.d.ts +144 -0
  152. package/dist/timers/timer-node.d.ts.map +1 -0
  153. package/dist/timers/timer-node.js +246 -0
  154. package/dist/timers/timer-node.js.map +1 -0
  155. package/dist/timers/timer-store.d.ts +90 -0
  156. package/dist/timers/timer-store.d.ts.map +1 -0
  157. package/dist/timers/timer-store.js +357 -0
  158. package/dist/timers/timer-store.js.map +1 -0
  159. package/dist/triggers/cron-trigger.d.ts +102 -0
  160. package/dist/triggers/cron-trigger.d.ts.map +1 -0
  161. package/dist/triggers/cron-trigger.js +309 -0
  162. package/dist/triggers/cron-trigger.js.map +1 -0
  163. package/dist/triggers/index.d.ts +14 -0
  164. package/dist/triggers/index.d.ts.map +1 -0
  165. package/dist/triggers/index.js +10 -0
  166. package/dist/triggers/index.js.map +1 -0
  167. package/dist/triggers/rate-limiter.d.ts +130 -0
  168. package/dist/triggers/rate-limiter.d.ts.map +1 -0
  169. package/dist/triggers/rate-limiter.js +294 -0
  170. package/dist/triggers/rate-limiter.js.map +1 -0
  171. package/dist/triggers/trigger-manager.d.ts +166 -0
  172. package/dist/triggers/trigger-manager.d.ts.map +1 -0
  173. package/dist/triggers/trigger-manager.js +436 -0
  174. package/dist/triggers/trigger-manager.js.map +1 -0
  175. package/dist/triggers/webhook-trigger.d.ts +150 -0
  176. package/dist/triggers/webhook-trigger.d.ts.map +1 -0
  177. package/dist/triggers/webhook-trigger.js +452 -0
  178. package/dist/triggers/webhook-trigger.js.map +1 -0
  179. 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":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EACL,kBAAkB,GAKnB,MAAM,oBAAoB,CAAC;AAyG5B;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,KAAkD,EAClD,WAAmB,EACnB,eAAwB,EACxB,UAA2D;IAE3D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IACjE,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;QAC5C,IAAI,aAAa;YAAE,OAAO;QAE1B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO;QAElC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACjC,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,aAAa,GAAG,IAAI,CAAC;gBACrB,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,SAAc,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,WAAW,EAAE,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;IACT,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,WAAc,EACd,MAAqC,EACrC,OAA2B;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,WAAW,GACf,OAAO,MAAM,CAAC,YAAY,KAAK,UAAU;QACvC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC;QAClC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;IAE1B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;IACnD,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IAEvC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,CAAC,UAAU,CAAC;gBAChB,KAAK,EAAE,WAAW,CAAC,MAAM;gBACzB,SAAS;gBACT,UAAU;gBACV,MAAM;gBACN,OAAO,EAAE,WAAW,CAAC,MAAM,GAAG,SAAS;gBACvC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,YAAY,EAAE,CAAC;IAEf,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/C,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,KAAK,IAAkD,EAAE;YAChE,MAAM,SAAS,GAAG;gBAChB,GAAG,GAAG,CAAC,MAAM;gBACb,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;gBAC7C,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ;gBACzC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB;aACzE,CAAC;YAEF,MAAM,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAE/C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,WAAW,EACX,SAAS,EACT;gBACE,GAAG,OAAO;gBACV,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC;aACzB,CACF,CAAC;YAEF,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAC7C,cAAc,EACd,WAAW,EACX,eAAe,EACf,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QACpB,SAAS,EAAE,CAAC;QACZ,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,UAAU,EAAE,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC;YACX,CAAC;YACD,MAAM,CAAC,qBAAqB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;QACD,YAAY,EAAE,CAAC;IACjB,CAAC,CACF,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+C,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QACjD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACxB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,IAAI,eAAe,CAAC;IAEvD,MAAM,cAAc,GAAG,cAAc;QACnC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC;QACzC,CAAC,CAAC,WAAW,CAAC;IAEhB,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,cAAc;QAC3B,OAAO;QACP,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;QAChC,KAAK,EAAE;YACL,KAAK,EAAE,WAAW,CAAC,MAAM;YACzB,UAAU;YACV,MAAM;YACN,OAAO;SACR;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,MAAmD;IAEnD,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,MAMC;IAED,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CACtB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9C,EAAE;YACF,MAAM,EAAE;gBACN,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAA8C;gBAC/D,WAAW,EAAE,GAAG,EAAE,CAAC,KAA+B;gBAClD,YAAY,EAAE,CAAC,OAAsC,EAAE,WAAc,EAAE,EAAE,CAAC,WAAW;aACtF;SACF,CAAC,CAAC;QACL,UAAU,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,eAAe,GAAG,IAAI,GAAG,EAA8B,CAAC;YAC9D,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACnC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACvB,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,WAAiC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAMC;IAED,MAAM,YAAY,GAA+C,EAAE,CAAC;IAEpE,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAC9C,YAAY,CAAC,IAAI,CAAC;YAChB,EAAE;YACF,MAAM,EAAE;gBACN,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE;gBACrB,QAAQ,EAAE,QAA8C;gBACxD,WAAW,EAAE,CAAC,KAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAA2B;gBAClF,YAAY,EAAE,CAAC,OAAsC,EAAE,WAAc,EAAE,EAAE,CAAC,WAAW;gBACrF,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI;QACJ,YAAY;QACZ,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,eAAe,GAAG,IAAI,GAAG,EAA8B,CAAC;YAC9D,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACnC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACvB,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,WAAiC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAIpC,WAAe,EACf,YAAyC,EACzC,OAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;IAE9B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACjD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE;YAC3D,GAAG,OAAO;YACV,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC;SACzB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtC,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAIxC,WAAe,EACf,YAAyC,EACzC,OAA2B;IAE3B,IAAI,UAAiD,CAAC;IACtD,IAAI,SAA4B,CAAC;IAEjC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE;gBAC3D,GAAG,OAAO;gBACV,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC;aACzB,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACnE,CAAC"}
@@ -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":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EAEb,cAAc,EACd,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAChC,WAAW,GACX,OAAO,GACP,OAAO,GACP,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,EAAE,SAAS,aAAa,EAAE,EAAE,SAAS,aAAa;IACnF,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvB;;OAEG;IACH,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;IAE3E;;OAEG;IACH,YAAY,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,kBAAkB,KAAK,EAAE,CAAC;IAEpG;;;OAGG;IACH,OAAO,CAAC,EAAE,wBAAwB,CAAC;IAEnC;;OAEG;IACH,WAAW,CAAC,EAAE,sBAAsB,CAAC;IAErC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAEzE;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAE/E;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAEnE;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC;CACvE;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,EAAE,SAAS,aAAa,EAAE,EAAE,SAAS,aAAa;IACnF,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAM5C;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,SAAS,aAAa,EACxB,EAAE,SAAS,aAAa,EAExB,WAAW,EAAE,EAAE,EACf,MAAM,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,EACjC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAoHpC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,SAAS,aAAa,EACxB,EAAE,SAAS,aAAa,EAExB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,GAC9C,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAE3B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,aAAa,EACvD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,CAAC,CAAM,GACzG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAQzB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,SAAS,aAAa,EACxB,CAAC,SAAS,MAAM,EAAE,EAClB,EAAE,SAAS,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAEtE,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,EACtB,QAAQ,EAAE,CAAC,EACX,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,CAAC,CAAM,GAC3G,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAW3B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,SAAS,aAAa,EACxB,EAAE,SAAS,aAAa,EAExB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG;IAChD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,OAAO,CAAC;CACnC,GACA,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAM3B"}
@@ -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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"}