yaml-flow 1.0.0 → 2.0.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 (50) hide show
  1. package/README.md +486 -255
  2. package/dist/constants-D1fTEbbM.d.cts +330 -0
  3. package/dist/constants-D1fTEbbM.d.ts +330 -0
  4. package/dist/event-graph/index.cjs +895 -0
  5. package/dist/event-graph/index.cjs.map +1 -0
  6. package/dist/event-graph/index.d.cts +53 -0
  7. package/dist/event-graph/index.d.ts +53 -0
  8. package/dist/event-graph/index.js +855 -0
  9. package/dist/event-graph/index.js.map +1 -0
  10. package/dist/index.cjs +1128 -312
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +3 -2
  13. package/dist/index.d.ts +3 -2
  14. package/dist/index.js +1093 -306
  15. package/dist/index.js.map +1 -1
  16. package/dist/step-machine/index.cjs +513 -0
  17. package/dist/step-machine/index.cjs.map +1 -0
  18. package/dist/step-machine/index.d.cts +77 -0
  19. package/dist/step-machine/index.d.ts +77 -0
  20. package/dist/step-machine/index.js +502 -0
  21. package/dist/step-machine/index.js.map +1 -0
  22. package/dist/stores/file.cjs.map +1 -1
  23. package/dist/stores/file.d.cts +4 -4
  24. package/dist/stores/file.d.ts +4 -4
  25. package/dist/stores/file.js.map +1 -1
  26. package/dist/stores/index.cjs +232 -0
  27. package/dist/stores/index.cjs.map +1 -0
  28. package/dist/stores/index.d.cts +4 -0
  29. package/dist/stores/index.d.ts +4 -0
  30. package/dist/stores/index.js +228 -0
  31. package/dist/stores/index.js.map +1 -0
  32. package/dist/stores/localStorage.cjs.map +1 -1
  33. package/dist/stores/localStorage.d.cts +4 -4
  34. package/dist/stores/localStorage.d.ts +4 -4
  35. package/dist/stores/localStorage.js.map +1 -1
  36. package/dist/stores/memory.cjs.map +1 -1
  37. package/dist/stores/memory.d.cts +4 -4
  38. package/dist/stores/memory.d.ts +4 -4
  39. package/dist/stores/memory.js.map +1 -1
  40. package/dist/types-FZ_eyErS.d.cts +115 -0
  41. package/dist/types-FZ_eyErS.d.ts +115 -0
  42. package/package.json +16 -6
  43. package/dist/core/index.cjs +0 -557
  44. package/dist/core/index.cjs.map +0 -1
  45. package/dist/core/index.d.cts +0 -102
  46. package/dist/core/index.d.ts +0 -102
  47. package/dist/core/index.js +0 -549
  48. package/dist/core/index.js.map +0 -1
  49. package/dist/types-BoWndaAJ.d.cts +0 -237
  50. package/dist/types-BoWndaAJ.d.ts +0 -237
@@ -0,0 +1,513 @@
1
+ 'use strict';
2
+
3
+ // src/step-machine/reducer.ts
4
+ function applyStepResult(flow, state, stepName, stepResult) {
5
+ const stepConfig = flow.steps[stepName];
6
+ if (!stepConfig) {
7
+ throw new Error(`Step "${stepName}" not found in flow configuration`);
8
+ }
9
+ if (stepResult.result === "failure" && stepConfig.retry) {
10
+ const retryCount = state.retryCounts[stepName] ?? 0;
11
+ if (retryCount < stepConfig.retry.max_attempts) {
12
+ return {
13
+ newState: {
14
+ ...state,
15
+ retryCounts: {
16
+ ...state.retryCounts,
17
+ [stepName]: retryCount + 1
18
+ },
19
+ updatedAt: Date.now()
20
+ },
21
+ nextStep: stepName,
22
+ isTerminal: false,
23
+ isCircuitBroken: false,
24
+ shouldRetry: true
25
+ };
26
+ }
27
+ }
28
+ const nextStep = stepConfig.transitions[stepResult.result];
29
+ if (!nextStep) {
30
+ throw new Error(
31
+ `No transition defined for result "${stepResult.result}" in step "${stepName}"`
32
+ );
33
+ }
34
+ const isTerminal = !!flow.terminal_states[nextStep];
35
+ return {
36
+ newState: {
37
+ ...state,
38
+ currentStep: nextStep,
39
+ stepHistory: [...state.stepHistory, stepName],
40
+ retryCounts: {
41
+ ...state.retryCounts,
42
+ [stepName]: 0
43
+ },
44
+ updatedAt: Date.now()
45
+ },
46
+ nextStep,
47
+ isTerminal,
48
+ isCircuitBroken: false,
49
+ shouldRetry: false
50
+ };
51
+ }
52
+ function checkCircuitBreaker(flow, state, stepName) {
53
+ const stepConfig = flow.steps[stepName];
54
+ if (!stepConfig?.circuit_breaker) {
55
+ return {
56
+ broken: false,
57
+ newState: {
58
+ ...state,
59
+ iterationCounts: {
60
+ ...state.iterationCounts,
61
+ [stepName]: (state.iterationCounts[stepName] ?? 0) + 1
62
+ },
63
+ updatedAt: Date.now()
64
+ }
65
+ };
66
+ }
67
+ const count = state.iterationCounts[stepName] ?? 0;
68
+ if (count >= stepConfig.circuit_breaker.max_iterations) {
69
+ return {
70
+ broken: true,
71
+ redirectStep: stepConfig.circuit_breaker.on_open,
72
+ newState: {
73
+ ...state,
74
+ currentStep: stepConfig.circuit_breaker.on_open,
75
+ updatedAt: Date.now()
76
+ }
77
+ };
78
+ }
79
+ return {
80
+ broken: false,
81
+ newState: {
82
+ ...state,
83
+ iterationCounts: {
84
+ ...state.iterationCounts,
85
+ [stepName]: count + 1
86
+ },
87
+ updatedAt: Date.now()
88
+ }
89
+ };
90
+ }
91
+ function computeStepInput(flow, stepName, allData) {
92
+ const stepConfig = flow.steps[stepName];
93
+ if (!stepConfig) {
94
+ throw new Error(`Step "${stepName}" not found`);
95
+ }
96
+ if (stepConfig.expects_data) {
97
+ const input = {};
98
+ for (const key of stepConfig.expects_data) {
99
+ input[key] = allData[key];
100
+ }
101
+ return input;
102
+ }
103
+ return { ...allData };
104
+ }
105
+ function extractReturnData(returnArtifacts, allData) {
106
+ if (returnArtifacts === false || returnArtifacts === void 0) {
107
+ return {};
108
+ }
109
+ if (typeof returnArtifacts === "string") {
110
+ return { [returnArtifacts]: allData[returnArtifacts] };
111
+ }
112
+ if (Array.isArray(returnArtifacts)) {
113
+ const result = {};
114
+ for (const key of returnArtifacts) {
115
+ result[key] = allData[key];
116
+ }
117
+ return result;
118
+ }
119
+ return {};
120
+ }
121
+ function createInitialState(flow, runId) {
122
+ const now = Date.now();
123
+ return {
124
+ runId,
125
+ flowId: flow.id ?? "unnamed",
126
+ currentStep: flow.settings.start_step,
127
+ status: "running",
128
+ stepHistory: [],
129
+ iterationCounts: {},
130
+ retryCounts: {},
131
+ startedAt: now,
132
+ updatedAt: now
133
+ };
134
+ }
135
+
136
+ // src/stores/memory.ts
137
+ var MemoryStore = class {
138
+ runs = /* @__PURE__ */ new Map();
139
+ data = /* @__PURE__ */ new Map();
140
+ async saveRunState(runId, state) {
141
+ this.runs.set(runId, { ...state });
142
+ }
143
+ async loadRunState(runId) {
144
+ const state = this.runs.get(runId);
145
+ return state ? { ...state } : null;
146
+ }
147
+ async deleteRunState(runId) {
148
+ this.runs.delete(runId);
149
+ this.data.delete(runId);
150
+ }
151
+ async setData(runId, key, value) {
152
+ if (!this.data.has(runId)) {
153
+ this.data.set(runId, {});
154
+ }
155
+ const runData = this.data.get(runId);
156
+ runData[key] = value;
157
+ }
158
+ async getData(runId, key) {
159
+ return this.data.get(runId)?.[key];
160
+ }
161
+ async getAllData(runId) {
162
+ return { ...this.data.get(runId) ?? {} };
163
+ }
164
+ async clearData(runId) {
165
+ this.data.delete(runId);
166
+ }
167
+ async listRuns() {
168
+ return Array.from(this.runs.keys());
169
+ }
170
+ /**
171
+ * Clear all data (useful for testing)
172
+ */
173
+ clear() {
174
+ this.runs.clear();
175
+ this.data.clear();
176
+ }
177
+ };
178
+
179
+ // src/step-machine/StepMachine.ts
180
+ function generateRunId() {
181
+ if (typeof crypto !== "undefined" && crypto.randomUUID) {
182
+ return crypto.randomUUID();
183
+ }
184
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
185
+ const r = Math.random() * 16 | 0;
186
+ const v = c === "x" ? r : r & 3 | 8;
187
+ return v.toString(16);
188
+ });
189
+ }
190
+ var StepMachine = class {
191
+ flow;
192
+ handlers;
193
+ store;
194
+ components;
195
+ options;
196
+ listeners = /* @__PURE__ */ new Map();
197
+ aborted = false;
198
+ constructor(flow, handlers, options = {}) {
199
+ this.flow = flow;
200
+ this.handlers = new Map(Object.entries(handlers));
201
+ this.store = options.store ?? new MemoryStore();
202
+ this.components = options.components ?? {};
203
+ this.options = options;
204
+ if (options.signal) {
205
+ options.signal.addEventListener("abort", () => {
206
+ this.aborted = true;
207
+ });
208
+ }
209
+ this.validateFlow();
210
+ }
211
+ validateFlow() {
212
+ const { settings, steps, terminal_states } = this.flow;
213
+ if (!settings?.start_step) {
214
+ throw new Error("Flow must have settings.start_step defined");
215
+ }
216
+ if (!steps || Object.keys(steps).length === 0) {
217
+ throw new Error("Flow must have at least one step defined");
218
+ }
219
+ if (!terminal_states || Object.keys(terminal_states).length === 0) {
220
+ throw new Error("Flow must have at least one terminal_state defined");
221
+ }
222
+ if (!steps[settings.start_step] && !terminal_states[settings.start_step]) {
223
+ throw new Error(`Start step "${settings.start_step}" not found`);
224
+ }
225
+ for (const [stepName, stepConfig] of Object.entries(steps)) {
226
+ for (const [result, target] of Object.entries(stepConfig.transitions)) {
227
+ if (!steps[target] && !terminal_states[target]) {
228
+ throw new Error(
229
+ `Step "${stepName}" transition "${result}" points to unknown step "${target}"`
230
+ );
231
+ }
232
+ }
233
+ }
234
+ }
235
+ on(eventType, listener) {
236
+ if (!this.listeners.has(eventType)) {
237
+ this.listeners.set(eventType, /* @__PURE__ */ new Set());
238
+ }
239
+ this.listeners.get(eventType).add(listener);
240
+ }
241
+ off(eventType, listener) {
242
+ this.listeners.get(eventType)?.delete(listener);
243
+ }
244
+ emit(event) {
245
+ const typeListeners = this.listeners.get(event.type);
246
+ if (typeListeners) {
247
+ for (const listener of typeListeners) {
248
+ try {
249
+ listener(event);
250
+ } catch {
251
+ }
252
+ }
253
+ }
254
+ }
255
+ sleep(ms) {
256
+ return new Promise((resolve) => setTimeout(resolve, ms));
257
+ }
258
+ async run(initialData) {
259
+ const runId = generateRunId();
260
+ let runState = createInitialState(this.flow, runId);
261
+ await this.store.saveRunState(runId, runState);
262
+ if (initialData) {
263
+ for (const [key, value] of Object.entries(initialData)) {
264
+ await this.store.setData(runId, key, value);
265
+ }
266
+ }
267
+ this.emit({
268
+ type: "flow:start",
269
+ runId,
270
+ timestamp: runState.startedAt,
271
+ data: { initialData: initialData ?? {} }
272
+ });
273
+ try {
274
+ return await this.executeLoop(runId, runState);
275
+ } catch (error) {
276
+ const err = error instanceof Error ? error : new Error(String(error));
277
+ this.emit({ type: "flow:error", runId, timestamp: Date.now(), data: { error: err.message } });
278
+ this.options.onError?.(err);
279
+ runState = { ...runState, status: "failed", updatedAt: Date.now() };
280
+ await this.store.saveRunState(runId, runState);
281
+ return {
282
+ runId,
283
+ status: "failed",
284
+ data: await this.store.getAllData(runId),
285
+ finalStep: runState.currentStep,
286
+ stepHistory: runState.stepHistory,
287
+ durationMs: Date.now() - runState.startedAt,
288
+ error: err
289
+ };
290
+ }
291
+ }
292
+ async resume(runId) {
293
+ const runState = await this.store.loadRunState(runId);
294
+ if (!runState) throw new Error(`No run found with ID: ${runId}`);
295
+ if (runState.status === "completed" || runState.status === "failed") {
296
+ throw new Error(`Cannot resume a ${runState.status} run`);
297
+ }
298
+ const updated = { ...runState, status: "running", pausedAt: void 0, updatedAt: Date.now() };
299
+ await this.store.saveRunState(runId, updated);
300
+ this.emit({ type: "flow:resumed", runId, timestamp: Date.now(), data: { currentStep: updated.currentStep } });
301
+ return this.executeLoop(runId, updated);
302
+ }
303
+ async pause(runId) {
304
+ const runState = await this.store.loadRunState(runId);
305
+ if (!runState) throw new Error(`No run found with ID: ${runId}`);
306
+ const updated = { ...runState, status: "paused", pausedAt: Date.now(), updatedAt: Date.now() };
307
+ await this.store.saveRunState(runId, updated);
308
+ this.emit({ type: "flow:paused", runId, timestamp: Date.now(), data: { currentStep: updated.currentStep } });
309
+ }
310
+ async executeLoop(runId, runState) {
311
+ const maxSteps = this.flow.settings.max_total_steps ?? 100;
312
+ const timeoutMs = this.flow.settings.timeout_ms;
313
+ let current = runState;
314
+ let iterations = 0;
315
+ while (iterations < maxSteps) {
316
+ if (this.aborted) {
317
+ current = { ...current, status: "cancelled", updatedAt: Date.now() };
318
+ await this.store.saveRunState(runId, current);
319
+ return { runId, status: "cancelled", data: await this.store.getAllData(runId), finalStep: current.currentStep, stepHistory: current.stepHistory, durationMs: Date.now() - current.startedAt };
320
+ }
321
+ if (timeoutMs && Date.now() - current.startedAt > timeoutMs) {
322
+ current = { ...current, status: "completed", updatedAt: Date.now() };
323
+ await this.store.saveRunState(runId, current);
324
+ return { runId, status: "timeout", intent: "timeout", data: await this.store.getAllData(runId), finalStep: current.currentStep, stepHistory: current.stepHistory, durationMs: Date.now() - current.startedAt };
325
+ }
326
+ const stepName = current.currentStep;
327
+ const terminalState = this.flow.terminal_states[stepName];
328
+ if (terminalState) {
329
+ current = { ...current, status: "completed", updatedAt: Date.now() };
330
+ await this.store.saveRunState(runId, current);
331
+ const allData2 = await this.store.getAllData(runId);
332
+ const result = {
333
+ runId,
334
+ status: "completed",
335
+ intent: terminalState.return_intent,
336
+ data: extractReturnData(terminalState.return_artifacts, allData2),
337
+ finalStep: stepName,
338
+ stepHistory: current.stepHistory,
339
+ durationMs: Date.now() - current.startedAt
340
+ };
341
+ this.emit({ type: "flow:complete", runId, timestamp: Date.now(), data: { ...result } });
342
+ this.options.onComplete?.(result);
343
+ return result;
344
+ }
345
+ const cbResult = checkCircuitBreaker(this.flow, current, stepName);
346
+ if (cbResult.broken) {
347
+ current = cbResult.newState;
348
+ await this.store.saveRunState(runId, current);
349
+ iterations++;
350
+ continue;
351
+ }
352
+ current = cbResult.newState;
353
+ const allData = await this.store.getAllData(runId);
354
+ const input = computeStepInput(this.flow, stepName, allData);
355
+ const context = {
356
+ runId,
357
+ stepName,
358
+ components: this.components,
359
+ store: this.store,
360
+ signal: this.options.signal,
361
+ emit: (event, data) => {
362
+ this.emit({ type: "step:complete", runId, timestamp: Date.now(), data: { event, payload: data } });
363
+ }
364
+ };
365
+ this.emit({ type: "step:start", runId, timestamp: Date.now(), data: { step: stepName, input } });
366
+ let stepResult;
367
+ try {
368
+ const handler = this.handlers.get(stepName);
369
+ if (!handler) throw new Error(`No handler registered for step "${stepName}"`);
370
+ stepResult = await handler(input, context);
371
+ } catch (error) {
372
+ const err = error instanceof Error ? error : new Error(String(error));
373
+ this.emit({ type: "step:error", runId, timestamp: Date.now(), data: { step: stepName, error: err.message } });
374
+ stepResult = { result: "failure", data: { error: err.message } };
375
+ }
376
+ if (stepResult.data) {
377
+ for (const [key, value] of Object.entries(stepResult.data)) {
378
+ await this.store.setData(runId, key, value);
379
+ }
380
+ }
381
+ this.emit({ type: "step:complete", runId, timestamp: Date.now(), data: { step: stepName, result: stepResult.result } });
382
+ this.options.onStep?.(stepName, stepResult);
383
+ const reducerResult = applyStepResult(this.flow, current, stepName, stepResult);
384
+ current = reducerResult.newState;
385
+ if (reducerResult.shouldRetry) {
386
+ await this.store.saveRunState(runId, current);
387
+ const stepConfig = this.flow.steps[stepName];
388
+ if (stepConfig.retry?.delay_ms) {
389
+ const retryCount = current.retryCounts[stepName] ?? 0;
390
+ const delay = stepConfig.retry.backoff_multiplier ? stepConfig.retry.delay_ms * Math.pow(stepConfig.retry.backoff_multiplier, retryCount - 1) : stepConfig.retry.delay_ms;
391
+ await this.sleep(delay);
392
+ }
393
+ iterations++;
394
+ continue;
395
+ }
396
+ await this.store.saveRunState(runId, current);
397
+ this.emit({ type: "transition", runId, timestamp: Date.now(), data: { from: stepName, to: current.currentStep, result: stepResult.result } });
398
+ this.options.onTransition?.(stepName, current.currentStep);
399
+ iterations++;
400
+ }
401
+ current = { ...current, status: "completed", updatedAt: Date.now() };
402
+ await this.store.saveRunState(runId, current);
403
+ return { runId, status: "max_iterations", intent: "max_iterations", data: await this.store.getAllData(runId), finalStep: current.currentStep, stepHistory: current.stepHistory, durationMs: Date.now() - current.startedAt };
404
+ }
405
+ };
406
+ function createStepMachine(flow, handlers, options) {
407
+ return new StepMachine(flow, handlers, options);
408
+ }
409
+
410
+ // src/step-machine/loader.ts
411
+ async function parseStepFlowYaml(yamlString) {
412
+ const yaml = await import('yaml');
413
+ return yaml.parse(yamlString);
414
+ }
415
+ async function loadStepFlowFromUrl(url) {
416
+ const response = await fetch(url);
417
+ if (!response.ok) {
418
+ throw new Error(`Failed to load flow from ${url}: ${response.statusText}`);
419
+ }
420
+ const contentType = response.headers.get("content-type") ?? "";
421
+ const text = await response.text();
422
+ if (contentType.includes("json") || url.endsWith(".json")) {
423
+ return JSON.parse(text);
424
+ }
425
+ return parseStepFlowYaml(text);
426
+ }
427
+ async function loadStepFlowFromFile(filePath) {
428
+ const fs = await import('fs/promises');
429
+ const text = await fs.readFile(filePath, "utf-8");
430
+ if (filePath.endsWith(".json")) {
431
+ return JSON.parse(text);
432
+ }
433
+ return parseStepFlowYaml(text);
434
+ }
435
+ function validateStepFlowConfig(flow) {
436
+ const errors = [];
437
+ if (!flow || typeof flow !== "object") {
438
+ return ["Flow must be an object"];
439
+ }
440
+ const f = flow;
441
+ if (!f.settings || typeof f.settings !== "object") {
442
+ errors.push('Flow must have a "settings" object');
443
+ } else {
444
+ const settings = f.settings;
445
+ if (typeof settings.start_step !== "string") {
446
+ errors.push("settings.start_step must be a string");
447
+ }
448
+ }
449
+ if (!f.steps || typeof f.steps !== "object") {
450
+ errors.push('Flow must have a "steps" object');
451
+ } else {
452
+ const steps = f.steps;
453
+ for (const [stepName, stepConfig] of Object.entries(steps)) {
454
+ if (!stepConfig || typeof stepConfig !== "object") {
455
+ errors.push(`Step "${stepName}" must be an object`);
456
+ continue;
457
+ }
458
+ const step = stepConfig;
459
+ if (!step.transitions || typeof step.transitions !== "object") {
460
+ errors.push(`Step "${stepName}" must have a "transitions" object`);
461
+ }
462
+ }
463
+ }
464
+ if (!f.terminal_states || typeof f.terminal_states !== "object") {
465
+ errors.push('Flow must have a "terminal_states" object');
466
+ } else {
467
+ const terminals = f.terminal_states;
468
+ for (const [name, config] of Object.entries(terminals)) {
469
+ if (!config || typeof config !== "object") {
470
+ errors.push(`Terminal state "${name}" must be an object`);
471
+ continue;
472
+ }
473
+ const terminal = config;
474
+ if (typeof terminal.return_intent !== "string") {
475
+ errors.push(`Terminal state "${name}" must have a "return_intent" string`);
476
+ }
477
+ }
478
+ }
479
+ return errors;
480
+ }
481
+ async function loadStepFlow(source) {
482
+ let flow;
483
+ if (typeof source === "string") {
484
+ if (source.startsWith("http://") || source.startsWith("https://")) {
485
+ flow = await loadStepFlowFromUrl(source);
486
+ } else if (source.includes("{")) {
487
+ flow = JSON.parse(source);
488
+ } else {
489
+ flow = await loadStepFlowFromFile(source);
490
+ }
491
+ } else {
492
+ flow = source;
493
+ }
494
+ const errors = validateStepFlowConfig(flow);
495
+ if (errors.length > 0) {
496
+ throw new Error(`Invalid step flow configuration:
497
+ - ${errors.join("\n- ")}`);
498
+ }
499
+ return flow;
500
+ }
501
+
502
+ exports.StepMachine = StepMachine;
503
+ exports.applyStepResult = applyStepResult;
504
+ exports.checkCircuitBreaker = checkCircuitBreaker;
505
+ exports.computeStepInput = computeStepInput;
506
+ exports.createInitialState = createInitialState;
507
+ exports.createStepMachine = createStepMachine;
508
+ exports.extractReturnData = extractReturnData;
509
+ exports.loadStepFlow = loadStepFlow;
510
+ exports.parseStepFlowYaml = parseStepFlowYaml;
511
+ exports.validateStepFlowConfig = validateStepFlowConfig;
512
+ //# sourceMappingURL=index.cjs.map
513
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/step-machine/reducer.ts","../../src/stores/memory.ts","../../src/step-machine/StepMachine.ts","../../src/step-machine/loader.ts"],"names":["allData"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Step Machine Reducer — Pure Functions\n *\n * currentState + stepResult → newState\n * No I/O, no side effects, deterministic.\n */\n\nimport type {\n StepFlowConfig,\n StepMachineState,\n StepResult,\n StepReducerResult,\n} from './types.js';\n\n/**\n * Apply a step result to the current state and compute the next state.\n * Pure function: no side effects.\n */\nexport function applyStepResult(\n flow: StepFlowConfig,\n state: StepMachineState,\n stepName: string,\n stepResult: StepResult\n): StepReducerResult {\n const stepConfig = flow.steps[stepName];\n\n if (!stepConfig) {\n throw new Error(`Step \"${stepName}\" not found in flow configuration`);\n }\n\n // Check retry\n if (stepResult.result === 'failure' && stepConfig.retry) {\n const retryCount = state.retryCounts[stepName] ?? 0;\n if (retryCount < stepConfig.retry.max_attempts) {\n return {\n newState: {\n ...state,\n retryCounts: {\n ...state.retryCounts,\n [stepName]: retryCount + 1,\n },\n updatedAt: Date.now(),\n },\n nextStep: stepName,\n isTerminal: false,\n isCircuitBroken: false,\n shouldRetry: true,\n };\n }\n }\n\n // Find transition\n const nextStep = stepConfig.transitions[stepResult.result];\n if (!nextStep) {\n throw new Error(\n `No transition defined for result \"${stepResult.result}\" in step \"${stepName}\"`\n );\n }\n\n // Check if next is terminal\n const isTerminal = !!flow.terminal_states[nextStep];\n\n return {\n newState: {\n ...state,\n currentStep: nextStep,\n stepHistory: [...state.stepHistory, stepName],\n retryCounts: {\n ...state.retryCounts,\n [stepName]: 0,\n },\n updatedAt: Date.now(),\n },\n nextStep,\n isTerminal,\n isCircuitBroken: false,\n shouldRetry: false,\n };\n}\n\n/**\n * Check circuit breaker for a step. Returns the redirected step if broken.\n * Pure function.\n */\nexport function checkCircuitBreaker(\n flow: StepFlowConfig,\n state: StepMachineState,\n stepName: string\n): { broken: boolean; redirectStep?: string; newState: StepMachineState } {\n const stepConfig = flow.steps[stepName];\n if (!stepConfig?.circuit_breaker) {\n return {\n broken: false,\n newState: {\n ...state,\n iterationCounts: {\n ...state.iterationCounts,\n [stepName]: (state.iterationCounts[stepName] ?? 0) + 1,\n },\n updatedAt: Date.now(),\n },\n };\n }\n\n const count = state.iterationCounts[stepName] ?? 0;\n if (count >= stepConfig.circuit_breaker.max_iterations) {\n return {\n broken: true,\n redirectStep: stepConfig.circuit_breaker.on_open,\n newState: {\n ...state,\n currentStep: stepConfig.circuit_breaker.on_open,\n updatedAt: Date.now(),\n },\n };\n }\n\n return {\n broken: false,\n newState: {\n ...state,\n iterationCounts: {\n ...state.iterationCounts,\n [stepName]: count + 1,\n },\n updatedAt: Date.now(),\n },\n };\n}\n\n/**\n * Compute what a step needs as input. Pure function.\n */\nexport function computeStepInput(\n flow: StepFlowConfig,\n stepName: string,\n allData: Record<string, unknown>\n): Record<string, unknown> {\n const stepConfig = flow.steps[stepName];\n if (!stepConfig) {\n throw new Error(`Step \"${stepName}\" not found`);\n }\n\n if (stepConfig.expects_data) {\n const input: Record<string, unknown> = {};\n for (const key of stepConfig.expects_data) {\n input[key] = allData[key];\n }\n return input;\n }\n\n // If no expects_data, pass all data\n return { ...allData };\n}\n\n/**\n * Extract return data from terminal state. Pure function.\n */\nexport function extractReturnData(\n returnArtifacts: string | string[] | false | undefined,\n allData: Record<string, unknown>\n): Record<string, unknown> {\n if (returnArtifacts === false || returnArtifacts === undefined) {\n return {};\n }\n\n if (typeof returnArtifacts === 'string') {\n return { [returnArtifacts]: allData[returnArtifacts] };\n }\n\n if (Array.isArray(returnArtifacts)) {\n const result: Record<string, unknown> = {};\n for (const key of returnArtifacts) {\n result[key] = allData[key];\n }\n return result;\n }\n\n return {};\n}\n\n/**\n * Create initial state for a new run. Pure function.\n */\nexport function createInitialState(\n flow: StepFlowConfig,\n runId: string\n): StepMachineState {\n const now = Date.now();\n return {\n runId,\n flowId: flow.id ?? 'unnamed',\n currentStep: flow.settings.start_step,\n status: 'running',\n stepHistory: [],\n iterationCounts: {},\n retryCounts: {},\n startedAt: now,\n updatedAt: now,\n };\n}\n","/**\n * yaml-flow - Memory Store\n * \n * In-memory store implementation. Works in both browser and Node.js.\n * Data is lost when the process exits - use for testing or short-lived flows.\n */\n\nimport type { StepMachineStore, StepMachineState } from '../step-machine/types.js';\n\nexport class MemoryStore implements StepMachineStore {\n private runs: Map<string, StepMachineState> = new Map();\n private data: Map<string, Record<string, unknown>> = new Map();\n\n async saveRunState(runId: string, state: StepMachineState): Promise<void> {\n this.runs.set(runId, { ...state });\n }\n\n async loadRunState(runId: string): Promise<StepMachineState | null> {\n const state = this.runs.get(runId);\n return state ? { ...state } : null;\n }\n\n async deleteRunState(runId: string): Promise<void> {\n this.runs.delete(runId);\n this.data.delete(runId);\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n if (!this.data.has(runId)) {\n this.data.set(runId, {});\n }\n const runData = this.data.get(runId)!;\n runData[key] = value;\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n return this.data.get(runId)?.[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n return { ...(this.data.get(runId) ?? {}) };\n }\n\n async clearData(runId: string): Promise<void> {\n this.data.delete(runId);\n }\n\n async listRuns(): Promise<string[]> {\n return Array.from(this.runs.keys());\n }\n\n /**\n * Clear all data (useful for testing)\n */\n clear(): void {\n this.runs.clear();\n this.data.clear();\n }\n}\n","/**\n * Step Machine — Convenience Driver Class\n *\n * Wraps the pure reducer with a run loop and store I/O.\n * This is the framework layer. The reducer is the pure core.\n */\n\nimport type {\n StepFlowConfig,\n StepMachineStore,\n StepMachineResult,\n StepHandler,\n StepContext,\n StepResult,\n StepMachineState,\n StepMachineOptions,\n StepEvent,\n StepEventType,\n StepEventListener,\n} from './types.js';\nimport {\n applyStepResult,\n checkCircuitBreaker,\n computeStepInput,\n extractReturnData,\n createInitialState,\n} from './reducer.js';\nimport { MemoryStore } from '../stores/memory.js';\n\nfunction generateRunId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport class StepMachine {\n private flow: StepFlowConfig;\n private handlers: Map<string, StepHandler>;\n private store: StepMachineStore;\n private components: Record<string, unknown>;\n private options: StepMachineOptions;\n private listeners: Map<StepEventType, Set<StepEventListener>> = new Map();\n private aborted = false;\n\n constructor(\n flow: StepFlowConfig,\n handlers: Record<string, StepHandler>,\n options: StepMachineOptions = {}\n ) {\n this.flow = flow;\n this.handlers = new Map(Object.entries(handlers));\n this.store = options.store ?? new MemoryStore();\n this.components = options.components ?? {};\n this.options = options;\n\n if (options.signal) {\n options.signal.addEventListener('abort', () => {\n this.aborted = true;\n });\n }\n\n this.validateFlow();\n }\n\n private validateFlow(): void {\n const { settings, steps, terminal_states } = this.flow;\n\n if (!settings?.start_step) {\n throw new Error('Flow must have settings.start_step defined');\n }\n if (!steps || Object.keys(steps).length === 0) {\n throw new Error('Flow must have at least one step defined');\n }\n if (!terminal_states || Object.keys(terminal_states).length === 0) {\n throw new Error('Flow must have at least one terminal_state defined');\n }\n if (!steps[settings.start_step] && !terminal_states[settings.start_step]) {\n throw new Error(`Start step \"${settings.start_step}\" not found`);\n }\n for (const [stepName, stepConfig] of Object.entries(steps)) {\n for (const [result, target] of Object.entries(stepConfig.transitions)) {\n if (!steps[target] && !terminal_states[target]) {\n throw new Error(\n `Step \"${stepName}\" transition \"${result}\" points to unknown step \"${target}\"`\n );\n }\n }\n }\n }\n\n on(eventType: StepEventType, listener: StepEventListener): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set());\n }\n this.listeners.get(eventType)!.add(listener);\n }\n\n off(eventType: StepEventType, listener: StepEventListener): void {\n this.listeners.get(eventType)?.delete(listener);\n }\n\n private emit(event: StepEvent): void {\n const typeListeners = this.listeners.get(event.type);\n if (typeListeners) {\n for (const listener of typeListeners) {\n try { listener(event); } catch { /* swallow listener errors */ }\n }\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n async run(initialData?: Record<string, unknown>): Promise<StepMachineResult> {\n const runId = generateRunId();\n let runState = createInitialState(this.flow, runId);\n\n await this.store.saveRunState(runId, runState);\n\n if (initialData) {\n for (const [key, value] of Object.entries(initialData)) {\n await this.store.setData(runId, key, value);\n }\n }\n\n this.emit({\n type: 'flow:start',\n runId,\n timestamp: runState.startedAt,\n data: { initialData: initialData ?? {} },\n });\n\n try {\n return await this.executeLoop(runId, runState);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.emit({ type: 'flow:error', runId, timestamp: Date.now(), data: { error: err.message } });\n this.options.onError?.(err);\n\n runState = { ...runState, status: 'failed', updatedAt: Date.now() };\n await this.store.saveRunState(runId, runState);\n\n return {\n runId,\n status: 'failed',\n data: await this.store.getAllData(runId),\n finalStep: runState.currentStep,\n stepHistory: runState.stepHistory,\n durationMs: Date.now() - runState.startedAt,\n error: err,\n };\n }\n }\n\n async resume(runId: string): Promise<StepMachineResult> {\n const runState = await this.store.loadRunState(runId);\n if (!runState) throw new Error(`No run found with ID: ${runId}`);\n if (runState.status === 'completed' || runState.status === 'failed') {\n throw new Error(`Cannot resume a ${runState.status} run`);\n }\n\n const updated: StepMachineState = { ...runState, status: 'running', pausedAt: undefined, updatedAt: Date.now() };\n await this.store.saveRunState(runId, updated);\n this.emit({ type: 'flow:resumed', runId, timestamp: Date.now(), data: { currentStep: updated.currentStep } });\n\n return this.executeLoop(runId, updated);\n }\n\n async pause(runId: string): Promise<void> {\n const runState = await this.store.loadRunState(runId);\n if (!runState) throw new Error(`No run found with ID: ${runId}`);\n\n const updated: StepMachineState = { ...runState, status: 'paused', pausedAt: Date.now(), updatedAt: Date.now() };\n await this.store.saveRunState(runId, updated);\n this.emit({ type: 'flow:paused', runId, timestamp: Date.now(), data: { currentStep: updated.currentStep } });\n }\n\n private async executeLoop(runId: string, runState: StepMachineState): Promise<StepMachineResult> {\n const maxSteps = this.flow.settings.max_total_steps ?? 100;\n const timeoutMs = this.flow.settings.timeout_ms;\n let current = runState;\n let iterations = 0;\n\n while (iterations < maxSteps) {\n if (this.aborted) {\n current = { ...current, status: 'cancelled', updatedAt: Date.now() };\n await this.store.saveRunState(runId, current);\n return { runId, status: 'cancelled', data: await this.store.getAllData(runId), finalStep: current.currentStep, stepHistory: current.stepHistory, durationMs: Date.now() - current.startedAt };\n }\n\n if (timeoutMs && Date.now() - current.startedAt > timeoutMs) {\n current = { ...current, status: 'completed', updatedAt: Date.now() };\n await this.store.saveRunState(runId, current);\n return { runId, status: 'timeout', intent: 'timeout', data: await this.store.getAllData(runId), finalStep: current.currentStep, stepHistory: current.stepHistory, durationMs: Date.now() - current.startedAt };\n }\n\n const stepName = current.currentStep;\n\n // Terminal state check\n const terminalState = this.flow.terminal_states[stepName];\n if (terminalState) {\n current = { ...current, status: 'completed', updatedAt: Date.now() };\n await this.store.saveRunState(runId, current);\n const allData = await this.store.getAllData(runId);\n const result: StepMachineResult = {\n runId, status: 'completed', intent: terminalState.return_intent,\n data: extractReturnData(terminalState.return_artifacts, allData),\n finalStep: stepName, stepHistory: current.stepHistory, durationMs: Date.now() - current.startedAt,\n };\n this.emit({ type: 'flow:complete', runId, timestamp: Date.now(), data: { ...result } });\n this.options.onComplete?.(result);\n return result;\n }\n\n // Circuit breaker (pure)\n const cbResult = checkCircuitBreaker(this.flow, current, stepName);\n if (cbResult.broken) {\n current = cbResult.newState;\n await this.store.saveRunState(runId, current);\n iterations++;\n continue;\n }\n current = cbResult.newState;\n\n // Execute step handler (impure — localized)\n const allData = await this.store.getAllData(runId);\n const input = computeStepInput(this.flow, stepName, allData);\n const context: StepContext = {\n runId, stepName, components: this.components, store: this.store,\n signal: this.options.signal,\n emit: (event: string, data: unknown) => {\n this.emit({ type: 'step:complete' as StepEventType, runId, timestamp: Date.now(), data: { event, payload: data } });\n },\n };\n\n this.emit({ type: 'step:start', runId, timestamp: Date.now(), data: { step: stepName, input } });\n\n let stepResult: StepResult;\n try {\n const handler = this.handlers.get(stepName);\n if (!handler) throw new Error(`No handler registered for step \"${stepName}\"`);\n stepResult = await handler(input, context);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.emit({ type: 'step:error', runId, timestamp: Date.now(), data: { step: stepName, error: err.message } });\n stepResult = { result: 'failure', data: { error: err.message } };\n }\n\n // Store produced data\n if (stepResult.data) {\n for (const [key, value] of Object.entries(stepResult.data)) {\n await this.store.setData(runId, key, value);\n }\n }\n\n this.emit({ type: 'step:complete', runId, timestamp: Date.now(), data: { step: stepName, result: stepResult.result } });\n this.options.onStep?.(stepName, stepResult);\n\n // Apply step result (pure reducer)\n const reducerResult = applyStepResult(this.flow, current, stepName, stepResult);\n current = reducerResult.newState;\n\n if (reducerResult.shouldRetry) {\n await this.store.saveRunState(runId, current);\n const stepConfig = this.flow.steps[stepName];\n if (stepConfig.retry?.delay_ms) {\n const retryCount = current.retryCounts[stepName] ?? 0;\n const delay = stepConfig.retry.backoff_multiplier\n ? stepConfig.retry.delay_ms * Math.pow(stepConfig.retry.backoff_multiplier, retryCount - 1)\n : stepConfig.retry.delay_ms;\n await this.sleep(delay);\n }\n iterations++;\n continue;\n }\n\n await this.store.saveRunState(runId, current);\n this.emit({ type: 'transition', runId, timestamp: Date.now(), data: { from: stepName, to: current.currentStep, result: stepResult.result } });\n this.options.onTransition?.(stepName, current.currentStep);\n iterations++;\n }\n\n // Max iterations\n current = { ...current, status: 'completed', updatedAt: Date.now() };\n await this.store.saveRunState(runId, current);\n return { runId, status: 'max_iterations', intent: 'max_iterations', data: await this.store.getAllData(runId), finalStep: current.currentStep, stepHistory: current.stepHistory, durationMs: Date.now() - current.startedAt };\n }\n}\n\n/** Convenience factory */\nexport function createStepMachine(\n flow: StepFlowConfig,\n handlers: Record<string, StepHandler>,\n options?: StepMachineOptions\n): StepMachine {\n return new StepMachine(flow, handlers, options);\n}\n","/**\n * Step Machine — Loader\n *\n * Utilities for loading and validating step-machine flow configurations.\n */\n\nimport type { StepFlowConfig } from './types.js';\n\nexport async function parseStepFlowYaml(yamlString: string): Promise<StepFlowConfig> {\n const yaml = await import('yaml');\n return yaml.parse(yamlString) as StepFlowConfig;\n}\n\nexport async function loadStepFlowFromUrl(url: string): Promise<StepFlowConfig> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load flow from ${url}: ${response.statusText}`);\n }\n const contentType = response.headers.get('content-type') ?? '';\n const text = await response.text();\n if (contentType.includes('json') || url.endsWith('.json')) {\n return JSON.parse(text) as StepFlowConfig;\n }\n return parseStepFlowYaml(text);\n}\n\nexport async function loadStepFlowFromFile(filePath: string): Promise<StepFlowConfig> {\n const fs = await import('fs/promises');\n const text = await fs.readFile(filePath, 'utf-8');\n if (filePath.endsWith('.json')) {\n return JSON.parse(text) as StepFlowConfig;\n }\n return parseStepFlowYaml(text);\n}\n\nexport function validateStepFlowConfig(flow: unknown): string[] {\n const errors: string[] = [];\n if (!flow || typeof flow !== 'object') {\n return ['Flow must be an object'];\n }\n const f = flow as Record<string, unknown>;\n\n if (!f.settings || typeof f.settings !== 'object') {\n errors.push('Flow must have a \"settings\" object');\n } else {\n const settings = f.settings as Record<string, unknown>;\n if (typeof settings.start_step !== 'string') {\n errors.push('settings.start_step must be a string');\n }\n }\n\n if (!f.steps || typeof f.steps !== 'object') {\n errors.push('Flow must have a \"steps\" object');\n } else {\n const steps = f.steps as Record<string, unknown>;\n for (const [stepName, stepConfig] of Object.entries(steps)) {\n if (!stepConfig || typeof stepConfig !== 'object') {\n errors.push(`Step \"${stepName}\" must be an object`);\n continue;\n }\n const step = stepConfig as Record<string, unknown>;\n if (!step.transitions || typeof step.transitions !== 'object') {\n errors.push(`Step \"${stepName}\" must have a \"transitions\" object`);\n }\n }\n }\n\n if (!f.terminal_states || typeof f.terminal_states !== 'object') {\n errors.push('Flow must have a \"terminal_states\" object');\n } else {\n const terminals = f.terminal_states as Record<string, unknown>;\n for (const [name, config] of Object.entries(terminals)) {\n if (!config || typeof config !== 'object') {\n errors.push(`Terminal state \"${name}\" must be an object`);\n continue;\n }\n const terminal = config as Record<string, unknown>;\n if (typeof terminal.return_intent !== 'string') {\n errors.push(`Terminal state \"${name}\" must have a \"return_intent\" string`);\n }\n }\n }\n\n return errors;\n}\n\nexport async function loadStepFlow(source: string | StepFlowConfig): Promise<StepFlowConfig> {\n let flow: StepFlowConfig;\n if (typeof source === 'string') {\n if (source.startsWith('http://') || source.startsWith('https://')) {\n flow = await loadStepFlowFromUrl(source);\n } else if (source.includes('{')) {\n flow = JSON.parse(source);\n } else {\n flow = await loadStepFlowFromFile(source);\n }\n } else {\n flow = source;\n }\n const errors = validateStepFlowConfig(flow);\n if (errors.length > 0) {\n throw new Error(`Invalid step flow configuration:\\n- ${errors.join('\\n- ')}`);\n }\n return flow;\n}\n"]}
@@ -0,0 +1,77 @@
1
+ import { e as StepFlowConfig, g as StepHandler, i as StepMachineOptions, d as StepEventType, c as StepEventListener, j as StepMachineResult, k as StepMachineState, n as StepResult, m as StepReducerResult } from '../types-FZ_eyErS.cjs';
2
+ export { C as CircuitBreakerConfig, R as RetryConfig, S as StepConfig, a as StepContext, b as StepEvent, f as StepFlowSettings, h as StepInput, l as StepMachineStore, T as TerminalStateConfig } from '../types-FZ_eyErS.cjs';
3
+
4
+ /**
5
+ * Step Machine — Convenience Driver Class
6
+ *
7
+ * Wraps the pure reducer with a run loop and store I/O.
8
+ * This is the framework layer. The reducer is the pure core.
9
+ */
10
+
11
+ declare class StepMachine {
12
+ private flow;
13
+ private handlers;
14
+ private store;
15
+ private components;
16
+ private options;
17
+ private listeners;
18
+ private aborted;
19
+ constructor(flow: StepFlowConfig, handlers: Record<string, StepHandler>, options?: StepMachineOptions);
20
+ private validateFlow;
21
+ on(eventType: StepEventType, listener: StepEventListener): void;
22
+ off(eventType: StepEventType, listener: StepEventListener): void;
23
+ private emit;
24
+ private sleep;
25
+ run(initialData?: Record<string, unknown>): Promise<StepMachineResult>;
26
+ resume(runId: string): Promise<StepMachineResult>;
27
+ pause(runId: string): Promise<void>;
28
+ private executeLoop;
29
+ }
30
+ /** Convenience factory */
31
+ declare function createStepMachine(flow: StepFlowConfig, handlers: Record<string, StepHandler>, options?: StepMachineOptions): StepMachine;
32
+
33
+ /**
34
+ * Step Machine Reducer — Pure Functions
35
+ *
36
+ * currentState + stepResult → newState
37
+ * No I/O, no side effects, deterministic.
38
+ */
39
+
40
+ /**
41
+ * Apply a step result to the current state and compute the next state.
42
+ * Pure function: no side effects.
43
+ */
44
+ declare function applyStepResult(flow: StepFlowConfig, state: StepMachineState, stepName: string, stepResult: StepResult): StepReducerResult;
45
+ /**
46
+ * Check circuit breaker for a step. Returns the redirected step if broken.
47
+ * Pure function.
48
+ */
49
+ declare function checkCircuitBreaker(flow: StepFlowConfig, state: StepMachineState, stepName: string): {
50
+ broken: boolean;
51
+ redirectStep?: string;
52
+ newState: StepMachineState;
53
+ };
54
+ /**
55
+ * Compute what a step needs as input. Pure function.
56
+ */
57
+ declare function computeStepInput(flow: StepFlowConfig, stepName: string, allData: Record<string, unknown>): Record<string, unknown>;
58
+ /**
59
+ * Extract return data from terminal state. Pure function.
60
+ */
61
+ declare function extractReturnData(returnArtifacts: string | string[] | false | undefined, allData: Record<string, unknown>): Record<string, unknown>;
62
+ /**
63
+ * Create initial state for a new run. Pure function.
64
+ */
65
+ declare function createInitialState(flow: StepFlowConfig, runId: string): StepMachineState;
66
+
67
+ /**
68
+ * Step Machine — Loader
69
+ *
70
+ * Utilities for loading and validating step-machine flow configurations.
71
+ */
72
+
73
+ declare function parseStepFlowYaml(yamlString: string): Promise<StepFlowConfig>;
74
+ declare function validateStepFlowConfig(flow: unknown): string[];
75
+ declare function loadStepFlow(source: string | StepFlowConfig): Promise<StepFlowConfig>;
76
+
77
+ export { StepEventListener, StepEventType, StepFlowConfig, StepHandler, StepMachine, StepMachineOptions, StepMachineResult, StepMachineState, StepReducerResult, StepResult, applyStepResult, checkCircuitBreaker, computeStepInput, createInitialState, createStepMachine, extractReturnData, loadStepFlow, parseStepFlowYaml, validateStepFlowConfig };