ai-workflows 2.1.1 → 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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +17 -1
- package/README.md +305 -184
- package/dist/barrier.d.ts +159 -0
- package/dist/barrier.d.ts.map +1 -0
- package/dist/barrier.js +377 -0
- package/dist/barrier.js.map +1 -0
- package/dist/cascade-context.d.ts +149 -0
- package/dist/cascade-context.d.ts.map +1 -0
- package/dist/cascade-context.js +324 -0
- package/dist/cascade-context.js.map +1 -0
- package/dist/cascade-executor.d.ts +196 -0
- package/dist/cascade-executor.d.ts.map +1 -0
- package/dist/cascade-executor.js +384 -0
- package/dist/cascade-executor.js.map +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -8
- package/dist/context.js.map +1 -1
- package/dist/cron-parser.d.ts +65 -0
- package/dist/cron-parser.d.ts.map +1 -0
- package/dist/cron-parser.js +294 -0
- package/dist/cron-parser.js.map +1 -0
- package/dist/cron-scheduler.d.ts +117 -0
- package/dist/cron-scheduler.d.ts.map +1 -0
- package/dist/cron-scheduler.js +176 -0
- package/dist/cron-scheduler.js.map +1 -0
- package/dist/database-context.d.ts +184 -0
- package/dist/database-context.d.ts.map +1 -0
- package/dist/database-context.js +428 -0
- package/dist/database-context.js.map +1 -0
- package/dist/dependency-graph.d.ts +157 -0
- package/dist/dependency-graph.d.ts.map +1 -0
- package/dist/dependency-graph.js +382 -0
- package/dist/dependency-graph.js.map +1 -0
- package/dist/digital-objects-adapter.d.ts +159 -0
- package/dist/digital-objects-adapter.d.ts.map +1 -0
- package/dist/digital-objects-adapter.js +229 -0
- package/dist/digital-objects-adapter.js.map +1 -0
- package/dist/durable-execution-cloudflare.d.ts +427 -0
- package/dist/durable-execution-cloudflare.d.ts.map +1 -0
- package/dist/durable-execution-cloudflare.js +510 -0
- package/dist/durable-execution-cloudflare.js.map +1 -0
- package/dist/durable-execution.d.ts +482 -0
- package/dist/durable-execution.d.ts.map +1 -0
- package/dist/durable-execution.js +594 -0
- package/dist/durable-execution.js.map +1 -0
- package/dist/durable-workflow.d.ts +176 -0
- package/dist/durable-workflow.d.ts.map +1 -0
- package/dist/durable-workflow.js +552 -0
- package/dist/durable-workflow.js.map +1 -0
- package/dist/every.d.ts +31 -2
- package/dist/every.d.ts.map +1 -1
- package/dist/every.js +63 -32
- package/dist/every.js.map +1 -1
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +8 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/topological-sort.d.ts +121 -0
- package/dist/graph/topological-sort.d.ts.map +1 -0
- package/dist/graph/topological-sort.js +292 -0
- package/dist/graph/topological-sort.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +101 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +115 -0
- package/dist/logger.js.map +1 -0
- package/dist/on.d.ts +35 -10
- package/dist/on.d.ts.map +1 -1
- package/dist/on.js +53 -19
- package/dist/on.js.map +1 -1
- package/dist/runtime.d.ts +169 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +275 -0
- package/dist/runtime.js.map +1 -0
- package/dist/send.d.ts.map +1 -1
- package/dist/send.js +4 -3
- package/dist/send.js.map +1 -1
- package/dist/telemetry.d.ts +150 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +388 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/timer-registry.d.ts +77 -0
- package/dist/timer-registry.d.ts.map +1 -0
- package/dist/timer-registry.js +154 -0
- package/dist/timer-registry.js.map +1 -0
- package/dist/types.d.ts +105 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -1
- package/dist/types.js.map +1 -1
- package/dist/worker/durable-step.d.ts +481 -0
- package/dist/worker/durable-step.d.ts.map +1 -0
- package/dist/worker/durable-step.js +606 -0
- package/dist/worker/durable-step.js.map +1 -0
- package/dist/worker/index.d.ts +106 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +124 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/state-adapter.d.ts +230 -0
- package/dist/worker/state-adapter.d.ts.map +1 -0
- package/dist/worker/state-adapter.js +409 -0
- package/dist/worker/state-adapter.js.map +1 -0
- package/dist/worker/topological-executor.d.ts +282 -0
- package/dist/worker/topological-executor.d.ts.map +1 -0
- package/dist/worker/topological-executor.js +396 -0
- package/dist/worker/topological-executor.js.map +1 -0
- package/dist/worker/workflow-builder.d.ts +286 -0
- package/dist/worker/workflow-builder.d.ts.map +1 -0
- package/dist/worker/workflow-builder.js +565 -0
- package/dist/worker/workflow-builder.js.map +1 -0
- package/dist/worker.d.ts +800 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +2428 -0
- package/dist/worker.js.map +1 -0
- package/dist/workflow-builder.d.ts +287 -0
- package/dist/workflow-builder.d.ts.map +1 -0
- package/dist/workflow-builder.js +762 -0
- package/dist/workflow-builder.js.map +1 -0
- package/dist/workflow.d.ts +14 -30
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +136 -292
- package/dist/workflow.js.map +1 -1
- package/examples/01-ecommerce-order-pipeline.ts +358 -0
- package/examples/02-content-moderation-cascade.ts +454 -0
- package/examples/03-scheduled-reporting-dependencies.ts +479 -0
- package/examples/04-database-persistence.ts +518 -0
- package/examples/README.md +173 -0
- package/package.json +21 -4
- package/src/__tests__/digital-objects-adapter.test.ts +274 -0
- package/src/__tests__/durable-workflow.test.ts +297 -0
- package/src/barrier.ts +507 -0
- package/src/cascade-context.ts +495 -0
- package/src/cascade-executor.ts +588 -0
- package/src/context.ts +51 -17
- package/src/cron-parser.ts +347 -0
- package/src/cron-scheduler.ts +239 -0
- package/src/database-context.ts +658 -0
- package/src/dependency-graph.ts +518 -0
- package/src/digital-objects-adapter.ts +351 -0
- package/src/durable-execution-cloudflare.ts +855 -0
- package/src/durable-execution.ts +1042 -0
- package/src/durable-workflow.ts +717 -0
- package/src/every.ts +104 -35
- package/src/graph/index.ts +19 -0
- package/src/graph/topological-sort.ts +412 -0
- package/src/index.ts +147 -0
- package/src/logger.ts +148 -0
- package/src/on.ts +81 -26
- package/src/runtime.ts +436 -0
- package/src/send.ts +4 -5
- package/src/telemetry.ts +577 -0
- package/src/timer-registry.ts +179 -0
- package/src/types.ts +146 -10
- package/src/worker/durable-step.ts +976 -0
- package/src/worker/index.ts +216 -0
- package/src/worker/state-adapter.ts +589 -0
- package/src/worker/topological-executor.ts +625 -0
- package/src/worker/workflow-builder.ts +871 -0
- package/src/worker.ts +2906 -0
- package/src/workflow-builder.ts +1068 -0
- package/src/workflow.ts +199 -355
- package/test/barrier-join.test.ts +442 -0
- package/test/barrier-unhandled-rejections.test.ts +359 -0
- package/test/cascade-context.test.ts +390 -0
- package/test/cascade-executor.test.ts +852 -0
- package/test/cron-parser.test.ts +314 -0
- package/test/cron-scheduler.test.ts +291 -0
- package/test/database-context.test.ts +770 -0
- package/test/db-provider-adapter.test.ts +862 -0
- package/test/dependency-graph.test.ts +512 -0
- package/test/durable-execution-cloudflare.test.ts +606 -0
- package/test/durable-execution-in-process.test.ts +286 -0
- package/test/durable-execution.test.ts +247 -0
- package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
- package/test/graph/topological-sort.test.ts +586 -0
- package/test/integration.test.ts +442 -0
- package/test/rpc-surface.test.ts +946 -0
- package/test/runtime.test.ts +262 -0
- package/test/schedule-timer-cleanup.test.ts +353 -0
- package/test/send-race-conditions.test.ts +400 -0
- package/test/type-safety-every.test.ts +303 -0
- package/test/worker/durable-cascade.test.ts +1117 -0
- package/test/worker/durable-step.test.ts +723 -0
- package/test/worker/topological-executor.test.ts +1240 -0
- package/test/worker/workflow-builder.test.ts +1067 -0
- package/test/worker.test.ts +608 -0
- package/test/workflow-builder.test.ts +1670 -0
- package/test/workflow-cron.test.ts +256 -0
- package/test/workflow-state-adapter.test.ts +923 -0
- package/test/workflow.test.ts +25 -22
- package/tsconfig.json +3 -1
- package/vitest.config.ts +38 -1
- package/vitest.workers.config.ts +44 -0
- package/wrangler.jsonc +22 -0
- package/.turbo/turbo-test.log +0 -7
- package/src/context.js +0 -83
- package/src/every.js +0 -267
- package/src/index.js +0 -71
- package/src/on.js +0 -79
- package/src/send.js +0 -111
- package/src/types.js +0 -4
- package/src/workflow.js +0 -455
- package/test/context.test.js +0 -116
- package/test/every.test.js +0 -282
- package/test/on.test.js +0 -80
- package/test/send.test.js +0 -89
- package/test/workflow.test.js +0 -224
- 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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"}
|