ai-workflows 2.1.3 → 2.3.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 (188) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +8 -1
  3. package/README.md +2 -0
  4. package/dist/barrier.d.ts +6 -0
  5. package/dist/barrier.d.ts.map +1 -1
  6. package/dist/barrier.js +45 -7
  7. package/dist/barrier.js.map +1 -1
  8. package/dist/cascade-context.d.ts.map +1 -1
  9. package/dist/cascade-context.js +25 -25
  10. package/dist/cascade-context.js.map +1 -1
  11. package/dist/cascade-executor.d.ts.map +1 -1
  12. package/dist/cascade-executor.js +1 -1
  13. package/dist/cascade-executor.js.map +1 -1
  14. package/dist/context.d.ts.map +1 -1
  15. package/dist/context.js +23 -7
  16. package/dist/context.js.map +1 -1
  17. package/dist/cron-parser.d.ts +65 -0
  18. package/dist/cron-parser.d.ts.map +1 -0
  19. package/dist/cron-parser.js +294 -0
  20. package/dist/cron-parser.js.map +1 -0
  21. package/dist/cron-scheduler.d.ts +117 -0
  22. package/dist/cron-scheduler.d.ts.map +1 -0
  23. package/dist/cron-scheduler.js +176 -0
  24. package/dist/cron-scheduler.js.map +1 -0
  25. package/dist/database-context.d.ts +184 -0
  26. package/dist/database-context.d.ts.map +1 -0
  27. package/dist/database-context.js +428 -0
  28. package/dist/database-context.js.map +1 -0
  29. package/dist/digital-objects-adapter.d.ts +159 -0
  30. package/dist/digital-objects-adapter.d.ts.map +1 -0
  31. package/dist/digital-objects-adapter.js +229 -0
  32. package/dist/digital-objects-adapter.js.map +1 -0
  33. package/dist/durable-execution-cloudflare.d.ts +427 -0
  34. package/dist/durable-execution-cloudflare.d.ts.map +1 -0
  35. package/dist/durable-execution-cloudflare.js +510 -0
  36. package/dist/durable-execution-cloudflare.js.map +1 -0
  37. package/dist/durable-execution.d.ts +482 -0
  38. package/dist/durable-execution.d.ts.map +1 -0
  39. package/dist/durable-execution.js +594 -0
  40. package/dist/durable-execution.js.map +1 -0
  41. package/dist/durable-workflow.d.ts +176 -0
  42. package/dist/durable-workflow.d.ts.map +1 -0
  43. package/dist/durable-workflow.js +552 -0
  44. package/dist/durable-workflow.js.map +1 -0
  45. package/dist/graph/topological-sort.d.ts.map +1 -1
  46. package/dist/graph/topological-sort.js +5 -5
  47. package/dist/graph/topological-sort.js.map +1 -1
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +15 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/logger.d.ts +101 -0
  53. package/dist/logger.d.ts.map +1 -0
  54. package/dist/logger.js +115 -0
  55. package/dist/logger.js.map +1 -0
  56. package/dist/on.d.ts.map +1 -1
  57. package/dist/on.js +3 -3
  58. package/dist/on.js.map +1 -1
  59. package/dist/runtime.d.ts +169 -0
  60. package/dist/runtime.d.ts.map +1 -0
  61. package/dist/runtime.js +275 -0
  62. package/dist/runtime.js.map +1 -0
  63. package/dist/send.d.ts.map +1 -1
  64. package/dist/send.js +4 -3
  65. package/dist/send.js.map +1 -1
  66. package/dist/telemetry.d.ts +150 -0
  67. package/dist/telemetry.d.ts.map +1 -0
  68. package/dist/telemetry.js +388 -0
  69. package/dist/telemetry.js.map +1 -0
  70. package/dist/timer-registry.d.ts +25 -0
  71. package/dist/timer-registry.d.ts.map +1 -1
  72. package/dist/timer-registry.js +42 -8
  73. package/dist/timer-registry.js.map +1 -1
  74. package/dist/types.d.ts +17 -6
  75. package/dist/types.d.ts.map +1 -1
  76. package/dist/types.js +1 -1
  77. package/dist/types.js.map +1 -1
  78. package/dist/worker/durable-step.d.ts +481 -0
  79. package/dist/worker/durable-step.d.ts.map +1 -0
  80. package/dist/worker/durable-step.js +606 -0
  81. package/dist/worker/durable-step.js.map +1 -0
  82. package/dist/worker/index.d.ts +106 -0
  83. package/dist/worker/index.d.ts.map +1 -0
  84. package/dist/worker/index.js +124 -0
  85. package/dist/worker/index.js.map +1 -0
  86. package/dist/worker/state-adapter.d.ts +230 -0
  87. package/dist/worker/state-adapter.d.ts.map +1 -0
  88. package/dist/worker/state-adapter.js +409 -0
  89. package/dist/worker/state-adapter.js.map +1 -0
  90. package/dist/worker/topological-executor.d.ts +282 -0
  91. package/dist/worker/topological-executor.d.ts.map +1 -0
  92. package/dist/worker/topological-executor.js +396 -0
  93. package/dist/worker/topological-executor.js.map +1 -0
  94. package/dist/worker/workflow-builder.d.ts +286 -0
  95. package/dist/worker/workflow-builder.d.ts.map +1 -0
  96. package/dist/worker/workflow-builder.js +565 -0
  97. package/dist/worker/workflow-builder.js.map +1 -0
  98. package/dist/worker.d.ts +800 -0
  99. package/dist/worker.d.ts.map +1 -0
  100. package/dist/worker.js +2428 -0
  101. package/dist/worker.js.map +1 -0
  102. package/dist/workflow-builder.d.ts +287 -0
  103. package/dist/workflow-builder.d.ts.map +1 -0
  104. package/dist/workflow-builder.js +762 -0
  105. package/dist/workflow-builder.js.map +1 -0
  106. package/dist/workflow.d.ts +14 -30
  107. package/dist/workflow.d.ts.map +1 -1
  108. package/dist/workflow.js +132 -292
  109. package/dist/workflow.js.map +1 -1
  110. package/examples/01-ecommerce-order-pipeline.ts +358 -0
  111. package/examples/02-content-moderation-cascade.ts +454 -0
  112. package/examples/03-scheduled-reporting-dependencies.ts +479 -0
  113. package/examples/04-database-persistence.ts +518 -0
  114. package/examples/README.md +173 -0
  115. package/package.json +30 -13
  116. package/src/__tests__/digital-objects-adapter.test.ts +274 -0
  117. package/src/__tests__/durable-workflow.test.ts +297 -0
  118. package/src/barrier.ts +48 -7
  119. package/src/cascade-context.ts +36 -29
  120. package/src/cascade-executor.ts +3 -2
  121. package/src/context.ts +41 -12
  122. package/src/cron-parser.ts +347 -0
  123. package/src/cron-scheduler.ts +239 -0
  124. package/src/database-context.ts +658 -0
  125. package/src/digital-objects-adapter.ts +351 -0
  126. package/src/durable-execution-cloudflare.ts +855 -0
  127. package/src/durable-execution.ts +1042 -0
  128. package/src/durable-workflow.ts +717 -0
  129. package/src/graph/topological-sort.ts +6 -8
  130. package/src/index.ts +69 -0
  131. package/src/logger.ts +148 -0
  132. package/src/on.ts +8 -9
  133. package/src/runtime.ts +436 -0
  134. package/src/send.ts +4 -5
  135. package/src/telemetry.ts +577 -0
  136. package/src/timer-registry.ts +44 -10
  137. package/src/types.ts +32 -17
  138. package/src/worker/durable-step.ts +976 -0
  139. package/src/worker/index.ts +216 -0
  140. package/src/worker/state-adapter.ts +589 -0
  141. package/src/worker/topological-executor.ts +625 -0
  142. package/src/worker/workflow-builder.ts +871 -0
  143. package/src/worker.ts +2906 -0
  144. package/src/workflow-builder.ts +1068 -0
  145. package/src/workflow.ts +188 -351
  146. package/test/barrier-join.test.ts +32 -24
  147. package/test/cascade-executor.test.ts +9 -16
  148. package/test/cron-parser.test.ts +314 -0
  149. package/test/cron-scheduler.test.ts +291 -0
  150. package/test/database-context.test.ts +770 -0
  151. package/test/db-provider-adapter.test.ts +862 -0
  152. package/test/durable-execution-cloudflare.test.ts +606 -0
  153. package/test/durable-execution-in-process.test.ts +286 -0
  154. package/test/durable-execution.test.ts +247 -0
  155. package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
  156. package/test/integration.test.ts +442 -0
  157. package/test/rpc-surface.test.ts +946 -0
  158. package/test/runtime.test.ts +262 -0
  159. package/test/schedule-timer-cleanup.test.ts +30 -21
  160. package/test/send-race-conditions.test.ts +30 -40
  161. package/test/worker/durable-cascade.test.ts +1117 -0
  162. package/test/worker/durable-step.test.ts +723 -0
  163. package/test/worker/topological-executor.test.ts +1240 -0
  164. package/test/worker/workflow-builder.test.ts +1067 -0
  165. package/test/worker.test.ts +608 -0
  166. package/test/workflow-builder.test.ts +1670 -0
  167. package/test/workflow-cron.test.ts +256 -0
  168. package/test/workflow-state-adapter.test.ts +923 -0
  169. package/test/workflow.test.ts +25 -22
  170. package/tsconfig.json +3 -1
  171. package/vitest.config.ts +38 -1
  172. package/vitest.workers.config.ts +44 -0
  173. package/wrangler.jsonc +22 -0
  174. package/.turbo/turbo-test.log +0 -169
  175. package/LICENSE +0 -21
  176. package/src/context.js +0 -83
  177. package/src/every.js +0 -267
  178. package/src/index.js +0 -71
  179. package/src/on.js +0 -79
  180. package/src/send.js +0 -111
  181. package/src/types.js +0 -4
  182. package/src/workflow.js +0 -455
  183. package/test/context.test.js +0 -116
  184. package/test/every.test.js +0 -282
  185. package/test/on.test.js +0 -80
  186. package/test/send.test.js +0 -89
  187. package/test/workflow.test.js +0 -224
  188. package/vitest.config.js +0 -7
@@ -0,0 +1,565 @@
1
+ /**
2
+ * WorkflowBuilder DSL - Declarative workflow definition with fluent API
3
+ *
4
+ * Provides a builder pattern for creating durable workflows with:
5
+ * - Step definitions with dependencies
6
+ * - Event triggers
7
+ * - Scheduled execution
8
+ * - Type-safe execution context
9
+ *
10
+ * ## Features
11
+ *
12
+ * - **Fluent API**: Chain methods for intuitive workflow definition
13
+ * - **Step Dependencies**: Declare execution order with `.dependsOn()`
14
+ * - **Event Triggers**: React to domain events with `.on('Noun.event')`
15
+ * - **Schedule Triggers**: Run on intervals with `.every()`
16
+ * - **Error Handling**: Per-step error handlers with `.onError()`
17
+ * - **Parallel Execution**: Steps without dependencies run concurrently
18
+ * - **Cycle Detection**: Automatically detects circular dependencies
19
+ *
20
+ * ## Basic Usage
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * import { WorkflowBuilder } from 'ai-workflows/worker'
25
+ *
26
+ * const workflow = WorkflowBuilder.create('order-process')
27
+ * .step('validate', async (input) => {
28
+ * return { valid: true }
29
+ * })
30
+ * .step('charge', async (input, ctx) => {
31
+ * const validation = ctx.getStepResult<{ valid: boolean }>('validate')
32
+ * if (!validation.valid) throw new Error('Invalid order')
33
+ * return { charged: true }
34
+ * }).dependsOn('validate')
35
+ * .step('fulfill', fulfillOrder).dependsOn('charge')
36
+ * .on('Order.placed').do('validate')
37
+ * .build()
38
+ *
39
+ * // Execute the workflow
40
+ * const results = await workflow.execute({ orderId: 'order-123' })
41
+ * ```
42
+ *
43
+ * ## With DurableStep
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * import { WorkflowBuilder, DurableStep } from 'ai-workflows/worker'
48
+ *
49
+ * const fetchData = new DurableStep('fetch-data', async ({ url }) => {
50
+ * return fetch(url).then(r => r.json())
51
+ * })
52
+ *
53
+ * const workflow = WorkflowBuilder.create('data-pipeline')
54
+ * .step(fetchData)
55
+ * .step('process', processData).dependsOn('fetch-data')
56
+ * .build()
57
+ * ```
58
+ *
59
+ * ## Scheduled Workflows
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const workflow = WorkflowBuilder.create('daily-report')
64
+ * .step('generate', generateReport)
65
+ * .step('send', sendReport).dependsOn('generate')
66
+ * .every('day').at('9am').do('generate')
67
+ * .build()
68
+ * ```
69
+ *
70
+ * @packageDocumentation
71
+ */
72
+ import { DurableStep, StepContext } from './durable-step.js';
73
+ // ============================================================================
74
+ // Implementation
75
+ // ============================================================================
76
+ /**
77
+ * Internal class implementing StepChain, EventTriggerChain, ScheduleTriggerChain
78
+ */
79
+ class WorkflowBuilderImpl {
80
+ _name;
81
+ _config;
82
+ _steps = new Map();
83
+ _eventTriggers = [];
84
+ _scheduleTriggers = [];
85
+ _currentStep = null;
86
+ _implicitStepCounter = 0;
87
+ // For event trigger chain
88
+ _currentEvent = null;
89
+ _currentFilter = null;
90
+ // For schedule trigger chain
91
+ _currentSchedule = null;
92
+ _currentScheduleValue = null;
93
+ _currentTime = null;
94
+ _currentTimezone = null;
95
+ constructor(name, config) {
96
+ if (!name || name.trim() === '') {
97
+ throw new Error('Workflow name is required');
98
+ }
99
+ this._name = name;
100
+ if (config !== undefined) {
101
+ this._config = config;
102
+ }
103
+ }
104
+ get name() {
105
+ return this._name;
106
+ }
107
+ get config() {
108
+ return this._config;
109
+ }
110
+ // ==================== Step Methods ====================
111
+ step(nameOrStep, configOrFn, maybeFn) {
112
+ let name;
113
+ let fn;
114
+ let stepConfig;
115
+ let durableStep;
116
+ if (nameOrStep instanceof DurableStep) {
117
+ name = nameOrStep.name;
118
+ fn = nameOrStep.fn;
119
+ stepConfig = nameOrStep.config;
120
+ durableStep = nameOrStep;
121
+ }
122
+ else {
123
+ name = nameOrStep;
124
+ if (typeof configOrFn === 'function') {
125
+ fn = configOrFn;
126
+ }
127
+ else {
128
+ stepConfig = configOrFn;
129
+ fn = maybeFn;
130
+ }
131
+ }
132
+ // Check for duplicate step names
133
+ if (this._steps.has(name)) {
134
+ throw new Error(`Step "${name}" already exists`);
135
+ }
136
+ const stepDef = {
137
+ name,
138
+ fn,
139
+ ...(stepConfig !== undefined && { config: stepConfig }),
140
+ dependencies: [],
141
+ durableStep: durableStep ??
142
+ new DurableStep(name, stepConfig ?? {}, fn),
143
+ };
144
+ this._steps.set(name, stepDef);
145
+ this._currentStep = name;
146
+ return this;
147
+ }
148
+ dependsOn(...steps) {
149
+ if (!this._currentStep) {
150
+ throw new Error('No current step to add dependencies to');
151
+ }
152
+ const currentStepDef = this._steps.get(this._currentStep);
153
+ if (!currentStepDef) {
154
+ throw new Error(`Step "${this._currentStep}" not found`);
155
+ }
156
+ // Parse arguments
157
+ let dependencyNames = [];
158
+ let dependencyOptions;
159
+ for (const arg of steps) {
160
+ if (arg === undefined)
161
+ continue;
162
+ if (typeof arg === 'string') {
163
+ dependencyNames.push(arg);
164
+ }
165
+ else if (Array.isArray(arg)) {
166
+ dependencyNames.push(...arg);
167
+ }
168
+ else if (typeof arg === 'object' && ('type' in arg || 'timeout' in arg)) {
169
+ dependencyOptions = arg;
170
+ }
171
+ }
172
+ // Add dependencies
173
+ for (const depName of dependencyNames) {
174
+ currentStepDef.dependencies.push({
175
+ name: depName,
176
+ ...(dependencyOptions !== undefined && { options: dependencyOptions }),
177
+ });
178
+ }
179
+ return this;
180
+ }
181
+ timeout(duration) {
182
+ if (!this._currentStep) {
183
+ throw new Error('No current step to set timeout for');
184
+ }
185
+ const stepDef = this._steps.get(this._currentStep);
186
+ if (stepDef) {
187
+ stepDef.config = { ...stepDef.config, timeout: duration };
188
+ }
189
+ return this;
190
+ }
191
+ retries(config) {
192
+ if (!this._currentStep) {
193
+ throw new Error('No current step to set retries for');
194
+ }
195
+ const stepDef = this._steps.get(this._currentStep);
196
+ if (stepDef) {
197
+ stepDef.config = { ...stepDef.config, retries: config };
198
+ }
199
+ return this;
200
+ }
201
+ onError(handler) {
202
+ if (!this._currentStep) {
203
+ throw new Error('No current step to set error handler for');
204
+ }
205
+ const stepDef = this._steps.get(this._currentStep);
206
+ if (stepDef) {
207
+ stepDef.errorHandler = handler;
208
+ }
209
+ return this;
210
+ }
211
+ // ==================== Event Trigger Methods ====================
212
+ on(event) {
213
+ // Validate event format (Noun.event)
214
+ const eventRegex = /^[A-Z][a-zA-Z]*\.[a-z][a-zA-Z]*$/;
215
+ if (!eventRegex.test(event)) {
216
+ // Store invalid event - will throw when .do() is called
217
+ this._currentEvent = event;
218
+ this._currentFilter = null;
219
+ return this;
220
+ }
221
+ this._currentEvent = event;
222
+ this._currentFilter = null;
223
+ return this;
224
+ }
225
+ filter(predicate) {
226
+ this._currentFilter = predicate;
227
+ return this;
228
+ }
229
+ // ==================== Schedule Trigger Methods ====================
230
+ every(scheduleOrValue) {
231
+ if (typeof scheduleOrValue === 'number') {
232
+ this._currentScheduleValue = scheduleOrValue;
233
+ this._currentSchedule = null;
234
+ }
235
+ else {
236
+ this._currentSchedule = scheduleOrValue;
237
+ this._currentScheduleValue = null;
238
+ }
239
+ this._currentTime = null;
240
+ this._currentTimezone = null;
241
+ return this;
242
+ }
243
+ minutes() {
244
+ if (this._currentScheduleValue !== null) {
245
+ this._currentSchedule = `${this._currentScheduleValue} minutes`;
246
+ }
247
+ return this;
248
+ }
249
+ hours() {
250
+ if (this._currentScheduleValue !== null) {
251
+ this._currentSchedule = `${this._currentScheduleValue} hours`;
252
+ }
253
+ return this;
254
+ }
255
+ days() {
256
+ if (this._currentScheduleValue !== null) {
257
+ this._currentSchedule = `${this._currentScheduleValue} days`;
258
+ }
259
+ return this;
260
+ }
261
+ seconds() {
262
+ if (this._currentScheduleValue !== null) {
263
+ this._currentSchedule = `${this._currentScheduleValue} seconds`;
264
+ }
265
+ return this;
266
+ }
267
+ at(time) {
268
+ this._currentTime = time;
269
+ return this;
270
+ }
271
+ timezone(tz) {
272
+ this._currentTimezone = tz;
273
+ return this;
274
+ }
275
+ /**
276
+ * Execute a step when event fires or on schedule
277
+ */
278
+ do(stepNameOrFn) {
279
+ // Handle event trigger
280
+ if (this._currentEvent !== null) {
281
+ const eventRegex = /^[A-Z][a-zA-Z]*\.[a-z][a-zA-Z]*$/;
282
+ if (!eventRegex.test(this._currentEvent)) {
283
+ throw new Error(`Invalid event name format: "${this._currentEvent}". Expected Noun.event format`);
284
+ }
285
+ let stepName;
286
+ if (typeof stepNameOrFn === 'function') {
287
+ // Create implicit step
288
+ stepName = `__implicit_${this._currentEvent.replace('.', '_')}_${++this
289
+ ._implicitStepCounter}`;
290
+ this._steps.set(stepName, {
291
+ name: stepName,
292
+ fn: stepNameOrFn,
293
+ dependencies: [],
294
+ });
295
+ }
296
+ else {
297
+ stepName = stepNameOrFn;
298
+ }
299
+ this._eventTriggers.push({
300
+ event: this._currentEvent,
301
+ stepName,
302
+ ...(this._currentFilter !== null && { filter: this._currentFilter }),
303
+ });
304
+ this._currentEvent = null;
305
+ this._currentFilter = null;
306
+ return this;
307
+ }
308
+ // Handle schedule trigger
309
+ if (this._currentSchedule !== null) {
310
+ let stepName;
311
+ if (typeof stepNameOrFn === 'function') {
312
+ // Create implicit step
313
+ stepName = `__implicit_schedule_${++this._implicitStepCounter}`;
314
+ this._steps.set(stepName, {
315
+ name: stepName,
316
+ fn: stepNameOrFn,
317
+ dependencies: [],
318
+ });
319
+ }
320
+ else {
321
+ stepName = stepNameOrFn;
322
+ }
323
+ this._scheduleTriggers.push({
324
+ schedule: this._currentSchedule,
325
+ ...(this._currentScheduleValue !== null && { value: this._currentScheduleValue }),
326
+ ...(this._currentTime !== null && { time: this._currentTime }),
327
+ ...(this._currentTimezone !== null && { timezone: this._currentTimezone }),
328
+ stepName,
329
+ });
330
+ this._currentSchedule = null;
331
+ this._currentScheduleValue = null;
332
+ this._currentTime = null;
333
+ this._currentTimezone = null;
334
+ return this;
335
+ }
336
+ throw new Error('No event or schedule to trigger');
337
+ }
338
+ // ==================== Build Method ====================
339
+ build() {
340
+ // Validate event triggers reference existing steps
341
+ for (const trigger of this._eventTriggers) {
342
+ if (!this._steps.has(trigger.stepName)) {
343
+ throw new Error(`Step "${trigger.stepName}" not found for event trigger`);
344
+ }
345
+ }
346
+ // Validate schedule triggers reference existing steps
347
+ for (const trigger of this._scheduleTriggers) {
348
+ if (!this._steps.has(trigger.stepName)) {
349
+ throw new Error(`Step "${trigger.stepName}" not found for schedule trigger`);
350
+ }
351
+ }
352
+ // Build dependency graph
353
+ const dependencyGraph = new Map();
354
+ for (const [name, stepDef] of this._steps) {
355
+ const deps = stepDef.dependencies.map((d) => d.name);
356
+ dependencyGraph.set(name, deps);
357
+ // Validate dependencies exist
358
+ for (const dep of deps) {
359
+ if (!this._steps.has(dep)) {
360
+ throw new Error(`Dependency "${dep}" not found for step "${name}"`);
361
+ }
362
+ }
363
+ }
364
+ // Check for circular dependencies
365
+ this.detectCircularDependencies(dependencyGraph);
366
+ // Compute topological sort
367
+ const executionOrder = this.topologicalSort(dependencyGraph);
368
+ // Create immutable copies
369
+ const steps = Array.from(this._steps.values()).map((s) => ({ ...s }));
370
+ const eventTriggers = [...this._eventTriggers];
371
+ const scheduleTriggers = [...this._scheduleTriggers];
372
+ const workflow = {
373
+ name: this._name,
374
+ steps: Object.freeze(steps),
375
+ triggers: Object.freeze({
376
+ events: Object.freeze(eventTriggers),
377
+ schedules: Object.freeze(scheduleTriggers),
378
+ }),
379
+ dependencyGraph: new Map(dependencyGraph),
380
+ executionOrder,
381
+ ...(this._config !== undefined && { metadata: this._config }),
382
+ isCloudflareCompatible: true,
383
+ execute: async (input) => {
384
+ return this.executeWorkflow(steps, dependencyGraph, executionOrder, input);
385
+ },
386
+ };
387
+ return workflow;
388
+ }
389
+ // ==================== Private Helpers ====================
390
+ detectCircularDependencies(graph) {
391
+ const visited = new Set();
392
+ const recursionStack = new Set();
393
+ const dfs = (node, path) => {
394
+ visited.add(node);
395
+ recursionStack.add(node);
396
+ const deps = graph.get(node) || [];
397
+ for (const dep of deps) {
398
+ if (!visited.has(dep)) {
399
+ dfs(dep, [...path, node]);
400
+ }
401
+ else if (recursionStack.has(dep)) {
402
+ // Check if it's self-referential
403
+ if (dep === node) {
404
+ throw new Error(`Circular dependency detected: step "${node}" depends on itself (self-referential)`);
405
+ }
406
+ throw new Error(`Circular dependency detected: ${[...path, node, dep].join(' -> ')}`);
407
+ }
408
+ }
409
+ recursionStack.delete(node);
410
+ };
411
+ for (const node of graph.keys()) {
412
+ if (!visited.has(node)) {
413
+ dfs(node, []);
414
+ }
415
+ }
416
+ }
417
+ topologicalSort(graph) {
418
+ const result = [];
419
+ const visited = new Set();
420
+ const temp = new Set();
421
+ const visit = (node) => {
422
+ if (temp.has(node)) {
423
+ throw new Error('Circular dependency detected');
424
+ }
425
+ if (visited.has(node))
426
+ return;
427
+ temp.add(node);
428
+ const deps = graph.get(node) || [];
429
+ for (const dep of deps) {
430
+ visit(dep);
431
+ }
432
+ temp.delete(node);
433
+ visited.add(node);
434
+ result.push(node);
435
+ };
436
+ for (const node of graph.keys()) {
437
+ visit(node);
438
+ }
439
+ return result;
440
+ }
441
+ async executeWorkflow(steps, dependencyGraph, executionOrder, input) {
442
+ const results = {};
443
+ const stepMap = new Map(steps.map((s) => [s.name, s]));
444
+ const ctx = {
445
+ input,
446
+ results,
447
+ getStepResult: (stepName) => {
448
+ if (!(stepName in results)) {
449
+ throw new Error(`Step "${stepName}" has not been executed yet`);
450
+ }
451
+ return results[stepName];
452
+ },
453
+ };
454
+ // Track which steps are completed
455
+ const completed = new Set();
456
+ const inProgress = new Set();
457
+ const pending = new Set(executionOrder);
458
+ // Execute steps respecting dependencies
459
+ while (pending.size > 0) {
460
+ // Find steps that can be executed (all dependencies satisfied)
461
+ const ready = [];
462
+ for (const stepName of pending) {
463
+ const deps = dependencyGraph.get(stepName) || [];
464
+ if (deps.every((d) => completed.has(d)) && !inProgress.has(stepName)) {
465
+ ready.push(stepName);
466
+ }
467
+ }
468
+ if (ready.length === 0 && pending.size > 0) {
469
+ throw new Error('Deadlock detected: no steps can be executed');
470
+ }
471
+ // Execute ready steps in parallel
472
+ const execPromises = ready.map(async (stepName) => {
473
+ inProgress.add(stepName);
474
+ const step = stepMap.get(stepName);
475
+ try {
476
+ const result = await step.fn(input, ctx);
477
+ results[stepName] = result;
478
+ }
479
+ catch (error) {
480
+ if (step.errorHandler) {
481
+ results[stepName] = await step.errorHandler(error, ctx);
482
+ }
483
+ else {
484
+ throw error;
485
+ }
486
+ }
487
+ finally {
488
+ inProgress.delete(stepName);
489
+ completed.add(stepName);
490
+ pending.delete(stepName);
491
+ }
492
+ });
493
+ await Promise.all(execPromises);
494
+ }
495
+ return results;
496
+ }
497
+ /**
498
+ * Register workflow with a service
499
+ */
500
+ registerWorkflow(workflow) {
501
+ // This is handled by WorkflowServiceCore
502
+ return { id: workflow.name };
503
+ }
504
+ }
505
+ /**
506
+ * WorkflowBuilder - Static factory for creating workflow definitions
507
+ *
508
+ * @example
509
+ * ```ts
510
+ * const workflow = WorkflowBuilder.create('order-process')
511
+ * .step('validate', validateOrder)
512
+ * .step('charge', chargePayment).dependsOn('validate')
513
+ * .on('Order.placed').do('validate')
514
+ * .build()
515
+ * ```
516
+ */
517
+ export class WorkflowBuilder {
518
+ /** Workflow name */
519
+ name;
520
+ /** Workflow configuration */
521
+ config;
522
+ impl;
523
+ constructor(name, config) {
524
+ this.name = name;
525
+ if (config !== undefined) {
526
+ this.config = config;
527
+ }
528
+ this.impl = new WorkflowBuilderImpl(name, config);
529
+ }
530
+ /**
531
+ * Create a new workflow builder
532
+ *
533
+ * @param name - Unique workflow name
534
+ * @param config - Optional workflow configuration
535
+ * @returns WorkflowBuilder instance
536
+ */
537
+ static create(name, config) {
538
+ return new WorkflowBuilder(name, config);
539
+ }
540
+ step(nameOrStep, configOrFn, maybeFn) {
541
+ return this.impl.step(nameOrStep, configOrFn, maybeFn);
542
+ }
543
+ /**
544
+ * Register an event trigger
545
+ */
546
+ on(event) {
547
+ return this.impl.on(event);
548
+ }
549
+ every(scheduleOrValue) {
550
+ return this.impl.every(scheduleOrValue);
551
+ }
552
+ dependsOn(stepOrSteps, options) {
553
+ this.impl.dependsOn(stepOrSteps, options);
554
+ return this;
555
+ }
556
+ /**
557
+ * Build the workflow definition
558
+ */
559
+ build() {
560
+ return this.impl.build();
561
+ }
562
+ }
563
+ // Re-export for convenience
564
+ export { DurableStep };
565
+ //# sourceMappingURL=workflow-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-builder.js","sourceRoot":"","sources":["../../src/worker/workflow-builder.ts"],"names":[],"mappings":"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"}