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,606 @@
1
+ /**
2
+ * DurableStep - Wrapper for Cloudflare Workflows step semantics
3
+ *
4
+ * Provides durable execution, retries, sleep, and step metadata
5
+ * by wrapping Cloudflare Workflows' step.do() primitive. This is the
6
+ * foundation for building reliable, resumable workflow steps.
7
+ *
8
+ * ## Features
9
+ *
10
+ * - **Durable Execution**: Steps are persisted and can resume after failures
11
+ * - **Automatic Retries**: Configure retry behavior with backoff strategies
12
+ * - **Timeout Support**: Set per-step timeouts for long-running operations
13
+ * - **Step Context**: Access to nested durable operations and sleep
14
+ * - **Type Safety**: Full TypeScript generics for input/output types
15
+ * - **Cascade Pattern**: Tiered execution with code -> generative -> agentic -> human escalation
16
+ *
17
+ * ## Basic Usage
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { DurableStep } from 'ai-workflows/worker'
22
+ *
23
+ * // Simple step with type inference
24
+ * const fetchData = new DurableStep('fetch-data', async (input: { url: string }) => {
25
+ * const response = await fetch(input.url)
26
+ * return response.json()
27
+ * })
28
+ *
29
+ * // With retry configuration
30
+ * const processPayment = new DurableStep(
31
+ * 'process-payment',
32
+ * { retries: { limit: 3, delay: '1 second', backoff: 'exponential' } },
33
+ * async (input: { amount: number }) => {
34
+ * return { success: true }
35
+ * }
36
+ * )
37
+ *
38
+ * // Run with workflow step
39
+ * const result = await fetchData.run(step, { url: 'https://api.example.com' })
40
+ * ```
41
+ *
42
+ * ## Using StepContext
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * const complexStep = new DurableStep('complex', async (input, ctx) => {
47
+ * // Access step metadata
48
+ * console.log(`Attempt ${ctx.metadata.attempt} of step ${ctx.metadata.id}`)
49
+ *
50
+ * // Nested durable operation
51
+ * const result = await ctx.do('fetch-api', async () => {
52
+ * return fetch('https://api.example.com').then(r => r.json())
53
+ * })
54
+ *
55
+ * return result
56
+ * })
57
+ * ```
58
+ *
59
+ * ## Cascade Pattern
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const processRefund = DurableStep.cascade('process-refund', {
64
+ * code: async (input) => {
65
+ * if (input.amount < 100) return { approved: true }
66
+ * throw new Error('Needs AI review')
67
+ * },
68
+ * generative: async (input, ctx) => {
69
+ * const result = await ctx.ai.run('@cf/meta/llama-3-8b-instruct', {
70
+ * messages: [{ role: 'user', content: 'Approve refund?' }]
71
+ * })
72
+ * return { approved: result.response.includes('yes') }
73
+ * },
74
+ * human: async (input, ctx) => {
75
+ * return ctx.requestHumanReview({ type: 'refund', data: input })
76
+ * }
77
+ * })
78
+ * ```
79
+ *
80
+ * @packageDocumentation
81
+ */
82
+ import { createCascadeContext, recordStep, } from '../cascade-context.js';
83
+ /**
84
+ * Context provided to step functions for additional operations
85
+ */
86
+ export class StepContext {
87
+ workflowStep;
88
+ stepName;
89
+ stepConfig;
90
+ currentAttempt;
91
+ /**
92
+ * Create a new StepContext
93
+ *
94
+ * @param workflowStep - The underlying Cloudflare workflow step
95
+ * @param stepName - The name of the parent step
96
+ * @param stepConfig - Optional step configuration
97
+ * @param attempt - Current attempt number
98
+ */
99
+ constructor(workflowStep, stepName, stepConfig, attempt = 1) {
100
+ this.workflowStep = workflowStep;
101
+ this.stepName = stepName;
102
+ this.stepConfig = stepConfig;
103
+ this.currentAttempt = attempt;
104
+ }
105
+ /**
106
+ * Metadata about the current step execution
107
+ */
108
+ get metadata() {
109
+ return {
110
+ id: this.stepName,
111
+ attempt: this.currentAttempt,
112
+ retries: this.stepConfig?.retries?.limit ?? 0,
113
+ };
114
+ }
115
+ /**
116
+ * Implementation of do() overloads
117
+ */
118
+ do(name, configOrCallback, maybeCallback) {
119
+ if (typeof configOrCallback === 'function') {
120
+ return this.workflowStep.do(name, configOrCallback);
121
+ }
122
+ else {
123
+ return this.workflowStep.do(name, configOrCallback, maybeCallback);
124
+ }
125
+ }
126
+ /**
127
+ * Sleep for a specified duration
128
+ *
129
+ * @param name - Unique name for this sleep operation
130
+ * @param duration - Duration to sleep (string like '5 seconds' or number in ms)
131
+ */
132
+ sleep(name, duration) {
133
+ return this.workflowStep.sleep(name, duration);
134
+ }
135
+ /**
136
+ * Sleep until a specified timestamp
137
+ *
138
+ * @param name - Unique name for this sleep operation
139
+ * @param timestamp - Date or unix timestamp to sleep until
140
+ */
141
+ sleepUntil(name, timestamp) {
142
+ return this.workflowStep.sleepUntil(name, timestamp);
143
+ }
144
+ }
145
+ /**
146
+ * DurableStep - Wrapper for durable function execution
147
+ *
148
+ * Wraps a function for durable execution using Cloudflare Workflows'
149
+ * step.do() primitive. Provides retry configuration, timeout, and
150
+ * access to step context.
151
+ *
152
+ * @typeParam TInput - Input type for the step function
153
+ * @typeParam TOutput - Output type for the step function
154
+ */
155
+ export class DurableStep {
156
+ /** Step name */
157
+ name;
158
+ /** Step configuration (retries, timeout) */
159
+ config;
160
+ /** The wrapped function */
161
+ fn;
162
+ /**
163
+ * Implementation of constructor overloads
164
+ */
165
+ constructor(name, configOrFn, maybeFn) {
166
+ this.name = name;
167
+ if (typeof configOrFn === 'function') {
168
+ this.fn = configOrFn;
169
+ }
170
+ else {
171
+ this.config = configOrFn;
172
+ this.fn = maybeFn;
173
+ }
174
+ }
175
+ /**
176
+ * Run the step with durable execution
177
+ *
178
+ * @param workflowStep - The Cloudflare workflow step object
179
+ * @param input - Input for the step function
180
+ * @returns Result of the step function
181
+ */
182
+ async run(workflowStep, input) {
183
+ const ctx = new StepContext(workflowStep, this.name, this.config);
184
+ if (this.config) {
185
+ return workflowStep.do(this.name, this.config, async () => {
186
+ return this.fn(input, ctx);
187
+ });
188
+ }
189
+ else {
190
+ return workflowStep.do(this.name, async () => {
191
+ return this.fn(input, ctx);
192
+ });
193
+ }
194
+ }
195
+ /**
196
+ * Create a durable cascade step with tiered execution
197
+ *
198
+ * The cascade pattern executes tiers in order: code -> generative -> agentic -> human
199
+ * Each tier can short-circuit on success, or escalate to the next tier on failure.
200
+ *
201
+ * @param name - Unique name for this cascade step
202
+ * @param config - Cascade configuration with tier handlers
203
+ * @returns DurableCascadeStep instance
204
+ *
205
+ * @example
206
+ * ```typescript
207
+ * const processRefund = DurableStep.cascade('process-refund', {
208
+ * code: async (input) => {
209
+ * if (input.amount < 100) return { approved: true }
210
+ * throw new Error('Needs AI review')
211
+ * },
212
+ * generative: async (input, ctx) => {
213
+ * const result = await ctx.ai.run('@cf/meta/llama-3-8b-instruct', {
214
+ * messages: [{ role: 'user', content: 'Approve refund?' }]
215
+ * })
216
+ * return { approved: result.response.includes('yes') }
217
+ * },
218
+ * human: async (input, ctx) => {
219
+ * return ctx.requestHumanReview({ type: 'refund', data: input })
220
+ * }
221
+ * })
222
+ * ```
223
+ */
224
+ static cascade(name, config) {
225
+ return new DurableCascadeStep(name, config);
226
+ }
227
+ }
228
+ /**
229
+ * Default timeouts per tier in milliseconds
230
+ */
231
+ export const DEFAULT_CASCADE_TIMEOUTS = {
232
+ code: 5000, // 5 seconds
233
+ generative: 30000, // 30 seconds
234
+ agentic: 300000, // 5 minutes
235
+ human: 86400000, // 24 hours
236
+ };
237
+ /**
238
+ * Ordered list of cascade tiers
239
+ */
240
+ export const CASCADE_TIER_ORDER = ['code', 'generative', 'agentic', 'human'];
241
+ /**
242
+ * Error thrown when all cascade tiers fail
243
+ */
244
+ export class AllTiersFailed extends Error {
245
+ history;
246
+ constructor(history) {
247
+ super('All cascade tiers failed');
248
+ this.name = 'AllTiersFailed';
249
+ this.history = history;
250
+ }
251
+ }
252
+ /**
253
+ * Error thrown when cascade times out
254
+ */
255
+ export class CascadeTimeout extends Error {
256
+ timeout;
257
+ elapsed;
258
+ constructor(timeout, elapsed) {
259
+ super(`Cascade timed out after ${elapsed}ms (limit: ${timeout}ms)`);
260
+ this.name = 'CascadeTimeout';
261
+ this.timeout = timeout;
262
+ this.elapsed = elapsed;
263
+ }
264
+ }
265
+ // ============================================================================
266
+ // DurableCascadeStep
267
+ // ============================================================================
268
+ /**
269
+ * DurableCascadeStep - Durable tiered execution with cascade pattern
270
+ *
271
+ * Combines the cascade pattern (code -> generative -> agentic -> human)
272
+ * with Cloudflare Workflows durability guarantees.
273
+ */
274
+ export class DurableCascadeStep {
275
+ /** Cascade name */
276
+ name;
277
+ /** Cascade configuration */
278
+ config;
279
+ /** AI binding (injected at runtime) */
280
+ ai;
281
+ /** Human review handler */
282
+ humanReviewHandler;
283
+ constructor(name, config) {
284
+ this.name = name;
285
+ this.config = config;
286
+ }
287
+ /**
288
+ * Set the AI binding for generative/agentic tiers
289
+ */
290
+ setAi(ai) {
291
+ this.ai = ai;
292
+ return this;
293
+ }
294
+ /**
295
+ * Set the human review handler
296
+ */
297
+ setHumanReviewHandler(handler) {
298
+ this.humanReviewHandler = handler;
299
+ return this;
300
+ }
301
+ /**
302
+ * Run the cascade with durable execution
303
+ */
304
+ async run(workflowStep, input, options) {
305
+ const ai = options?.ai ?? this.ai;
306
+ const humanReviewHandler = options?.humanReviewHandler ?? this.humanReviewHandler;
307
+ // Create cascade context for tracing
308
+ const cascadeContext = createCascadeContext({ name: this.name });
309
+ const startTime = Date.now();
310
+ const history = [];
311
+ const skippedTiers = [];
312
+ const tierDurations = {};
313
+ const previousErrors = [];
314
+ let checkpointsCreated = 0;
315
+ const checkpointIds = [];
316
+ // Emit cascade start event
317
+ this.emitEvent({
318
+ who: this.config.actor ?? 'system',
319
+ what: 'cascade-start',
320
+ when: startTime,
321
+ where: this.name,
322
+ how: {
323
+ status: 'running',
324
+ metadata: { input },
325
+ },
326
+ });
327
+ // Execute tiers in order
328
+ for (const tier of CASCADE_TIER_ORDER) {
329
+ const handler = this.getTierHandler(tier);
330
+ // Skip unconfigured tiers
331
+ if (!handler) {
332
+ skippedTiers.push(tier);
333
+ continue;
334
+ }
335
+ // Check total timeout
336
+ if (this.config.totalTimeout) {
337
+ const elapsed = Date.now() - startTime;
338
+ if (elapsed >= this.config.totalTimeout) {
339
+ throw new CascadeTimeout(this.config.totalTimeout, elapsed);
340
+ }
341
+ }
342
+ // Create tier context
343
+ const tierContext = {
344
+ ai: ai ?? this.createMockAi(),
345
+ previousErrors: [...previousErrors],
346
+ requestHumanReview: async (request) => {
347
+ if (humanReviewHandler) {
348
+ return humanReviewHandler(request);
349
+ }
350
+ const reviewId = `review-${Date.now()}-${Math.random().toString(36).slice(2)}`;
351
+ return { reviewId, status: 'pending-human' };
352
+ },
353
+ cascadeContext,
354
+ input,
355
+ tier,
356
+ };
357
+ // Execute tier with durability
358
+ const tierResult = await this.executeTier(workflowStep, tier, handler, input, tierContext, cascadeContext);
359
+ // Record checkpoint
360
+ checkpointsCreated++;
361
+ checkpointIds.push(`${this.name}-${tier}-${Date.now()}`);
362
+ history.push(tierResult);
363
+ tierDurations[tier] = tierResult.duration;
364
+ // If tier succeeded, we're done
365
+ if (tierResult.success && tierResult.value !== undefined) {
366
+ // Check custom success condition
367
+ const tierConfig = this.config.tierConfig?.[tier];
368
+ if (tierConfig?.successCondition && !tierConfig.successCondition(tierResult.value)) {
369
+ // Success condition not met, treat as failure and continue
370
+ previousErrors.push({
371
+ tier,
372
+ error: 'Success condition not met',
373
+ attempt: tierResult.attempts ?? 1,
374
+ });
375
+ continue;
376
+ }
377
+ const endTime = Date.now();
378
+ this.emitEvent({
379
+ who: this.config.actor ?? 'system',
380
+ what: 'cascade-complete',
381
+ when: endTime,
382
+ where: this.name,
383
+ how: {
384
+ status: 'completed',
385
+ duration: endTime - startTime,
386
+ metadata: { tier, value: tierResult.value },
387
+ },
388
+ });
389
+ return {
390
+ value: tierResult.value,
391
+ tier,
392
+ history,
393
+ skippedTiers,
394
+ context: cascadeContext,
395
+ metrics: {
396
+ totalDuration: endTime - startTime,
397
+ tierDurations,
398
+ },
399
+ };
400
+ }
401
+ // Record error for next tier
402
+ if (tierResult.error) {
403
+ previousErrors.push({
404
+ tier,
405
+ error: tierResult.error.message,
406
+ attempt: tierResult.attempts ?? 1,
407
+ });
408
+ // Emit escalation event
409
+ const nextTier = this.getNextConfiguredTier(tier);
410
+ if (nextTier) {
411
+ this.emitEvent({
412
+ who: this.config.actor ?? 'system',
413
+ what: `escalate-to-${nextTier}`,
414
+ when: Date.now(),
415
+ where: this.name,
416
+ why: tierResult.error.message,
417
+ how: {
418
+ status: 'running',
419
+ metadata: { fromTier: tier, toTier: nextTier },
420
+ },
421
+ });
422
+ }
423
+ }
424
+ }
425
+ // All tiers failed
426
+ const endTime = Date.now();
427
+ this.emitEvent({
428
+ who: this.config.actor ?? 'system',
429
+ what: 'cascade-failed',
430
+ when: endTime,
431
+ where: this.name,
432
+ why: 'All tiers failed',
433
+ how: {
434
+ status: 'failed',
435
+ duration: endTime - startTime,
436
+ },
437
+ });
438
+ throw new AllTiersFailed(history);
439
+ }
440
+ /**
441
+ * Execute a single tier with durability
442
+ */
443
+ async executeTier(workflowStep, tier, handler, input, tierContext, cascadeContext) {
444
+ const tierStartTime = Date.now();
445
+ const tierConfig = this.config.tierConfig?.[tier];
446
+ const timeout = this.config.timeouts?.[tier] ?? DEFAULT_CASCADE_TIMEOUTS[tier];
447
+ const maxRetries = tierConfig?.retries?.limit ?? 0;
448
+ // Record step in cascade context
449
+ const step = recordStep(cascadeContext, tier, {
450
+ actor: this.config.actor ?? 'system',
451
+ action: `execute-${tier}`,
452
+ });
453
+ // Emit tier start event
454
+ this.emitEvent({
455
+ who: this.config.actor ?? 'system',
456
+ what: `tier-${tier}-execute`,
457
+ when: tierStartTime,
458
+ where: this.name,
459
+ how: {
460
+ status: 'running',
461
+ metadata: { tier },
462
+ },
463
+ });
464
+ let lastError;
465
+ let attempts = 0;
466
+ while (attempts <= maxRetries) {
467
+ attempts++;
468
+ try {
469
+ // Execute with timeout using workflow step
470
+ const result = await workflowStep.do(`${this.name}-${tier}-attempt-${attempts}`, timeout !== undefined ? { timeout: `${timeout} milliseconds` } : {}, async () => {
471
+ if (tier === 'code') {
472
+ return handler(input);
473
+ }
474
+ else {
475
+ return handler(input, tierContext);
476
+ }
477
+ });
478
+ const duration = Date.now() - tierStartTime;
479
+ // Mark step complete
480
+ step.complete();
481
+ // Emit tier success event
482
+ this.emitEvent({
483
+ who: this.config.actor ?? 'system',
484
+ what: `tier-${tier}-execute`,
485
+ when: Date.now(),
486
+ where: this.name,
487
+ how: {
488
+ status: 'completed',
489
+ duration,
490
+ metadata: { tier, result, attempts },
491
+ },
492
+ });
493
+ return {
494
+ tier,
495
+ success: true,
496
+ value: result,
497
+ duration,
498
+ attempts,
499
+ };
500
+ }
501
+ catch (error) {
502
+ lastError = error instanceof Error ? error : new Error(String(error));
503
+ // Check if it's a timeout error
504
+ const isTimeout = lastError.message.includes('timed out') ||
505
+ lastError.message.includes('timeout') ||
506
+ lastError.name === 'TimeoutError';
507
+ // Call custom error handler if provided
508
+ if (tierConfig?.onError) {
509
+ tierConfig.onError(lastError, tier);
510
+ }
511
+ // If we've exhausted retries, stop
512
+ if (attempts > maxRetries) {
513
+ break;
514
+ }
515
+ // Wait before retry with backoff
516
+ if (tierConfig?.retries?.delay) {
517
+ const backoff = tierConfig.retries.backoff ?? 'constant';
518
+ let delay = tierConfig.retries.delay;
519
+ if (backoff === 'exponential') {
520
+ delay = tierConfig.retries.delay * Math.pow(2, attempts - 1);
521
+ }
522
+ else if (backoff === 'linear') {
523
+ delay = tierConfig.retries.delay * attempts;
524
+ }
525
+ await workflowStep.sleep(`${this.name}-${tier}-retry-wait-${attempts}`, delay);
526
+ }
527
+ }
528
+ }
529
+ const duration = Date.now() - tierStartTime;
530
+ const isTimeout = lastError?.message.includes('timed out') ||
531
+ lastError?.message.includes('timeout') ||
532
+ lastError?.name === 'TimeoutError';
533
+ // Mark step failed
534
+ if (lastError) {
535
+ step.fail(lastError);
536
+ }
537
+ // Emit tier failure event
538
+ this.emitEvent({
539
+ who: this.config.actor ?? 'system',
540
+ what: `tier-${tier}-execute`,
541
+ when: Date.now(),
542
+ where: this.name,
543
+ ...(lastError?.message !== undefined && { why: lastError.message }),
544
+ how: {
545
+ status: 'failed',
546
+ duration,
547
+ metadata: { tier, error: lastError?.message, attempts },
548
+ },
549
+ });
550
+ return {
551
+ tier,
552
+ success: false,
553
+ ...(lastError !== undefined && { error: lastError }),
554
+ timedOut: isTimeout,
555
+ duration,
556
+ attempts,
557
+ };
558
+ }
559
+ /**
560
+ * Get the handler for a tier
561
+ */
562
+ getTierHandler(tier) {
563
+ switch (tier) {
564
+ case 'code':
565
+ return this.config.code;
566
+ case 'generative':
567
+ return this.config.generative;
568
+ case 'agentic':
569
+ return this.config.agentic;
570
+ case 'human':
571
+ return this.config.human;
572
+ default:
573
+ return undefined;
574
+ }
575
+ }
576
+ /**
577
+ * Get the next configured tier
578
+ */
579
+ getNextConfiguredTier(currentTier) {
580
+ const currentIndex = CASCADE_TIER_ORDER.indexOf(currentTier);
581
+ for (let i = currentIndex + 1; i < CASCADE_TIER_ORDER.length; i++) {
582
+ const tier = CASCADE_TIER_ORDER[i];
583
+ if (tier && this.getTierHandler(tier)) {
584
+ return tier;
585
+ }
586
+ }
587
+ return undefined;
588
+ }
589
+ /**
590
+ * Emit a 5W+H event
591
+ */
592
+ emitEvent(event) {
593
+ if (this.config.onEvent) {
594
+ this.config.onEvent(event);
595
+ }
596
+ }
597
+ /**
598
+ * Create a mock AI binding for testing
599
+ */
600
+ createMockAi() {
601
+ return {
602
+ run: async () => ({ response: 'mock response' }),
603
+ };
604
+ }
605
+ }
606
+ //# sourceMappingURL=durable-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-step.js","sourceRoot":"","sources":["../../src/worker/durable-step.ts"],"names":[],"mappings":"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"}