@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,222 @@
1
+ /**
2
+ * Retry module with exponential backoff and jitter
3
+ *
4
+ * Features:
5
+ * - Configurable backoff strategies (constant, linear, exponential)
6
+ * - Jitter to prevent thundering herd
7
+ * - Retryable error detection
8
+ * - Per-attempt hooks for logging/metrics
9
+ */
10
+ const DEFAULT_MAX_RETRIES = 3;
11
+ const DEFAULT_INITIAL_DELAY = 1000;
12
+ const DEFAULT_MAX_DELAY = 30000;
13
+ const DEFAULT_BACKOFF = 'exponential';
14
+ const DEFAULT_MULTIPLIER = 2;
15
+ const DEFAULT_JITTER = 0.1;
16
+ /**
17
+ * Default retryable error checker - retries on network/timeout errors
18
+ */
19
+ function defaultIsRetryable(error) {
20
+ const retryableErrors = [
21
+ 'ECONNRESET',
22
+ 'ECONNREFUSED',
23
+ 'ETIMEDOUT',
24
+ 'ENOTFOUND',
25
+ 'ENETUNREACH',
26
+ 'EAI_AGAIN',
27
+ 'EPIPE',
28
+ ];
29
+ const retryableMessages = [
30
+ 'timeout',
31
+ 'network',
32
+ 'connection',
33
+ 'socket',
34
+ 'ETIMEDOUT',
35
+ 'rate limit',
36
+ '429',
37
+ '500',
38
+ '502',
39
+ '503',
40
+ '504',
41
+ ];
42
+ const errorCode = error.code;
43
+ if (errorCode && retryableErrors.includes(errorCode)) {
44
+ return true;
45
+ }
46
+ const message = error.message.toLowerCase();
47
+ return retryableMessages.some((m) => message.includes(m.toLowerCase()));
48
+ }
49
+ /**
50
+ * Calculate delay with jitter
51
+ */
52
+ function calculateDelay(attempt, config) {
53
+ let baseDelay;
54
+ switch (config.backoff) {
55
+ case 'constant':
56
+ baseDelay = config.initialDelay;
57
+ break;
58
+ case 'linear':
59
+ baseDelay = config.initialDelay * attempt;
60
+ break;
61
+ case 'exponential':
62
+ default:
63
+ baseDelay = config.initialDelay * Math.pow(config.multiplier, attempt - 1);
64
+ break;
65
+ }
66
+ baseDelay = Math.min(baseDelay, config.maxDelay);
67
+ const jitterRange = baseDelay * config.jitter;
68
+ const jitter = (Math.random() * 2 - 1) * jitterRange;
69
+ return Math.max(0, Math.round(baseDelay + jitter));
70
+ }
71
+ /**
72
+ * Sleep for specified milliseconds
73
+ */
74
+ function sleep(ms) {
75
+ return new Promise((resolve) => setTimeout(resolve, ms));
76
+ }
77
+ /**
78
+ * Execute function with retry logic
79
+ */
80
+ export async function executeWithRetry(fn, options = {}) {
81
+ const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
82
+ const backoff = options.backoff ?? DEFAULT_BACKOFF;
83
+ const initialDelay = options.initialDelay ?? DEFAULT_INITIAL_DELAY;
84
+ const maxDelay = options.maxDelay ?? DEFAULT_MAX_DELAY;
85
+ const multiplier = options.multiplier ?? DEFAULT_MULTIPLIER;
86
+ const jitter = options.jitter ?? DEFAULT_JITTER;
87
+ const isRetryable = options.isRetryable ?? defaultIsRetryable;
88
+ const delays = [];
89
+ const startTime = Date.now();
90
+ let lastError;
91
+ for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
92
+ if (options.abortSignal?.aborted) {
93
+ return {
94
+ success: false,
95
+ error: new Error('Retry aborted'),
96
+ attempts: attempt - 1,
97
+ totalDuration: Date.now() - startTime,
98
+ delays,
99
+ };
100
+ }
101
+ const attemptStart = Date.now();
102
+ try {
103
+ const attemptInfo = {
104
+ attempt,
105
+ maxAttempts: maxRetries + 1,
106
+ delay: 0,
107
+ startTime: attemptStart,
108
+ duration: 0,
109
+ };
110
+ options.onAttempt?.(attemptInfo);
111
+ const result = await fn(attempt);
112
+ const duration = Date.now() - attemptStart;
113
+ options.onSuccess?.(result, { ...attemptInfo, duration });
114
+ return {
115
+ success: true,
116
+ result,
117
+ attempts: attempt,
118
+ totalDuration: Date.now() - startTime,
119
+ delays,
120
+ };
121
+ }
122
+ catch (error) {
123
+ lastError = error instanceof Error ? error : new Error(String(error));
124
+ const duration = Date.now() - attemptStart;
125
+ const canRetry = attempt <= maxRetries && isRetryable(lastError);
126
+ if (!canRetry) {
127
+ const attemptInfo = {
128
+ attempt,
129
+ maxAttempts: maxRetries + 1,
130
+ delay: 0,
131
+ error: lastError,
132
+ startTime: attemptStart,
133
+ duration,
134
+ };
135
+ options.onFailure?.(lastError, attemptInfo);
136
+ break;
137
+ }
138
+ const delay = calculateDelay(attempt, {
139
+ backoff,
140
+ initialDelay,
141
+ maxDelay,
142
+ multiplier,
143
+ jitter,
144
+ });
145
+ delays.push(delay);
146
+ const attemptInfo = {
147
+ attempt,
148
+ maxAttempts: maxRetries + 1,
149
+ delay,
150
+ error: lastError,
151
+ startTime: attemptStart,
152
+ duration,
153
+ };
154
+ options.onRetry?.(attemptInfo);
155
+ await sleep(delay);
156
+ }
157
+ }
158
+ return {
159
+ success: false,
160
+ error: lastError,
161
+ attempts: delays.length + 1,
162
+ totalDuration: Date.now() - startTime,
163
+ delays,
164
+ };
165
+ }
166
+ /**
167
+ * Create a retryable version of a function
168
+ */
169
+ export function withRetry(fn, options = {}) {
170
+ return async (...args) => {
171
+ const result = await executeWithRetry(() => fn(...args), options);
172
+ if (!result.success) {
173
+ throw result.error ?? new Error('Retry failed');
174
+ }
175
+ return result.result;
176
+ };
177
+ }
178
+ /**
179
+ * Decorator for retryable class methods
180
+ */
181
+ export function Retryable(options = {}) {
182
+ return function (_target, _propertyKey, descriptor) {
183
+ const originalMethod = descriptor.value;
184
+ descriptor.value = async function (...args) {
185
+ const result = await executeWithRetry(() => originalMethod.apply(this, args), options);
186
+ if (!result.success) {
187
+ throw result.error ?? new Error('Retry failed');
188
+ }
189
+ return result.result;
190
+ };
191
+ return descriptor;
192
+ };
193
+ }
194
+ /**
195
+ * Calculate total expected retry time (for timeout estimation)
196
+ */
197
+ export function estimateRetryDuration(config = {}) {
198
+ const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;
199
+ const backoff = config.backoff ?? DEFAULT_BACKOFF;
200
+ const initialDelay = config.initialDelay ?? DEFAULT_INITIAL_DELAY;
201
+ const maxDelay = config.maxDelay ?? DEFAULT_MAX_DELAY;
202
+ const multiplier = config.multiplier ?? DEFAULT_MULTIPLIER;
203
+ let total = 0;
204
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
205
+ let delay;
206
+ switch (backoff) {
207
+ case 'constant':
208
+ delay = initialDelay;
209
+ break;
210
+ case 'linear':
211
+ delay = initialDelay * attempt;
212
+ break;
213
+ case 'exponential':
214
+ default:
215
+ delay = initialDelay * Math.pow(multiplier, attempt - 1);
216
+ break;
217
+ }
218
+ total += Math.min(delay, maxDelay);
219
+ }
220
+ return total;
221
+ }
222
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/saga/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * WorkflowScheduler - Manages DAG execution order and parallel scheduling
3
+ */
4
+ import type { Workflow, WorkflowState } from '@cogitator-ai/types';
5
+ interface DependencyGraph {
6
+ dependencies: Map<string, Set<string>>;
7
+ dependents: Map<string, Set<string>>;
8
+ }
9
+ export declare class WorkflowScheduler {
10
+ /**
11
+ * Build dependency graph from workflow edges
12
+ */
13
+ buildDependencyGraph<S extends WorkflowState>(workflow: Workflow<S>): DependencyGraph;
14
+ /**
15
+ * Get nodes ready to execute (all dependencies completed)
16
+ */
17
+ getReadyNodes(graph: DependencyGraph, completed: Set<string>, pending: Set<string>): string[];
18
+ /**
19
+ * Get topological order of nodes (grouped by execution level)
20
+ * Returns array of arrays, where each inner array can be executed in parallel
21
+ */
22
+ getExecutionLevels<S extends WorkflowState>(workflow: Workflow<S>): string[][];
23
+ /**
24
+ * Find the next node(s) to execute based on current state and edge conditions
25
+ */
26
+ getNextNodes<S extends WorkflowState>(workflow: Workflow<S>, currentNode: string, state: S): string[];
27
+ /**
28
+ * Run multiple async tasks with concurrency limit
29
+ */
30
+ runWithConcurrency<T>(tasks: (() => Promise<T>)[], maxConcurrency: number): Promise<T[]>;
31
+ /**
32
+ * Simpler parallel execution with Promise.all and concurrency via chunking
33
+ */
34
+ runParallel<T>(tasks: (() => Promise<T>)[], maxConcurrency: number): Promise<T[]>;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,UAAU,eAAe;IACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACtC;AAED,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,oBAAoB,CAAC,CAAC,SAAS,aAAa,EAC1C,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GACpB,eAAe;IAwBlB;;OAEG;IACH,aAAa,CACX,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EACtB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GACnB,MAAM,EAAE;IAuBX;;;OAGG;IACH,kBAAkB,CAAC,CAAC,SAAS,aAAa,EACxC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GACpB,MAAM,EAAE,EAAE;IA0Bb;;OAEG;IACH,YAAY,CAAC,CAAC,SAAS,aAAa,EAClC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,GACP,MAAM,EAAE;IAgCX;;OAEG;IACG,kBAAkB,CAAC,CAAC,EACxB,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAC3B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,CAAC,EAAE,CAAC;IAgCf;;OAEG;IACG,WAAW,CAAC,CAAC,EACjB,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAC3B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,CAAC,EAAE,CAAC;CAWhB"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * WorkflowScheduler - Manages DAG execution order and parallel scheduling
3
+ */
4
+ export class WorkflowScheduler {
5
+ /**
6
+ * Build dependency graph from workflow edges
7
+ */
8
+ buildDependencyGraph(workflow) {
9
+ const dependencies = new Map();
10
+ const dependents = new Map();
11
+ for (const nodeName of workflow.nodes.keys()) {
12
+ dependencies.set(nodeName, new Set());
13
+ dependents.set(nodeName, new Set());
14
+ }
15
+ for (const edge of workflow.edges) {
16
+ if (edge.type === 'sequential') {
17
+ dependencies.get(edge.to)?.add(edge.from);
18
+ dependents.get(edge.from)?.add(edge.to);
19
+ }
20
+ else if (edge.type === 'parallel') {
21
+ for (const to of edge.to) {
22
+ dependencies.get(to)?.add(edge.from);
23
+ dependents.get(edge.from)?.add(to);
24
+ }
25
+ }
26
+ }
27
+ return { dependencies, dependents };
28
+ }
29
+ /**
30
+ * Get nodes ready to execute (all dependencies completed)
31
+ */
32
+ getReadyNodes(graph, completed, pending) {
33
+ const ready = [];
34
+ for (const nodeName of pending) {
35
+ const deps = graph.dependencies.get(nodeName);
36
+ if (!deps)
37
+ continue;
38
+ let allDepsCompleted = true;
39
+ for (const dep of deps) {
40
+ if (!completed.has(dep)) {
41
+ allDepsCompleted = false;
42
+ break;
43
+ }
44
+ }
45
+ if (allDepsCompleted) {
46
+ ready.push(nodeName);
47
+ }
48
+ }
49
+ return ready;
50
+ }
51
+ /**
52
+ * Get topological order of nodes (grouped by execution level)
53
+ * Returns array of arrays, where each inner array can be executed in parallel
54
+ */
55
+ getExecutionLevels(workflow) {
56
+ const graph = this.buildDependencyGraph(workflow);
57
+ const levels = [];
58
+ const completed = new Set();
59
+ const pending = new Set(workflow.nodes.keys());
60
+ while (pending.size > 0) {
61
+ const ready = this.getReadyNodes(graph, completed, pending);
62
+ if (ready.length === 0 && pending.size > 0) {
63
+ throw new Error(`Workflow has cycles or unreachable nodes: ${Array.from(pending).join(', ')}`);
64
+ }
65
+ levels.push(ready);
66
+ for (const node of ready) {
67
+ completed.add(node);
68
+ pending.delete(node);
69
+ }
70
+ }
71
+ return levels;
72
+ }
73
+ /**
74
+ * Find the next node(s) to execute based on current state and edge conditions
75
+ */
76
+ getNextNodes(workflow, currentNode, state) {
77
+ const nextNodes = [];
78
+ for (const edge of workflow.edges) {
79
+ if (edge.from !== currentNode)
80
+ continue;
81
+ if (edge.type === 'sequential') {
82
+ nextNodes.push(edge.to);
83
+ }
84
+ else if (edge.type === 'parallel') {
85
+ nextNodes.push(...edge.to);
86
+ }
87
+ else if (edge.type === 'conditional') {
88
+ const result = edge.condition(state);
89
+ const targets = Array.isArray(result) ? result : [result];
90
+ for (const target of targets) {
91
+ if (edge.targets.includes(target)) {
92
+ nextNodes.push(target);
93
+ }
94
+ }
95
+ }
96
+ else if (edge.type === 'loop') {
97
+ const shouldLoop = edge.condition(state);
98
+ if (shouldLoop) {
99
+ nextNodes.push(edge.back);
100
+ }
101
+ else {
102
+ nextNodes.push(edge.exit);
103
+ }
104
+ }
105
+ }
106
+ return [...new Set(nextNodes)];
107
+ }
108
+ /**
109
+ * Run multiple async tasks with concurrency limit
110
+ */
111
+ async runWithConcurrency(tasks, maxConcurrency) {
112
+ const results = [];
113
+ const executing = [];
114
+ for (const task of tasks) {
115
+ const promise = task().then((result) => {
116
+ results.push(result);
117
+ });
118
+ executing.push(promise);
119
+ if (executing.length >= maxConcurrency) {
120
+ await Promise.race(executing);
121
+ const newExecuting = [];
122
+ for (const p of executing) {
123
+ const pending = await Promise.race([
124
+ p.then(() => false),
125
+ Promise.resolve(true),
126
+ ]);
127
+ if (pending) {
128
+ newExecuting.push(p);
129
+ }
130
+ }
131
+ executing.length = 0;
132
+ executing.push(...newExecuting);
133
+ }
134
+ }
135
+ await Promise.all(executing);
136
+ return results;
137
+ }
138
+ /**
139
+ * Simpler parallel execution with Promise.all and concurrency via chunking
140
+ */
141
+ async runParallel(tasks, maxConcurrency) {
142
+ const results = [];
143
+ for (let i = 0; i < tasks.length; i += maxConcurrency) {
144
+ const chunk = tasks.slice(i, i + maxConcurrency);
145
+ const chunkResults = await Promise.all(chunk.map((t) => t()));
146
+ results.push(...chunkResults);
147
+ }
148
+ return results;
149
+ }
150
+ }
151
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @cogitator-ai/workflows - Subworkflows module
3
+ *
4
+ * Enables nested and parallel workflow execution.
5
+ *
6
+ * Features:
7
+ * - Single subworkflow execution
8
+ * - Parallel subworkflows with concurrency control
9
+ * - State mapping between parent and child
10
+ * - Error handling strategies
11
+ * - Depth limits to prevent infinite recursion
12
+ * - Race and fallback patterns
13
+ */
14
+ export { type SubworkflowErrorStrategy, type SubworkflowRetryConfig, type SubworkflowConfig, type SubworkflowContext, type SubworkflowResult, MaxDepthExceededError, executeSubworkflow, subworkflowNode, simpleSubworkflow, nestedSubworkflow, conditionalSubworkflow, } from './subworkflow-node';
15
+ export { type ParallelSubworkflowDef, type ParallelSubworkflowsConfig, type ParallelProgress, type ParallelSubworkflowsResult, executeParallelSubworkflows, parallelSubworkflows, fanOutFanIn, scatterGather, raceSubworkflows, fallbackSubworkflows, } from './parallel-subworkflows';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subworkflows/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAC/B,2BAA2B,EAC3B,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @cogitator-ai/workflows - Subworkflows module
3
+ *
4
+ * Enables nested and parallel workflow execution.
5
+ *
6
+ * Features:
7
+ * - Single subworkflow execution
8
+ * - Parallel subworkflows with concurrency control
9
+ * - State mapping between parent and child
10
+ * - Error handling strategies
11
+ * - Depth limits to prevent infinite recursion
12
+ * - Race and fallback patterns
13
+ */
14
+ export { MaxDepthExceededError, executeSubworkflow, subworkflowNode, simpleSubworkflow, nestedSubworkflow, conditionalSubworkflow, } from './subworkflow-node';
15
+ export { executeParallelSubworkflows, parallelSubworkflows, fanOutFanIn, scatterGather, raceSubworkflows, fallbackSubworkflows, } from './parallel-subworkflows';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subworkflows/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAML,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAKL,2BAA2B,EAC3B,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,139 @@
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 type { Workflow, WorkflowState, WorkflowResult } from '@cogitator-ai/types';
11
+ import { type SubworkflowContext, type SubworkflowConfig, type SubworkflowResult, type SubworkflowErrorStrategy } from './subworkflow-node';
12
+ /**
13
+ * Parallel subworkflow definition
14
+ */
15
+ export interface ParallelSubworkflowDef<PS extends WorkflowState, CS extends WorkflowState> {
16
+ id: string;
17
+ config: SubworkflowConfig<PS, CS>;
18
+ }
19
+ /**
20
+ * Parallel subworkflows configuration
21
+ */
22
+ export interface ParallelSubworkflowsConfig<S extends WorkflowState> {
23
+ name: string;
24
+ /**
25
+ * Get subworkflow definitions to execute
26
+ */
27
+ subworkflows: ParallelSubworkflowDef<S, WorkflowState>[] | ((state: S) => ParallelSubworkflowDef<S, WorkflowState>[]);
28
+ /**
29
+ * Maximum concurrent subworkflows
30
+ * @default Infinity
31
+ */
32
+ concurrency?: number;
33
+ /**
34
+ * Continue if some subworkflows fail
35
+ * @default false
36
+ */
37
+ continueOnError?: boolean;
38
+ /**
39
+ * Error handling strategy for all subworkflows
40
+ */
41
+ onError?: SubworkflowErrorStrategy;
42
+ /**
43
+ * Aggregate results into parent state
44
+ */
45
+ aggregator: (results: Map<string, SubworkflowResult<S, WorkflowState>>, parentState: S) => S;
46
+ /**
47
+ * Maximum nesting depth for all subworkflows
48
+ * @default 10
49
+ */
50
+ maxDepth?: number;
51
+ /**
52
+ * Share checkpoint store with parent
53
+ * @default true
54
+ */
55
+ shareCheckpoints?: boolean;
56
+ /**
57
+ * Called when a subworkflow starts
58
+ */
59
+ onSubworkflowStart?: (id: string, config: SubworkflowConfig<S, WorkflowState>) => void;
60
+ /**
61
+ * Called when a subworkflow completes
62
+ */
63
+ onSubworkflowComplete?: (id: string, result: SubworkflowResult<S, WorkflowState>) => void;
64
+ /**
65
+ * Called on progress
66
+ */
67
+ onProgress?: (progress: ParallelProgress) => void;
68
+ }
69
+ /**
70
+ * Progress event for parallel execution
71
+ */
72
+ export interface ParallelProgress {
73
+ total: number;
74
+ completed: number;
75
+ successful: number;
76
+ failed: number;
77
+ pending: number;
78
+ running: number;
79
+ }
80
+ /**
81
+ * Parallel subworkflows result
82
+ */
83
+ export interface ParallelSubworkflowsResult<S extends WorkflowState> {
84
+ success: boolean;
85
+ parentState: S;
86
+ results: Map<string, SubworkflowResult<S, WorkflowState>>;
87
+ errors: Map<string, Error>;
88
+ duration: number;
89
+ stats: {
90
+ total: number;
91
+ successful: number;
92
+ failed: number;
93
+ skipped: number;
94
+ };
95
+ }
96
+ /**
97
+ * Execute multiple subworkflows in parallel
98
+ */
99
+ export declare function executeParallelSubworkflows<S extends WorkflowState>(parentState: S, config: ParallelSubworkflowsConfig<S>, context: SubworkflowContext): Promise<ParallelSubworkflowsResult<S>>;
100
+ /**
101
+ * Create a parallel subworkflows node factory
102
+ */
103
+ export declare function parallelSubworkflows<S extends WorkflowState>(name: string, config: Omit<ParallelSubworkflowsConfig<S>, 'name'>): ParallelSubworkflowsConfig<S>;
104
+ /**
105
+ * Create a fan-out/fan-in pattern
106
+ * Fans out to multiple identical subworkflows with different inputs
107
+ */
108
+ export declare function fanOutFanIn<S extends WorkflowState, CS extends WorkflowState>(name: string, config: {
109
+ workflow: Workflow<CS>;
110
+ getInputs: (state: S) => {
111
+ id: string;
112
+ input: Partial<CS>;
113
+ }[];
114
+ aggregator: (results: Map<string, WorkflowResult<CS>>, state: S) => S;
115
+ concurrency?: number;
116
+ continueOnError?: boolean;
117
+ }): ParallelSubworkflowsConfig<S>;
118
+ /**
119
+ * Create a scatter-gather pattern
120
+ * Scatters work across multiple workflows and gathers results
121
+ */
122
+ export declare function scatterGather<S extends WorkflowState, CS extends WorkflowState>(name: string, config: {
123
+ workflows: Map<string, Workflow<CS>>;
124
+ inputMapper: (state: S, workflowId: string) => Partial<CS>;
125
+ outputMapper: (results: Map<string, WorkflowResult<CS>>, state: S) => S;
126
+ concurrency?: number;
127
+ timeout?: number;
128
+ }): ParallelSubworkflowsConfig<S>;
129
+ /**
130
+ * Create a race pattern
131
+ * Executes multiple subworkflows and returns the first successful result
132
+ */
133
+ export declare function raceSubworkflows<PS extends WorkflowState, CS extends WorkflowState>(parentState: PS, subworkflows: SubworkflowConfig<PS, CS>[], context: SubworkflowContext): Promise<SubworkflowResult<PS, CS> | null>;
134
+ /**
135
+ * Create a fallback pattern
136
+ * Tries subworkflows in order until one succeeds
137
+ */
138
+ export declare function fallbackSubworkflows<PS extends WorkflowState, CS extends WorkflowState>(parentState: PS, subworkflows: SubworkflowConfig<PS, CS>[], context: SubworkflowContext): Promise<SubworkflowResult<PS, CS>>;
139
+ //# sourceMappingURL=parallel-subworkflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-subworkflows.d.ts","sourceRoot":"","sources":["../../src/subworkflows/parallel-subworkflows.ts"],"names":[],"mappings":"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"}