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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +8 -1
- package/README.md +2 -0
- package/dist/barrier.d.ts +6 -0
- package/dist/barrier.d.ts.map +1 -1
- package/dist/barrier.js +45 -7
- package/dist/barrier.js.map +1 -1
- package/dist/cascade-context.d.ts.map +1 -1
- package/dist/cascade-context.js +25 -25
- package/dist/cascade-context.js.map +1 -1
- package/dist/cascade-executor.d.ts.map +1 -1
- package/dist/cascade-executor.js +1 -1
- package/dist/cascade-executor.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +23 -7
- 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/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/graph/topological-sort.d.ts.map +1 -1
- package/dist/graph/topological-sort.js +5 -5
- package/dist/graph/topological-sort.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -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.map +1 -1
- package/dist/on.js +3 -3
- 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 +25 -0
- package/dist/timer-registry.d.ts.map +1 -1
- package/dist/timer-registry.js +42 -8
- package/dist/timer-registry.js.map +1 -1
- package/dist/types.d.ts +17 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -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 +132 -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 +30 -13
- package/src/__tests__/digital-objects-adapter.test.ts +274 -0
- package/src/__tests__/durable-workflow.test.ts +297 -0
- package/src/barrier.ts +48 -7
- package/src/cascade-context.ts +36 -29
- package/src/cascade-executor.ts +3 -2
- package/src/context.ts +41 -12
- package/src/cron-parser.ts +347 -0
- package/src/cron-scheduler.ts +239 -0
- package/src/database-context.ts +658 -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/graph/topological-sort.ts +6 -8
- package/src/index.ts +69 -0
- package/src/logger.ts +148 -0
- package/src/on.ts +8 -9
- package/src/runtime.ts +436 -0
- package/src/send.ts +4 -5
- package/src/telemetry.ts +577 -0
- package/src/timer-registry.ts +44 -10
- package/src/types.ts +32 -17
- 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 +188 -351
- package/test/barrier-join.test.ts +32 -24
- package/test/cascade-executor.test.ts +9 -16
- 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/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/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 +30 -21
- package/test/send-race-conditions.test.ts +30 -40
- 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 -169
- package/LICENSE +0 -21
- 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,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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AAEH,OAAO,EAAE,WAAW,EAAqC,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAoL/F,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,mBAAmB;IAGf,KAAK,CAAQ;IACb,OAAO,CAAwB;IAC/B,MAAM,GAAgC,IAAI,GAAG,EAAE,CAAA;IAC/C,cAAc,GAAoB,EAAE,CAAA;IACpC,iBAAiB,GAAqB,EAAE,CAAA;IACxC,YAAY,GAAkB,IAAI,CAAA;IAClC,oBAAoB,GAAG,CAAC,CAAA;IAEhC,0BAA0B;IAClB,aAAa,GAAkB,IAAI,CAAA;IACnC,cAAc,GAAyC,IAAI,CAAA;IAEnE,6BAA6B;IACrB,gBAAgB,GAAkB,IAAI,CAAA;IACtC,qBAAqB,GAAkB,IAAI,CAAA;IAC3C,YAAY,GAAkB,IAAI,CAAA;IAClC,gBAAgB,GAAkB,IAAI,CAAA;IAE9C,YAAY,IAAY,EAAE,MAA8B;QACtD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC9C,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACvB,CAAC;IACH,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,yDAAyD;IAEzD,IAAI,CACF,UAAwC,EACxC,UAA6E,EAC7E,OAA2D;QAE3D,IAAI,IAAY,CAAA;QAChB,IAAI,EAAqD,CAAA;QACzD,IAAI,UAAkC,CAAA;QACtC,IAAI,WAA4C,CAAA;QAEhD,IAAI,UAAU,YAAY,WAAW,EAAE,CAAC;YACtC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;YACtB,EAAE,GAAG,UAAU,CAAC,EAAkE,CAAA;YAClF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAA;YAC9B,WAAW,GAAG,UAAU,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,UAAU,CAAA;YACjB,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrC,EAAE,GAAG,UAAU,CAAA;YACjB,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,UAAU,CAAA;gBACvB,EAAE,GAAG,OAAQ,CAAA;YACf,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,OAAO,GAA2B;YACtC,IAAI;YACJ,EAAE;YACF,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YACvD,YAAY,EAAE,EAAE;YAChB,WAAW,EACT,WAAW;gBACX,IAAI,WAAW,CACb,IAAI,EACJ,UAAU,IAAI,EAAE,EAChB,EAA8D,CAC/D;SACJ,CAAA;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAyB,CAAC,CAAA;QAChD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAExB,OAAO,IAAI,CAAA;IACb,CAAC;IAGD,SAAS,CAAC,GAAG,KAA4D;QACvE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;QAC3D,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACzD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,YAAY,aAAa,CAAC,CAAA;QAC1D,CAAC;QAED,kBAAkB;QAClB,IAAI,eAAe,GAAa,EAAE,CAAA;QAClC,IAAI,iBAAgD,CAAA;QAEpD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAQ;YAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC3B,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,eAAe,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;YAC9B,CAAC;iBAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC1E,iBAAiB,GAAG,GAAwB,CAAA;YAC9C,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,OAAO;gBACb,GAAG,CAAC,iBAAiB,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;aACvE,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CAAC,QAAyB;QAC/B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;QAC3D,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CAAC,MAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;QACzD,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CAAC,OAA4E;QAClF,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;QAC7D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,YAAY,GAAG,OAAO,CAAA;QAChC,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,kEAAkE;IAElE,EAAE,CAAc,KAAa;QAC3B,qCAAqC;QACrC,MAAM,UAAU,GAAG,kCAAkC,CAAA;QACrD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,wDAAwD;YACxD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;YAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;YAC1B,OAAO,IAAuC,CAAA;QAChD,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;QAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,OAAO,IAAuC,CAAA;IAChD,CAAC;IAED,MAAM,CAAc,SAAgC;QAClD,IAAI,CAAC,cAAc,GAAG,SAAwC,CAAA;QAC9D,OAAO,IAAuC,CAAA;IAChD,CAAC;IAED,qEAAqE;IAErE,KAAK,CAAC,eAAgC;QACpC,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC,qBAAqB,GAAG,eAAe,CAAA;YAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAA;YACvC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAA;QACnC,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;QAC5B,OAAO,IAA8D,CAAA;IACvE,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,GAAG,GAAG,IAAI,CAAC,qBAAqB,UAAU,CAAA;QACjE,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,GAAG,GAAG,IAAI,CAAC,qBAAqB,QAAQ,CAAA;QAC/D,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,GAAG,GAAG,IAAI,CAAC,qBAAqB,OAAO,CAAA;QAC9D,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,GAAG,GAAG,IAAI,CAAC,qBAAqB,UAAU,CAAA;QACjE,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,EAAE,CAAC,IAAY;QACb,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACH,EAAE,CAAC,YAA8D;QAC/D,uBAAuB;QACvB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,kCAAkC,CAAA;YACrD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,aAAa,+BAA+B,CACjF,CAAA;YACH,CAAC;YAED,IAAI,QAAgB,CAAA;YACpB,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;gBACvC,uBAAuB;gBACvB,QAAQ,GAAG,cAAc,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI;qBACpE,oBAAoB,EAAE,CAAA;gBACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACxB,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,YAA2E;oBAC/E,YAAY,EAAE,EAAE;iBACjB,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,YAAY,CAAA;YACzB,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBACvB,KAAK,EAAE,IAAI,CAAC,aAAa;gBACzB,QAAQ;gBACR,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;aACrE,CAAC,CAAA;YAEF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;YAC1B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACnC,IAAI,QAAgB,CAAA;YACpB,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;gBACvC,uBAAuB;gBACvB,QAAQ,GAAG,uBAAuB,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAA;gBAC/D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACxB,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,YAA2E;oBAC/E,YAAY,EAAE,EAAE;iBACjB,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,YAAY,CAAA;YACzB,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;gBAC1B,QAAQ,EAAE,IAAI,CAAC,gBAAgB;gBAC/B,GAAG,CAAC,IAAI,CAAC,qBAAqB,KAAK,IAAI,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBACjF,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC9D,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1E,QAAQ;aACT,CAAC,CAAA;YAEF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;YAC5B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAA;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;YACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;IAED,yDAAyD;IAEzD,KAAK;QACH,mDAAmD;QACnD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,CAAC,QAAQ,+BAA+B,CAAC,CAAA;YAC3E,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,CAAC,QAAQ,kCAAkC,CAAC,CAAA;YAC9E,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAA;QACnD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YACpD,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAE/B,8BAA8B;YAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,yBAAyB,IAAI,GAAG,CAAC,CAAA;gBACrE,CAAC;YACH,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAA;QAEhD,2BAA2B;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAA;QAE5D,0BAA0B;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QACrE,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAA;QAC9C,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAEpD,MAAM,QAAQ,GAAkB;YAC9B,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;gBACtB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;gBACpC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;aAC3C,CAAC;YACF,eAAe,EAAE,IAAI,GAAG,CAAC,eAAe,CAAC;YACzC,cAAc;YACd,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7D,sBAAsB,EAAE,IAAI;YAC5B,OAAO,EAAE,KAAK,EAAE,KAAe,EAAE,EAAE;gBACjC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;YAC5E,CAAC;SACF,CAAA;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,4DAA4D;IAEpD,0BAA0B,CAAC,KAA4B;QAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QACjC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;QAExC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,IAAc,EAAQ,EAAE;YACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjB,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAExB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YAClC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;gBAC3B,CAAC;qBAAM,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnC,iCAAiC;oBACjC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;wBACjB,MAAM,IAAI,KAAK,CACb,uCAAuC,IAAI,wCAAwC,CACpF,CAAA;oBACH,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBACvF,CAAC;YACH,CAAC;YAED,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC,CAAA;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,KAA4B;QAClD,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;QAE9B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;YACnC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;YACjD,CAAC;YACD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAM;YAE7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAEd,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YAClC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,KAAK,CAAC,GAAG,CAAC,CAAA;YACZ,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC,CAAA;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,CAAA;QACb,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,KAAuB,EACvB,eAAsC,EACtC,cAAwB,EACxB,KAAe;QAEf,MAAM,OAAO,GAA4B,EAAE,CAAA;QAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAEtD,MAAM,GAAG,GAAqB;YAC5B,KAAK;YACL,OAAO;YACP,aAAa,EAAE,CAAc,QAAgB,EAAK,EAAE;gBAClD,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,6BAA6B,CAAC,CAAA;gBACjE,CAAC;gBACD,OAAO,OAAO,CAAC,QAAQ,CAAM,CAAA;YAC/B,CAAC;SACF,CAAA;QAED,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;QACnC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;QACpC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAA;QAEvC,wCAAwC;QACxC,OAAO,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxB,+DAA+D;YAC/D,MAAM,KAAK,GAAa,EAAE,CAAA;YAC1B,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;gBAChD,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACtB,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;YAChE,CAAC;YAED,kCAAkC;YAClC,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAChD,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAA;gBAEnC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;oBACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAA;gBAC5B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAc,EAAE,GAAG,CAAC,CAAA;oBAClE,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,CAAA;oBACb,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;oBAC3B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;oBACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;gBAC1B,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QACjC,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAuB;QACtC,yCAAyC;QACzC,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;CACF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,eAAe;IAC1B,oBAAoB;IACX,IAAI,CAAQ;IACrB,6BAA6B;IACpB,MAAM,CAAwB;IAE/B,IAAI,CAAqB;IAEjC,YAAoB,IAAY,EAAE,MAA8B;QAC9D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACtB,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACnD,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,IAAY,EAAE,MAA8B;QACxD,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC;IAeD,IAAI,CACF,UAAwC,EACxC,UAA6E,EAC7E,OAA2D;QAE3D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IACxD,CAAC;IAED;;OAEG;IACH,EAAE,CAAc,KAAa;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAI,KAAK,CAAC,CAAA;IAC/B,CAAC;IAOD,KAAK,CAAC,eAAgC;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC;IAQD,SAAS,CAAC,WAA8B,EAAE,OAA2B;QACnE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,4BAA4B;AAC5B,OAAO,EAAE,WAAW,EAAqC,CAAA"}
|