flowcraft 2.8.0 → 2.9.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 (228) hide show
  1. package/README.md +1 -1
  2. package/dist/index-B7cJxomy.d.mts +1291 -0
  3. package/dist/index.d.mts +2 -0
  4. package/dist/index.mjs +747 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/dist/replay-BB11M6K1.mjs +107 -0
  7. package/dist/replay-BB11M6K1.mjs.map +1 -0
  8. package/dist/runtime-Bob_ca8M.mjs +2215 -0
  9. package/dist/runtime-Bob_ca8M.mjs.map +1 -0
  10. package/dist/{sdk.d.ts → sdk.d.mts} +14 -12
  11. package/dist/sdk.mjs +29 -0
  12. package/dist/sdk.mjs.map +1 -0
  13. package/dist/testing/index.d.mts +172 -0
  14. package/dist/testing/index.mjs +277 -0
  15. package/dist/testing/index.mjs.map +1 -0
  16. package/package.json +13 -13
  17. package/dist/adapters/index.d.ts +0 -4
  18. package/dist/adapters/index.js +0 -4
  19. package/dist/adapters/index.js.map +0 -1
  20. package/dist/adapters/persistent-event-bus.d.ts +0 -69
  21. package/dist/adapters/persistent-event-bus.js +0 -3
  22. package/dist/adapters/persistent-event-bus.js.map +0 -1
  23. package/dist/analysis.d.ts +0 -53
  24. package/dist/analysis.js +0 -3
  25. package/dist/analysis.js.map +0 -1
  26. package/dist/chunk-26VTGQAF.js +0 -103
  27. package/dist/chunk-26VTGQAF.js.map +0 -1
  28. package/dist/chunk-27STBUGG.js +0 -44
  29. package/dist/chunk-27STBUGG.js.map +0 -1
  30. package/dist/chunk-2TSADFQX.js +0 -46
  31. package/dist/chunk-2TSADFQX.js.map +0 -1
  32. package/dist/chunk-3Y5O5EGB.js +0 -3
  33. package/dist/chunk-3Y5O5EGB.js.map +0 -1
  34. package/dist/chunk-4JUPOFSL.js +0 -76
  35. package/dist/chunk-4JUPOFSL.js.map +0 -1
  36. package/dist/chunk-4PELJWF7.js +0 -29
  37. package/dist/chunk-4PELJWF7.js.map +0 -1
  38. package/dist/chunk-55J6XMHW.js +0 -3
  39. package/dist/chunk-55J6XMHW.js.map +0 -1
  40. package/dist/chunk-5A24LVGQ.js +0 -90
  41. package/dist/chunk-5A24LVGQ.js.map +0 -1
  42. package/dist/chunk-6RKHCJUU.js +0 -29
  43. package/dist/chunk-6RKHCJUU.js.map +0 -1
  44. package/dist/chunk-7EBKWATZ.js +0 -86
  45. package/dist/chunk-7EBKWATZ.js.map +0 -1
  46. package/dist/chunk-BC4G7OM6.js +0 -42
  47. package/dist/chunk-BC4G7OM6.js.map +0 -1
  48. package/dist/chunk-BCRWXTWX.js +0 -21
  49. package/dist/chunk-BCRWXTWX.js.map +0 -1
  50. package/dist/chunk-BV6MXL74.js +0 -340
  51. package/dist/chunk-BV6MXL74.js.map +0 -1
  52. package/dist/chunk-CIXL7AKH.js +0 -532
  53. package/dist/chunk-CIXL7AKH.js.map +0 -1
  54. package/dist/chunk-DL7KVYZF.js +0 -39
  55. package/dist/chunk-DL7KVYZF.js.map +0 -1
  56. package/dist/chunk-E6ICIXVR.js +0 -25
  57. package/dist/chunk-E6ICIXVR.js.map +0 -1
  58. package/dist/chunk-HFJXYY4E.js +0 -3
  59. package/dist/chunk-HFJXYY4E.js.map +0 -1
  60. package/dist/chunk-HNHM3FDK.js +0 -52
  61. package/dist/chunk-HNHM3FDK.js.map +0 -1
  62. package/dist/chunk-I53JB2KW.js +0 -26
  63. package/dist/chunk-I53JB2KW.js.map +0 -1
  64. package/dist/chunk-IDTYHLDQ.js +0 -16
  65. package/dist/chunk-IDTYHLDQ.js.map +0 -1
  66. package/dist/chunk-IKOTX22J.js +0 -85
  67. package/dist/chunk-IKOTX22J.js.map +0 -1
  68. package/dist/chunk-K446NZ4E.js +0 -25
  69. package/dist/chunk-K446NZ4E.js.map +0 -1
  70. package/dist/chunk-L3MX5MTA.js +0 -33
  71. package/dist/chunk-L3MX5MTA.js.map +0 -1
  72. package/dist/chunk-L46TQXCV.js +0 -144
  73. package/dist/chunk-L46TQXCV.js.map +0 -1
  74. package/dist/chunk-LM4ACVHL.js +0 -73
  75. package/dist/chunk-LM4ACVHL.js.map +0 -1
  76. package/dist/chunk-LNK7LZER.js +0 -51
  77. package/dist/chunk-LNK7LZER.js.map +0 -1
  78. package/dist/chunk-NVLZFLYM.js +0 -3
  79. package/dist/chunk-NVLZFLYM.js.map +0 -1
  80. package/dist/chunk-ONH7PIJZ.js +0 -300
  81. package/dist/chunk-ONH7PIJZ.js.map +0 -1
  82. package/dist/chunk-OOJEXFYY.js +0 -47
  83. package/dist/chunk-OOJEXFYY.js.map +0 -1
  84. package/dist/chunk-PH2IYZHV.js +0 -48
  85. package/dist/chunk-PH2IYZHV.js.map +0 -1
  86. package/dist/chunk-PU2VTWJD.js +0 -164
  87. package/dist/chunk-PU2VTWJD.js.map +0 -1
  88. package/dist/chunk-QA2WDZPV.js +0 -74
  89. package/dist/chunk-QA2WDZPV.js.map +0 -1
  90. package/dist/chunk-RM677CNU.js +0 -52
  91. package/dist/chunk-RM677CNU.js.map +0 -1
  92. package/dist/chunk-TKSSRS5U.js +0 -39
  93. package/dist/chunk-TKSSRS5U.js.map +0 -1
  94. package/dist/chunk-UNORA7EM.js +0 -103
  95. package/dist/chunk-UNORA7EM.js.map +0 -1
  96. package/dist/chunk-VZ4BRDBK.js +0 -54
  97. package/dist/chunk-VZ4BRDBK.js.map +0 -1
  98. package/dist/chunk-X5RJOZY2.js +0 -279
  99. package/dist/chunk-X5RJOZY2.js.map +0 -1
  100. package/dist/chunk-ZETQCNEF.js +0 -139
  101. package/dist/chunk-ZETQCNEF.js.map +0 -1
  102. package/dist/chunk-ZKINHLMS.js +0 -230
  103. package/dist/chunk-ZKINHLMS.js.map +0 -1
  104. package/dist/chunk-ZLW4QOTS.js +0 -192
  105. package/dist/chunk-ZLW4QOTS.js.map +0 -1
  106. package/dist/container-factory.d.ts +0 -17
  107. package/dist/container-factory.js +0 -13
  108. package/dist/container-factory.js.map +0 -1
  109. package/dist/container.d.ts +0 -23
  110. package/dist/container.js +0 -3
  111. package/dist/container.js.map +0 -1
  112. package/dist/context.d.ts +0 -65
  113. package/dist/context.js +0 -3
  114. package/dist/context.js.map +0 -1
  115. package/dist/error-mapper.d.ts +0 -15
  116. package/dist/error-mapper.js +0 -4
  117. package/dist/error-mapper.js.map +0 -1
  118. package/dist/errors.d.ts +0 -20
  119. package/dist/errors.js +0 -3
  120. package/dist/errors.js.map +0 -1
  121. package/dist/evaluator.d.ts +0 -32
  122. package/dist/evaluator.js +0 -3
  123. package/dist/evaluator.js.map +0 -1
  124. package/dist/flow.d.ts +0 -83
  125. package/dist/flow.js +0 -4
  126. package/dist/flow.js.map +0 -1
  127. package/dist/index.d.ts +0 -18
  128. package/dist/index.js +0 -38
  129. package/dist/index.js.map +0 -1
  130. package/dist/linter.d.ts +0 -26
  131. package/dist/linter.js +0 -4
  132. package/dist/linter.js.map +0 -1
  133. package/dist/logger.d.ts +0 -20
  134. package/dist/logger.js +0 -3
  135. package/dist/logger.js.map +0 -1
  136. package/dist/node.d.ts +0 -3
  137. package/dist/node.js +0 -3
  138. package/dist/node.js.map +0 -1
  139. package/dist/nodes/batch-gather.d.ts +0 -9
  140. package/dist/nodes/batch-gather.js +0 -4
  141. package/dist/nodes/batch-gather.js.map +0 -1
  142. package/dist/nodes/batch-scatter.d.ts +0 -9
  143. package/dist/nodes/batch-scatter.js +0 -4
  144. package/dist/nodes/batch-scatter.js.map +0 -1
  145. package/dist/nodes/sleep.d.ts +0 -9
  146. package/dist/nodes/sleep.js +0 -4
  147. package/dist/nodes/sleep.js.map +0 -1
  148. package/dist/nodes/subflow.d.ts +0 -9
  149. package/dist/nodes/subflow.js +0 -10
  150. package/dist/nodes/subflow.js.map +0 -1
  151. package/dist/nodes/wait.d.ts +0 -9
  152. package/dist/nodes/wait.js +0 -4
  153. package/dist/nodes/wait.js.map +0 -1
  154. package/dist/nodes/webhook.d.ts +0 -13
  155. package/dist/nodes/webhook.js +0 -4
  156. package/dist/nodes/webhook.js.map +0 -1
  157. package/dist/runtime/adapter.d.ts +0 -114
  158. package/dist/runtime/adapter.js +0 -28
  159. package/dist/runtime/adapter.js.map +0 -1
  160. package/dist/runtime/builtin-keys.d.ts +0 -38
  161. package/dist/runtime/builtin-keys.js +0 -10
  162. package/dist/runtime/builtin-keys.js.map +0 -1
  163. package/dist/runtime/execution-context.d.ts +0 -3
  164. package/dist/runtime/execution-context.js +0 -6
  165. package/dist/runtime/execution-context.js.map +0 -1
  166. package/dist/runtime/executors.d.ts +0 -3
  167. package/dist/runtime/executors.js +0 -4
  168. package/dist/runtime/executors.js.map +0 -1
  169. package/dist/runtime/index.d.ts +0 -7
  170. package/dist/runtime/index.js +0 -31
  171. package/dist/runtime/index.js.map +0 -1
  172. package/dist/runtime/node-executor-factory.d.ts +0 -12
  173. package/dist/runtime/node-executor-factory.js +0 -6
  174. package/dist/runtime/node-executor-factory.js.map +0 -1
  175. package/dist/runtime/orchestrator.d.ts +0 -9
  176. package/dist/runtime/orchestrator.js +0 -8
  177. package/dist/runtime/orchestrator.js.map +0 -1
  178. package/dist/runtime/orchestrators/replay.d.ts +0 -45
  179. package/dist/runtime/orchestrators/replay.js +0 -3
  180. package/dist/runtime/orchestrators/replay.js.map +0 -1
  181. package/dist/runtime/orchestrators/step-by-step.d.ts +0 -16
  182. package/dist/runtime/orchestrators/step-by-step.js +0 -5
  183. package/dist/runtime/orchestrators/step-by-step.js.map +0 -1
  184. package/dist/runtime/orchestrators/utils.d.ts +0 -35
  185. package/dist/runtime/orchestrators/utils.js +0 -4
  186. package/dist/runtime/orchestrators/utils.js.map +0 -1
  187. package/dist/runtime/runtime.d.ts +0 -3
  188. package/dist/runtime/runtime.js +0 -27
  189. package/dist/runtime/runtime.js.map +0 -1
  190. package/dist/runtime/scheduler.d.ts +0 -3
  191. package/dist/runtime/scheduler.js +0 -3
  192. package/dist/runtime/scheduler.js.map +0 -1
  193. package/dist/runtime/state.d.ts +0 -3
  194. package/dist/runtime/state.js +0 -5
  195. package/dist/runtime/state.js.map +0 -1
  196. package/dist/runtime/traverser.d.ts +0 -3
  197. package/dist/runtime/traverser.js +0 -5
  198. package/dist/runtime/traverser.js.map +0 -1
  199. package/dist/runtime/types.d.ts +0 -3
  200. package/dist/runtime/types.js +0 -3
  201. package/dist/runtime/types.js.map +0 -1
  202. package/dist/runtime/workflow-logic-handler.d.ts +0 -17
  203. package/dist/runtime/workflow-logic-handler.js +0 -5
  204. package/dist/runtime/workflow-logic-handler.js.map +0 -1
  205. package/dist/sanitizer.d.ts +0 -12
  206. package/dist/sanitizer.js +0 -3
  207. package/dist/sanitizer.js.map +0 -1
  208. package/dist/sdk.js +0 -20
  209. package/dist/sdk.js.map +0 -1
  210. package/dist/serializer.d.ts +0 -18
  211. package/dist/serializer.js +0 -3
  212. package/dist/serializer.js.map +0 -1
  213. package/dist/testing/event-logger.d.ts +0 -63
  214. package/dist/testing/event-logger.js +0 -3
  215. package/dist/testing/event-logger.js.map +0 -1
  216. package/dist/testing/index.d.ts +0 -7
  217. package/dist/testing/index.js +0 -37
  218. package/dist/testing/index.js.map +0 -1
  219. package/dist/testing/run-with-trace.d.ts +0 -38
  220. package/dist/testing/run-with-trace.js +0 -33
  221. package/dist/testing/run-with-trace.js.map +0 -1
  222. package/dist/testing/stepper.d.ts +0 -79
  223. package/dist/testing/stepper.js +0 -11
  224. package/dist/testing/stepper.js.map +0 -1
  225. package/dist/types-Biip2gLh.d.ts +0 -676
  226. package/dist/types.d.ts +0 -3
  227. package/dist/types.js +0 -3
  228. package/dist/types.js.map +0 -1
@@ -1,532 +0,0 @@
1
- import { WorkflowLogicHandler } from './chunk-PU2VTWJD.js';
2
- import { NodeExecutorFactory } from './chunk-DL7KVYZF.js';
3
- import { WorkflowScheduler } from './chunk-LM4ACVHL.js';
4
- import { BatchGatherNode } from './chunk-BC4G7OM6.js';
5
- import { BatchScatterNode } from './chunk-RM677CNU.js';
6
- import { SleepNode } from './chunk-HNHM3FDK.js';
7
- import { SubflowNode } from './chunk-5A24LVGQ.js';
8
- import { GraphTraverser } from './chunk-ZKINHLMS.js';
9
- import { WaitNode } from './chunk-IDTYHLDQ.js';
10
- import { WebhookNode } from './chunk-I53JB2KW.js';
11
- import { sanitizeBlueprint } from './chunk-TKSSRS5U.js';
12
- import { analyzeBlueprint } from './chunk-ZLW4QOTS.js';
13
- import { DefaultOrchestrator } from './chunk-QA2WDZPV.js';
14
- import { ExecutionContext } from './chunk-L3MX5MTA.js';
15
- import { WorkflowState } from './chunk-L46TQXCV.js';
16
- import { NullLogger } from './chunk-4PELJWF7.js';
17
- import { JsonSerializer } from './chunk-6RKHCJUU.js';
18
- import { DIContainer, ServiceTokens } from './chunk-OOJEXFYY.js';
19
- import { FlowcraftError } from './chunk-BCRWXTWX.js';
20
- import { PropertyEvaluator } from './chunk-PH2IYZHV.js';
21
-
22
- // src/runtime/runtime.ts
23
- var FlowRuntime = class {
24
- container;
25
- registry;
26
- blueprints;
27
- dependencies;
28
- logger;
29
- eventBus;
30
- serializer;
31
- middleware;
32
- evaluator;
33
- analysisCache;
34
- orchestrator;
35
- options;
36
- logicHandler;
37
- executorFactory;
38
- scheduler;
39
- getBlueprint(id) {
40
- return this.blueprints[id];
41
- }
42
- constructor(containerOrOptions, legacyOptions) {
43
- let userRegistry;
44
- if (containerOrOptions instanceof DIContainer) {
45
- this.container = containerOrOptions;
46
- this.logger = this.container.resolve(ServiceTokens.Logger);
47
- this.serializer = this.container.resolve(ServiceTokens.Serializer);
48
- this.evaluator = this.container.resolve(ServiceTokens.Evaluator);
49
- this.eventBus = this.container.resolve(ServiceTokens.EventBus) || { emit: async () => {
50
- } };
51
- this.middleware = this.container.resolve(ServiceTokens.Middleware) || [];
52
- userRegistry = this.container.resolve(ServiceTokens.NodeRegistry);
53
- this.blueprints = this.container.resolve(ServiceTokens.BlueprintRegistry);
54
- this.dependencies = this.container.resolve(ServiceTokens.Dependencies);
55
- this.options = legacyOptions || {};
56
- this.orchestrator = this.container.resolve(ServiceTokens.Orchestrator);
57
- this.scheduler = new WorkflowScheduler(this);
58
- } else {
59
- const options = containerOrOptions;
60
- this.logger = options.logger || new NullLogger();
61
- this.serializer = options.serializer || new JsonSerializer();
62
- this.evaluator = options.evaluator || new PropertyEvaluator();
63
- this.eventBus = options.eventBus || { emit: async () => {
64
- } };
65
- this.middleware = options.middleware || [];
66
- userRegistry = options.registry || {};
67
- this.blueprints = options.blueprints || {};
68
- this.scheduler = new WorkflowScheduler(this);
69
- this.dependencies = options.dependencies || {};
70
- this.options = options;
71
- this.container = null;
72
- }
73
- const loopControllerFunction = async (context) => {
74
- const condition = context.params.condition;
75
- const contextData = await context.context.toJSON();
76
- const result = this.evaluator.evaluate(condition, contextData);
77
- if (result) {
78
- return { action: "continue" };
79
- } else {
80
- return { action: "break", output: null };
81
- }
82
- };
83
- const builtInNodes = {
84
- wait: WaitNode,
85
- sleep: SleepNode,
86
- webhook: WebhookNode,
87
- subflow: SubflowNode,
88
- "batch-scatter": BatchScatterNode,
89
- "batch-gather": BatchGatherNode,
90
- "loop-controller": loopControllerFunction
91
- };
92
- this.registry = new Map(Object.entries({ ...builtInNodes, ...userRegistry }));
93
- this.orchestrator = this.container?.has(ServiceTokens.Orchestrator) ? this.container.resolve(ServiceTokens.Orchestrator) : new DefaultOrchestrator();
94
- this.analysisCache = /* @__PURE__ */ new WeakMap();
95
- this.logicHandler = new WorkflowLogicHandler(this.evaluator, this.eventBus);
96
- this.executorFactory = new NodeExecutorFactory(this.eventBus);
97
- }
98
- _setupExecutionContext(blueprint, initialState, options) {
99
- const executionId = globalThis.crypto?.randomUUID();
100
- const contextData = typeof initialState === "string" ? this.serializer.deserialize(initialState) : initialState;
101
- blueprint = sanitizeBlueprint(blueprint);
102
- const state = new WorkflowState(contextData);
103
- const nodeRegistry = this._createExecutionRegistry(options?.functionRegistry);
104
- return new ExecutionContext(
105
- blueprint,
106
- state,
107
- nodeRegistry,
108
- executionId,
109
- this,
110
- {
111
- logger: this.logger,
112
- eventBus: this.eventBus,
113
- serializer: this.serializer,
114
- evaluator: this.evaluator,
115
- middleware: this.middleware,
116
- dependencies: this.dependencies
117
- },
118
- options?.signal,
119
- options?.concurrency
120
- );
121
- }
122
- async run(blueprint, initialState = {}, options) {
123
- const startTime = Date.now();
124
- const executionContext = this._setupExecutionContext(blueprint, initialState, options);
125
- this.logger.info(`Starting workflow execution`, {
126
- blueprintId: executionContext.blueprint.id,
127
- executionId: executionContext.executionId
128
- });
129
- try {
130
- await this.eventBus.emit({
131
- type: "workflow:start",
132
- payload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId }
133
- });
134
- await this.eventBus.emit({
135
- type: "workflow:resume",
136
- payload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId }
137
- });
138
- const analysis = this.analysisCache.get(executionContext.blueprint) ?? (() => {
139
- const computed = analyzeBlueprint(executionContext.blueprint);
140
- this.analysisCache.set(executionContext.blueprint, computed);
141
- return computed;
142
- })();
143
- if (options?.strict && !analysis.isDag) {
144
- throw new Error(`Workflow '${executionContext.blueprint.id}' failed strictness check: Cycles are not allowed.`);
145
- }
146
- if (!analysis.isDag) {
147
- this.logger.warn(`Workflow contains cycles`, {
148
- blueprintId: executionContext.blueprint.id
149
- });
150
- }
151
- const traverser = new GraphTraverser(executionContext.blueprint, options?.strict === true);
152
- const result = await this.orchestrator.run(executionContext, traverser);
153
- const duration = Date.now() - startTime;
154
- if (result.status === "stalled") {
155
- await this.eventBus.emit({
156
- type: "workflow:stall",
157
- payload: {
158
- blueprintId: executionContext.blueprint.id,
159
- executionId: executionContext.executionId,
160
- remainingNodes: traverser.getAllNodeIds().size - executionContext.state.getCompletedNodes().size
161
- }
162
- });
163
- await this.eventBus.emit({
164
- type: "workflow:pause",
165
- payload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId }
166
- });
167
- }
168
- this.logger.info(`Workflow execution completed`, {
169
- blueprintId: executionContext.blueprint.id,
170
- executionId: executionContext.executionId,
171
- status: result.status,
172
- duration,
173
- errors: result.errors?.length || 0
174
- });
175
- await this.eventBus.emit({
176
- type: "workflow:finish",
177
- payload: {
178
- blueprintId: executionContext.blueprint.id,
179
- executionId: executionContext.executionId,
180
- status: result.status,
181
- errors: result.errors
182
- }
183
- });
184
- if (result.status === "awaiting") {
185
- const awaitingNodeIds = executionContext.state.getAwaitingNodeIds();
186
- for (const nodeId of awaitingNodeIds) {
187
- const details = executionContext.state.getAwaitingDetails(nodeId);
188
- if (details?.reason === "timer") {
189
- this.scheduler.registerAwaitingWorkflow(
190
- executionContext.executionId,
191
- executionContext.blueprint.id,
192
- result.serializedContext,
193
- nodeId,
194
- details.wakeUpAt
195
- );
196
- }
197
- }
198
- }
199
- return result;
200
- } catch (error) {
201
- const duration = Date.now() - startTime;
202
- const workflowError = {
203
- message: error instanceof Error ? error.message : String(error),
204
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
205
- isFatal: false,
206
- name: "WorkflowError"
207
- };
208
- await this.eventBus.emit({
209
- type: "workflow:finish",
210
- payload: {
211
- blueprintId: executionContext.blueprint.id,
212
- executionId: executionContext.executionId,
213
- status: "cancelled",
214
- errors: [workflowError]
215
- }
216
- });
217
- if (error instanceof DOMException ? error.name === "AbortError" : error instanceof FlowcraftError && error.message.includes("cancelled")) {
218
- this.logger.info(`Workflow execution cancelled`, {
219
- blueprintId: executionContext.blueprint.id,
220
- executionId: executionContext.executionId,
221
- duration
222
- });
223
- await this.eventBus.emit({
224
- type: "workflow:pause",
225
- payload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId }
226
- });
227
- await this.eventBus.emit({
228
- type: "workflow:finish",
229
- payload: {
230
- blueprintId: executionContext.blueprint.id,
231
- executionId: executionContext.executionId,
232
- status: "cancelled",
233
- errors: [workflowError]
234
- }
235
- });
236
- return {
237
- context: {},
238
- serializedContext: "{}",
239
- status: "cancelled"
240
- };
241
- }
242
- this.logger.error(`Workflow execution failed`, {
243
- blueprintId: executionContext.blueprint.id,
244
- executionId: executionContext.executionId,
245
- duration,
246
- error: error instanceof Error ? error.message : String(error)
247
- });
248
- throw error;
249
- }
250
- }
251
- startScheduler(checkIntervalMs) {
252
- if (checkIntervalMs !== void 0) {
253
- this.scheduler = new WorkflowScheduler(this, checkIntervalMs);
254
- }
255
- this.scheduler.start();
256
- }
257
- stopScheduler() {
258
- this.scheduler.stop();
259
- }
260
- _setupResumedExecutionContext(blueprint, workflowState, options) {
261
- const executionId = globalThis.crypto?.randomUUID();
262
- const nodeRegistry = this._createExecutionRegistry(options?.functionRegistry);
263
- return new ExecutionContext(
264
- blueprint,
265
- workflowState,
266
- nodeRegistry,
267
- executionId,
268
- this,
269
- {
270
- logger: this.logger,
271
- eventBus: this.eventBus,
272
- serializer: this.serializer,
273
- evaluator: this.evaluator,
274
- middleware: this.middleware,
275
- dependencies: this.dependencies
276
- },
277
- options?.signal
278
- );
279
- }
280
- async resume(blueprint, serializedContext, resumeData, nodeId, options) {
281
- const executionId = globalThis.crypto?.randomUUID();
282
- const workflowState = new WorkflowState(
283
- this.serializer.deserialize(serializedContext)
284
- );
285
- const awaitingNodeIds = workflowState.getAwaitingNodeIds();
286
- if (awaitingNodeIds.length === 0) {
287
- throw new FlowcraftError("Cannot resume: The provided context is not in an awaiting state.", {
288
- isFatal: true
289
- });
290
- }
291
- const awaitingNodeId = nodeId || awaitingNodeIds[0];
292
- if (!awaitingNodeIds.includes(awaitingNodeId)) {
293
- throw new FlowcraftError(`Cannot resume: Node '${awaitingNodeId}' is not in an awaiting state.`, {
294
- isFatal: true
295
- });
296
- }
297
- const awaitingNodeDef = blueprint.nodes.find((n) => n.id === awaitingNodeId);
298
- if (!awaitingNodeDef) {
299
- throw new FlowcraftError(`Awaiting node '${awaitingNodeId}' not found in blueprint.`, {
300
- nodeId: awaitingNodeId,
301
- blueprintId: blueprint.id,
302
- isFatal: true
303
- });
304
- }
305
- const contextImpl = workflowState.getContext();
306
- if (awaitingNodeDef.uses === "SubflowNode") {
307
- const subflowStateKey = `_subflowState.${awaitingNodeId}`;
308
- const asyncContext = contextImpl;
309
- const subflowContext = await asyncContext.get(subflowStateKey);
310
- if (!subflowContext) {
311
- throw new FlowcraftError(`Cannot resume: Subflow state for node '${awaitingNodeId}' not found.`, {
312
- nodeId: awaitingNodeId,
313
- blueprintId: blueprint.id,
314
- isFatal: true
315
- });
316
- }
317
- const blueprintId = awaitingNodeDef.params?.blueprintId;
318
- if (!blueprintId) {
319
- throw new FlowcraftError(`Subflow node '${awaitingNodeId}' is missing the 'blueprintId' parameter.`, {
320
- nodeId: awaitingNodeId,
321
- blueprintId: blueprint.id,
322
- isFatal: true
323
- });
324
- }
325
- const subBlueprint = this.blueprints[blueprintId];
326
- if (!subBlueprint) {
327
- throw new FlowcraftError(`Sub-blueprint with ID '${blueprintId}' not found in runtime registry.`, {
328
- nodeId: awaitingNodeId,
329
- blueprintId: blueprint.id,
330
- isFatal: true
331
- });
332
- }
333
- const subflowResumeResult = await this.resume(subBlueprint, subflowContext, resumeData, void 0, options);
334
- if (subflowResumeResult.status !== "completed") {
335
- throw new FlowcraftError(
336
- `Resumed subflow '${subBlueprint.id}' did not complete. Status: ${subflowResumeResult.status}`,
337
- {
338
- nodeId: awaitingNodeId,
339
- blueprintId: blueprint.id,
340
- isFatal: false
341
- }
342
- );
343
- }
344
- const subflowFinalContext = subflowResumeResult.context;
345
- let finalSubflowOutput;
346
- const subAnalysis = analyzeBlueprint(subBlueprint);
347
- if (awaitingNodeDef.params?.outputs) {
348
- finalSubflowOutput = subflowFinalContext;
349
- } else if (subAnalysis.terminalNodeIds.length === 1) {
350
- const terminalId = subAnalysis.terminalNodeIds[0];
351
- finalSubflowOutput = subflowFinalContext[`_outputs.${terminalId}`];
352
- } else {
353
- const terminalOutputs = {};
354
- for (const terminalId of subAnalysis.terminalNodeIds) {
355
- terminalOutputs[terminalId] = subflowFinalContext[`_outputs.${terminalId}`];
356
- }
357
- finalSubflowOutput = terminalOutputs;
358
- }
359
- resumeData = { output: finalSubflowOutput };
360
- await contextImpl.delete(subflowStateKey);
361
- }
362
- workflowState.addCompletedNode(awaitingNodeId, resumeData.output);
363
- const nextSteps = await this.determineNextNodes(blueprint, awaitingNodeId, resumeData, contextImpl, executionId);
364
- if (nextSteps.length === 0) {
365
- workflowState.clearAwaiting(awaitingNodeId);
366
- const result = await workflowState.toResult(this.serializer, executionId);
367
- result.status = "completed";
368
- return result;
369
- }
370
- const traverserForResume = new GraphTraverser(blueprint);
371
- const allPredecessors = traverserForResume.getAllPredecessors();
372
- for (const { node, edge } of nextSteps) {
373
- await this.applyEdgeTransform(edge, resumeData, node, contextImpl, allPredecessors, executionId);
374
- }
375
- const traverser = GraphTraverser.fromState(blueprint, workflowState);
376
- const nextNodeDefs = nextSteps.map((s) => s.node);
377
- for (const nodeDef of nextNodeDefs) {
378
- traverser.addToFrontier(nodeDef.id);
379
- }
380
- workflowState.clearAwaiting(awaitingNodeId);
381
- const executionContext = this._setupResumedExecutionContext(blueprint, workflowState, options);
382
- return await this.orchestrator.run(executionContext, traverser);
383
- }
384
- _createExecutionRegistry(dynamicRegistry) {
385
- const executionRegistry = new Map(this.registry);
386
- if (dynamicRegistry) {
387
- for (const [key, func] of dynamicRegistry.entries()) {
388
- executionRegistry.set(key, func);
389
- }
390
- }
391
- return executionRegistry;
392
- }
393
- async executeNode(blueprint, nodeId, state, _allPredecessors, functionRegistry, executionId, signal) {
394
- const nodeDef = blueprint.nodes.find((n) => n.id === nodeId);
395
- if (!nodeDef) {
396
- throw new FlowcraftError(`Node '${nodeId}' not found in blueprint.`, {
397
- nodeId,
398
- blueprintId: blueprint.id,
399
- executionId,
400
- isFatal: false
401
- });
402
- }
403
- const contextImpl = state.getContext();
404
- const asyncContext = contextImpl;
405
- const input = await this.resolveNodeInput(nodeDef.id, blueprint, asyncContext);
406
- const nodeRegistry = new Map([...this.registry, ...functionRegistry || /* @__PURE__ */ new Map()]);
407
- const services = {
408
- logger: this.logger,
409
- eventBus: this.eventBus,
410
- serializer: this.serializer,
411
- evaluator: this.evaluator,
412
- middleware: this.middleware,
413
- dependencies: this.dependencies
414
- };
415
- const context = new ExecutionContext(blueprint, state, nodeRegistry, executionId || "", this, services, signal);
416
- const executor = this.executorFactory.createExecutorForNode(nodeId, context);
417
- const executionResult = await executor.execute(input);
418
- if (executionResult.status === "success") {
419
- return executionResult.result;
420
- }
421
- if (executionResult.status === "failed_with_fallback") {
422
- const fallbackNode = blueprint.nodes.find((n) => n.id === executionResult.fallbackNodeId);
423
- if (!fallbackNode) {
424
- throw new FlowcraftError(`Fallback node '${executionResult.fallbackNodeId}' not found in blueprint.`, {
425
- nodeId: nodeDef.id,
426
- blueprintId: blueprint.id,
427
- executionId,
428
- isFatal: false
429
- });
430
- }
431
- const fallbackInput = await this.resolveNodeInput(fallbackNode.id, blueprint, asyncContext);
432
- const fallbackExecutor = this.executorFactory.createExecutorForNode(fallbackNode.id, context);
433
- const fallbackResult = await fallbackExecutor.execute(fallbackInput);
434
- if (fallbackResult.status === "success") {
435
- state.markFallbackExecuted();
436
- state.addCompletedNode(executionResult.fallbackNodeId, fallbackResult.result.output);
437
- this.logger.info(`Fallback execution completed`, {
438
- nodeId: nodeDef.id,
439
- fallbackNodeId: executionResult.fallbackNodeId,
440
- executionId
441
- });
442
- return { ...fallbackResult.result, _fallbackExecuted: true };
443
- }
444
- throw fallbackResult.error;
445
- }
446
- throw executionResult.error;
447
- }
448
- getExecutorForNode(nodeId, context) {
449
- return this.executorFactory.createExecutorForNode(nodeId, context);
450
- }
451
- createForSubflow(subBlueprint, initialSubState, executionId, signal) {
452
- const subState = new WorkflowState(initialSubState);
453
- return new ExecutionContext(
454
- subBlueprint,
455
- subState,
456
- this.registry,
457
- executionId,
458
- this,
459
- {
460
- logger: this.logger,
461
- eventBus: this.eventBus,
462
- serializer: this.serializer,
463
- evaluator: this.evaluator,
464
- middleware: this.middleware,
465
- dependencies: this.dependencies
466
- },
467
- signal
468
- );
469
- }
470
- async determineNextNodes(blueprint, nodeId, result, context, executionId) {
471
- return this.logicHandler.determineNextNodes(blueprint, nodeId, result, context, executionId);
472
- }
473
- async applyEdgeTransform(edge, sourceResult, targetNode, context, allPredecessors, executionId) {
474
- return this.logicHandler.applyEdgeTransform(edge, sourceResult, targetNode, context, allPredecessors, executionId);
475
- }
476
- async resolveNodeInput(nodeId, blueprint, context) {
477
- return this.logicHandler.resolveNodeInput(nodeId, blueprint, context);
478
- }
479
- /**
480
- * Replay a workflow execution from a pre-recorded event history.
481
- * This reconstructs the final workflow state without executing any node logic,
482
- * enabling time-travel debugging and post-mortem analysis.
483
- *
484
- * @param blueprint The workflow blueprint
485
- * @param events The recorded event history for the execution
486
- * @param executionId Optional execution ID to filter events (if events contain multiple executions)
487
- * @returns The reconstructed workflow result
488
- */
489
- async replay(blueprint, events, executionId) {
490
- let filteredEvents = events;
491
- if (executionId) {
492
- filteredEvents = events.filter((event) => {
493
- if ("executionId" in event.payload) {
494
- return event.payload.executionId === executionId;
495
- }
496
- return false;
497
- });
498
- }
499
- if (!executionId) {
500
- const workflowStartEvent = filteredEvents.find((e) => e.type === "workflow:start");
501
- if (workflowStartEvent && "executionId" in workflowStartEvent.payload) {
502
- executionId = workflowStartEvent.payload.executionId;
503
- } else {
504
- throw new FlowcraftError("Cannot determine execution ID from events", { isFatal: true });
505
- }
506
- }
507
- const tempContext = this._setupExecutionContext(
508
- blueprint,
509
- {},
510
- { strict: false }
511
- // allow cycles in replay
512
- );
513
- const executionContext = new ExecutionContext(
514
- blueprint,
515
- tempContext.state,
516
- tempContext.nodeRegistry,
517
- executionId,
518
- this,
519
- tempContext.services,
520
- tempContext.signal,
521
- tempContext.concurrency
522
- );
523
- const { ReplayOrchestrator } = await import('./runtime/orchestrators/replay.js');
524
- const replayOrchestrator = new ReplayOrchestrator(filteredEvents);
525
- const traverser = new GraphTraverser(blueprint);
526
- return await replayOrchestrator.run(executionContext, traverser);
527
- }
528
- };
529
-
530
- export { FlowRuntime };
531
- //# sourceMappingURL=chunk-CIXL7AKH.js.map
532
- //# sourceMappingURL=chunk-CIXL7AKH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/runtime.ts"],"names":[],"mappings":"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","file":"chunk-CIXL7AKH.js","sourcesContent":["import type { BlueprintAnalysis } from '../analysis'\nimport { analyzeBlueprint } from '../analysis'\nimport { DIContainer, ServiceTokens } from '../container'\nimport { FlowcraftError } from '../errors'\nimport { PropertyEvaluator } from '../evaluator'\nimport { NullLogger } from '../logger'\nimport { BatchGatherNode } from '../nodes/batch-gather'\nimport { BatchScatterNode } from '../nodes/batch-scatter'\nimport { SleepNode } from '../nodes/sleep'\nimport { SubflowNode } from '../nodes/subflow'\nimport { WaitNode } from '../nodes/wait'\nimport { WebhookNode } from '../nodes/webhook'\nimport { sanitizeBlueprint } from '../sanitizer'\nimport { JsonSerializer } from '../serializer'\nimport type {\n\tContextImplementation,\n\tEdgeDefinition,\n\tFlowcraftEvent,\n\tIEvaluator,\n\tIEventBus,\n\tILogger,\n\tISerializer,\n\tMiddleware,\n\tNodeClass,\n\tNodeDefinition,\n\tNodeFunction,\n\tNodeResult,\n\tRuntimeOptions,\n\tWorkflowBlueprint,\n\tWorkflowError,\n\tWorkflowResult,\n} from '../types'\nimport { ExecutionContext } from './execution-context'\nimport { NodeExecutorFactory } from './node-executor-factory'\nimport { DefaultOrchestrator } from './orchestrator'\nimport { WorkflowScheduler } from './scheduler'\nimport { WorkflowState } from './state'\nimport { GraphTraverser } from './traverser'\nimport type { IOrchestrator, IRuntime } from './types'\nimport { WorkflowLogicHandler } from './workflow-logic-handler'\n\nexport class FlowRuntime<TContext extends Record<string, any>, TDependencies extends Record<string, any>>\n\timplements IRuntime<TContext, TDependencies>\n{\n\tprivate container: DIContainer\n\tpublic registry: Map<string, NodeFunction | NodeClass>\n\tprivate blueprints: Record<string, WorkflowBlueprint>\n\tpublic dependencies: TDependencies\n\tpublic logger: ILogger\n\tpublic eventBus: IEventBus\n\tpublic serializer: ISerializer\n\tpublic middleware: Middleware[]\n\tpublic evaluator: IEvaluator\n\tprivate analysisCache: WeakMap<WorkflowBlueprint, BlueprintAnalysis>\n\tpublic orchestrator: IOrchestrator\n\tpublic options: RuntimeOptions<TDependencies>\n\tprivate readonly logicHandler: WorkflowLogicHandler\n\tprivate readonly executorFactory: NodeExecutorFactory\n\tpublic scheduler: WorkflowScheduler\n\n\tgetBlueprint(id: string): WorkflowBlueprint | undefined {\n\t\treturn this.blueprints[id]\n\t}\n\n\tconstructor(container: DIContainer, options?: RuntimeOptions<TDependencies>)\n\tconstructor(options: RuntimeOptions<TDependencies>)\n\tconstructor(\n\t\tcontainerOrOptions: DIContainer | RuntimeOptions<TDependencies>,\n\t\tlegacyOptions?: RuntimeOptions<TDependencies>,\n\t) {\n\t\tlet userRegistry: any\n\n\t\tif (containerOrOptions instanceof DIContainer) {\n\t\t\tthis.container = containerOrOptions\n\t\t\tthis.logger = this.container.resolve<ILogger>(ServiceTokens.Logger)\n\t\t\tthis.serializer = this.container.resolve<ISerializer>(ServiceTokens.Serializer)\n\t\t\tthis.evaluator = this.container.resolve<IEvaluator>(ServiceTokens.Evaluator)\n\t\t\tthis.eventBus = this.container.resolve<IEventBus>(ServiceTokens.EventBus) || { emit: async () => {} }\n\t\t\tthis.middleware = this.container.resolve<Middleware[]>(ServiceTokens.Middleware) || []\n\t\t\tuserRegistry = this.container.resolve(ServiceTokens.NodeRegistry)\n\t\t\tthis.blueprints = this.container.resolve<Record<string, WorkflowBlueprint>>(ServiceTokens.BlueprintRegistry)\n\t\t\tthis.dependencies = this.container.resolve<TDependencies>(ServiceTokens.Dependencies)\n\t\t\tthis.options = legacyOptions || ({} as RuntimeOptions<TDependencies>)\n\t\t\tthis.orchestrator = this.container.resolve<IOrchestrator>(ServiceTokens.Orchestrator)\n\t\t\tthis.scheduler = new WorkflowScheduler(this)\n\t\t} else {\n\t\t\tconst options = containerOrOptions\n\t\t\tthis.logger = options.logger || new NullLogger()\n\t\t\tthis.serializer = options.serializer || new JsonSerializer()\n\t\t\tthis.evaluator = options.evaluator || new PropertyEvaluator()\n\t\t\tthis.eventBus = options.eventBus || { emit: async () => {} }\n\t\t\tthis.middleware = options.middleware || []\n\t\t\tuserRegistry = options.registry || {}\n\t\t\tthis.blueprints = options.blueprints || {}\n\t\t\tthis.scheduler = new WorkflowScheduler(this)\n\t\t\tthis.dependencies = options.dependencies || ({} as TDependencies)\n\t\t\tthis.options = options\n\t\t\tthis.container = null as any\n\t\t}\n\n\t\tconst loopControllerFunction: NodeFunction = async (context) => {\n\t\t\tconst condition = context.params.condition\n\t\t\tconst contextData = await context.context.toJSON()\n\t\t\tconst result = this.evaluator.evaluate(condition, contextData)\n\t\t\tif (result) {\n\t\t\t\treturn { action: 'continue' }\n\t\t\t} else {\n\t\t\t\treturn { action: 'break', output: null }\n\t\t\t}\n\t\t}\n\t\tconst builtInNodes = {\n\t\t\twait: WaitNode,\n\t\t\tsleep: SleepNode,\n\t\t\twebhook: WebhookNode,\n\t\t\tsubflow: SubflowNode,\n\t\t\t'batch-scatter': BatchScatterNode,\n\t\t\t'batch-gather': BatchGatherNode,\n\t\t\t'loop-controller': loopControllerFunction,\n\t\t}\n\t\tthis.registry = new Map(Object.entries({ ...builtInNodes, ...userRegistry }))\n\t\tthis.orchestrator = this.container?.has(ServiceTokens.Orchestrator)\n\t\t\t? this.container.resolve<IOrchestrator>(ServiceTokens.Orchestrator)\n\t\t\t: new DefaultOrchestrator()\n\t\tthis.analysisCache = new WeakMap()\n\t\tthis.logicHandler = new WorkflowLogicHandler(this.evaluator, this.eventBus)\n\t\tthis.executorFactory = new NodeExecutorFactory(this.eventBus)\n\t}\n\n\tprivate _setupExecutionContext(\n\t\tblueprint: WorkflowBlueprint,\n\t\tinitialState: Partial<TContext> | string,\n\t\toptions?: {\n\t\t\tfunctionRegistry?: Map<string, any>\n\t\t\tstrict?: boolean\n\t\t\tsignal?: AbortSignal\n\t\t\tconcurrency?: number\n\t\t},\n\t): ExecutionContext<TContext, TDependencies> {\n\t\tconst executionId = globalThis.crypto?.randomUUID()\n\t\tconst contextData =\n\t\t\ttypeof initialState === 'string' ? (this.serializer.deserialize(initialState) as Partial<TContext>) : initialState\n\t\tblueprint = sanitizeBlueprint(blueprint)\n\t\tconst state = new WorkflowState<TContext>(contextData)\n\t\tconst nodeRegistry = this._createExecutionRegistry(options?.functionRegistry)\n\t\treturn new ExecutionContext(\n\t\t\tblueprint,\n\t\t\tstate,\n\t\t\tnodeRegistry,\n\t\t\texecutionId,\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tlogger: this.logger,\n\t\t\t\teventBus: this.eventBus,\n\t\t\t\tserializer: this.serializer,\n\t\t\t\tevaluator: this.evaluator,\n\t\t\t\tmiddleware: this.middleware,\n\t\t\t\tdependencies: this.dependencies,\n\t\t\t},\n\t\t\toptions?.signal,\n\t\t\toptions?.concurrency,\n\t\t)\n\t}\n\n\tasync run(\n\t\tblueprint: WorkflowBlueprint,\n\t\tinitialState: Partial<TContext> | string = {},\n\t\toptions?: {\n\t\t\tfunctionRegistry?: Map<string, any>\n\t\t\tstrict?: boolean\n\t\t\tsignal?: AbortSignal\n\t\t\tconcurrency?: number\n\t\t},\n\t): Promise<WorkflowResult<TContext>> {\n\t\tconst startTime = Date.now()\n\t\tconst executionContext = this._setupExecutionContext(blueprint, initialState, options)\n\n\t\tthis.logger.info(`Starting workflow execution`, {\n\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\texecutionId: executionContext.executionId,\n\t\t})\n\n\t\ttry {\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'workflow:start',\n\t\t\t\tpayload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId },\n\t\t\t})\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'workflow:resume',\n\t\t\t\tpayload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId },\n\t\t\t})\n\t\t\tconst analysis =\n\t\t\t\tthis.analysisCache.get(executionContext.blueprint) ??\n\t\t\t\t(() => {\n\t\t\t\t\tconst computed = analyzeBlueprint(executionContext.blueprint)\n\t\t\t\t\tthis.analysisCache.set(executionContext.blueprint, computed)\n\t\t\t\t\treturn computed\n\t\t\t\t})()\n\t\t\tif (options?.strict && !analysis.isDag) {\n\t\t\t\tthrow new Error(`Workflow '${executionContext.blueprint.id}' failed strictness check: Cycles are not allowed.`)\n\t\t\t}\n\t\t\tif (!analysis.isDag) {\n\t\t\t\tthis.logger.warn(`Workflow contains cycles`, {\n\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst traverser = new GraphTraverser(executionContext.blueprint, options?.strict === true)\n\t\t\tconst result = await this.orchestrator.run(executionContext, traverser)\n\n\t\t\tconst duration = Date.now() - startTime\n\t\t\tif (result.status === 'stalled') {\n\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\ttype: 'workflow:stall',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\t\tremainingNodes: traverser.getAllNodeIds().size - executionContext.state.getCompletedNodes().size,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\ttype: 'workflow:pause',\n\t\t\t\t\tpayload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId },\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.logger.info(`Workflow execution completed`, {\n\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\tstatus: result.status,\n\t\t\t\tduration,\n\t\t\t\terrors: result.errors?.length || 0,\n\t\t\t})\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'workflow:finish',\n\t\t\t\tpayload: {\n\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\tstatus: result.status,\n\t\t\t\t\terrors: result.errors,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (result.status === 'awaiting') {\n\t\t\t\tconst awaitingNodeIds = executionContext.state.getAwaitingNodeIds()\n\t\t\t\tfor (const nodeId of awaitingNodeIds) {\n\t\t\t\t\tconst details = executionContext.state.getAwaitingDetails(nodeId)\n\t\t\t\t\tif (details?.reason === 'timer') {\n\t\t\t\t\t\tthis.scheduler.registerAwaitingWorkflow(\n\t\t\t\t\t\t\texecutionContext.executionId,\n\t\t\t\t\t\t\texecutionContext.blueprint.id,\n\t\t\t\t\t\t\tresult.serializedContext,\n\t\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\t\tdetails.wakeUpAt,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result\n\t\t} catch (error) {\n\t\t\tconst duration = Date.now() - startTime\n\t\t\tconst workflowError: WorkflowError = {\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tisFatal: false,\n\t\t\t\tname: 'WorkflowError',\n\t\t\t}\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'workflow:finish',\n\t\t\t\tpayload: {\n\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\tstatus: 'cancelled',\n\t\t\t\t\terrors: [workflowError],\n\t\t\t\t},\n\t\t\t})\n\t\t\tif (\n\t\t\t\terror instanceof DOMException\n\t\t\t\t\t? error.name === 'AbortError'\n\t\t\t\t\t: error instanceof FlowcraftError && error.message.includes('cancelled')\n\t\t\t) {\n\t\t\t\tthis.logger.info(`Workflow execution cancelled`, {\n\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\tduration,\n\t\t\t\t})\n\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\ttype: 'workflow:pause',\n\t\t\t\t\tpayload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId },\n\t\t\t\t})\n\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\ttype: 'workflow:finish',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\t\tstatus: 'cancelled',\n\t\t\t\t\t\terrors: [workflowError],\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\treturn {\n\t\t\t\t\tcontext: {} as TContext,\n\t\t\t\t\tserializedContext: '{}',\n\t\t\t\t\tstatus: 'cancelled',\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.logger.error(`Workflow execution failed`, {\n\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\tduration,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t})\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tstartScheduler(checkIntervalMs?: number): void {\n\t\tif (checkIntervalMs !== undefined) {\n\t\t\tthis.scheduler = new WorkflowScheduler(this, checkIntervalMs)\n\t\t}\n\t\tthis.scheduler.start()\n\t}\n\n\tstopScheduler(): void {\n\t\tthis.scheduler.stop()\n\t}\n\n\tprivate _setupResumedExecutionContext(\n\t\tblueprint: WorkflowBlueprint,\n\t\tworkflowState: WorkflowState<TContext>,\n\t\toptions?: {\n\t\t\tfunctionRegistry?: Map<string, any>\n\t\t\tstrict?: boolean\n\t\t\tsignal?: AbortSignal\n\t\t\tconcurrency?: number\n\t\t},\n\t): ExecutionContext<TContext, TDependencies> {\n\t\tconst executionId = globalThis.crypto?.randomUUID()\n\t\tconst nodeRegistry = this._createExecutionRegistry(options?.functionRegistry)\n\t\treturn new ExecutionContext(\n\t\t\tblueprint,\n\t\t\tworkflowState,\n\t\t\tnodeRegistry,\n\t\t\texecutionId,\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tlogger: this.logger,\n\t\t\t\teventBus: this.eventBus,\n\t\t\t\tserializer: this.serializer,\n\t\t\t\tevaluator: this.evaluator,\n\t\t\t\tmiddleware: this.middleware,\n\t\t\t\tdependencies: this.dependencies,\n\t\t\t},\n\t\t\toptions?.signal,\n\t\t)\n\t}\n\n\tasync resume(\n\t\tblueprint: WorkflowBlueprint,\n\t\tserializedContext: string,\n\t\tresumeData: { output?: any; action?: string },\n\t\tnodeId?: string,\n\t\toptions?: {\n\t\t\tfunctionRegistry?: Map<string, any>\n\t\t\tstrict?: boolean\n\t\t\tsignal?: AbortSignal\n\t\t\tconcurrency?: number\n\t\t},\n\t): Promise<WorkflowResult<TContext>> {\n\t\tconst executionId = globalThis.crypto?.randomUUID()\n\t\tconst workflowState = new WorkflowState<TContext>(\n\t\t\tthis.serializer.deserialize(serializedContext) as Partial<TContext>,\n\t\t)\n\n\t\tconst awaitingNodeIds = workflowState.getAwaitingNodeIds()\n\t\tif (awaitingNodeIds.length === 0) {\n\t\t\tthrow new FlowcraftError('Cannot resume: The provided context is not in an awaiting state.', {\n\t\t\t\tisFatal: true,\n\t\t\t})\n\t\t}\n\n\t\tconst awaitingNodeId = nodeId || awaitingNodeIds[0]\n\t\tif (!awaitingNodeIds.includes(awaitingNodeId)) {\n\t\t\tthrow new FlowcraftError(`Cannot resume: Node '${awaitingNodeId}' is not in an awaiting state.`, {\n\t\t\t\tisFatal: true,\n\t\t\t})\n\t\t}\n\n\t\tconst awaitingNodeDef = blueprint.nodes.find((n) => n.id === awaitingNodeId)\n\t\tif (!awaitingNodeDef) {\n\t\t\tthrow new FlowcraftError(`Awaiting node '${awaitingNodeId}' not found in blueprint.`, {\n\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\tisFatal: true,\n\t\t\t})\n\t\t}\n\n\t\tconst contextImpl = workflowState.getContext()\n\n\t\tif (awaitingNodeDef.uses === 'SubflowNode') {\n\t\t\tconst subflowStateKey = `_subflowState.${awaitingNodeId}`\n\t\t\tconst asyncContext = contextImpl\n\t\t\tconst subflowContext = (await asyncContext.get(subflowStateKey as any)) as string\n\n\t\t\tif (!subflowContext) {\n\t\t\t\tthrow new FlowcraftError(`Cannot resume: Subflow state for node '${awaitingNodeId}' not found.`, {\n\t\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\tisFatal: true,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst blueprintId = awaitingNodeDef.params?.blueprintId\n\t\t\tif (!blueprintId) {\n\t\t\t\tthrow new FlowcraftError(`Subflow node '${awaitingNodeId}' is missing the 'blueprintId' parameter.`, {\n\t\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\tisFatal: true,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst subBlueprint = this.blueprints[blueprintId]\n\t\t\tif (!subBlueprint) {\n\t\t\t\tthrow new FlowcraftError(`Sub-blueprint with ID '${blueprintId}' not found in runtime registry.`, {\n\t\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\tisFatal: true,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst subflowResumeResult = await this.resume(subBlueprint, subflowContext, resumeData, undefined, options)\n\n\t\t\tif (subflowResumeResult.status !== 'completed') {\n\t\t\t\tthrow new FlowcraftError(\n\t\t\t\t\t`Resumed subflow '${subBlueprint.id}' did not complete. Status: ${subflowResumeResult.status}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\t\tisFatal: false,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// mirror the output extraction logic from SubflowNode.exec\n\t\t\tconst subflowFinalContext = subflowResumeResult.context as Record<string, any>\n\t\t\tlet finalSubflowOutput: any\n\t\t\tconst subAnalysis = analyzeBlueprint(subBlueprint)\n\n\t\t\tif (awaitingNodeDef.params?.outputs) {\n\t\t\t\tfinalSubflowOutput = subflowFinalContext\n\t\t\t} else if (subAnalysis.terminalNodeIds.length === 1) {\n\t\t\t\tconst terminalId = subAnalysis.terminalNodeIds[0]\n\t\t\t\tfinalSubflowOutput = subflowFinalContext[`_outputs.${terminalId}`]\n\t\t\t} else {\n\t\t\t\tconst terminalOutputs: Record<string, any> = {}\n\t\t\t\tfor (const terminalId of subAnalysis.terminalNodeIds) {\n\t\t\t\t\tterminalOutputs[terminalId] = subflowFinalContext[`_outputs.${terminalId}`]\n\t\t\t\t}\n\t\t\t\tfinalSubflowOutput = terminalOutputs\n\t\t\t}\n\n\t\t\tresumeData = { output: finalSubflowOutput }\n\n\t\t\tawait contextImpl.delete(subflowStateKey as any)\n\t\t}\n\n\t\tworkflowState.addCompletedNode(awaitingNodeId, resumeData.output)\n\n\t\tconst nextSteps = await this.determineNextNodes(blueprint, awaitingNodeId, resumeData, contextImpl, executionId)\n\n\t\tif (nextSteps.length === 0) {\n\t\t\tworkflowState.clearAwaiting(awaitingNodeId)\n\t\t\tconst result = await workflowState.toResult(this.serializer, executionId)\n\t\t\tresult.status = 'completed'\n\t\t\treturn result\n\t\t}\n\n\t\tconst traverserForResume = new GraphTraverser(blueprint)\n\t\tconst allPredecessors = traverserForResume.getAllPredecessors()\n\n\t\tfor (const { node, edge } of nextSteps) {\n\t\t\tawait this.applyEdgeTransform(edge, resumeData, node, contextImpl, allPredecessors, executionId)\n\t\t}\n\n\t\tconst traverser = GraphTraverser.fromState(blueprint, workflowState)\n\n\t\tconst nextNodeDefs = nextSteps.map((s) => s.node)\n\t\tfor (const nodeDef of nextNodeDefs) {\n\t\t\ttraverser.addToFrontier(nodeDef.id)\n\t\t}\n\n\t\tworkflowState.clearAwaiting(awaitingNodeId)\n\n\t\tconst executionContext = this._setupResumedExecutionContext(blueprint, workflowState, options)\n\n\t\treturn await this.orchestrator.run(executionContext, traverser)\n\t}\n\n\tpublic _createExecutionRegistry(dynamicRegistry?: Map<string, any>): Map<string, NodeFunction | NodeClass> {\n\t\tconst executionRegistry = new Map(this.registry)\n\t\tif (dynamicRegistry) {\n\t\t\tfor (const [key, func] of dynamicRegistry.entries()) {\n\t\t\t\texecutionRegistry.set(key, func)\n\t\t\t}\n\t\t}\n\t\treturn executionRegistry\n\t}\n\n\tasync executeNode(\n\t\tblueprint: WorkflowBlueprint,\n\t\tnodeId: string,\n\t\tstate: WorkflowState<TContext>,\n\t\t_allPredecessors?: Map<string, Set<string>>,\n\t\tfunctionRegistry?: Map<string, any>,\n\t\texecutionId?: string,\n\t\tsignal?: AbortSignal,\n\t): Promise<NodeResult<any, any>> {\n\t\tconst nodeDef = blueprint.nodes.find((n) => n.id === nodeId)\n\t\tif (!nodeDef) {\n\t\t\tthrow new FlowcraftError(`Node '${nodeId}' not found in blueprint.`, {\n\t\t\t\tnodeId,\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\texecutionId,\n\t\t\t\tisFatal: false,\n\t\t\t})\n\t\t}\n\n\t\tconst contextImpl = state.getContext()\n\t\tconst asyncContext = contextImpl\n\n\t\tconst input = await this.resolveNodeInput(nodeDef.id, blueprint, asyncContext)\n\t\tconst nodeRegistry = new Map([...this.registry, ...(functionRegistry || new Map())])\n\n\t\tconst services = {\n\t\t\tlogger: this.logger,\n\t\t\teventBus: this.eventBus,\n\t\t\tserializer: this.serializer,\n\t\t\tevaluator: this.evaluator,\n\t\t\tmiddleware: this.middleware,\n\t\t\tdependencies: this.dependencies,\n\t\t}\n\t\tconst context = new ExecutionContext(blueprint, state, nodeRegistry, executionId || '', this, services, signal)\n\n\t\tconst executor = this.executorFactory.createExecutorForNode(nodeId, context)\n\n\t\tconst executionResult = await executor.execute(input)\n\n\t\tif (executionResult.status === 'success') {\n\t\t\treturn executionResult.result\n\t\t}\n\n\t\tif (executionResult.status === 'failed_with_fallback') {\n\t\t\tconst fallbackNode = blueprint.nodes.find((n: NodeDefinition) => n.id === executionResult.fallbackNodeId)\n\t\t\tif (!fallbackNode) {\n\t\t\t\tthrow new FlowcraftError(`Fallback node '${executionResult.fallbackNodeId}' not found in blueprint.`, {\n\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\texecutionId,\n\t\t\t\t\tisFatal: false,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst fallbackInput = await this.resolveNodeInput(fallbackNode.id, blueprint, asyncContext)\n\t\t\tconst fallbackExecutor = this.executorFactory.createExecutorForNode(fallbackNode.id, context)\n\n\t\t\tconst fallbackResult = await fallbackExecutor.execute(fallbackInput)\n\t\t\tif (fallbackResult.status === 'success') {\n\t\t\t\tstate.markFallbackExecuted()\n\t\t\t\tstate.addCompletedNode(executionResult.fallbackNodeId, fallbackResult.result.output)\n\t\t\t\tthis.logger.info(`Fallback execution completed`, {\n\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\tfallbackNodeId: executionResult.fallbackNodeId,\n\t\t\t\t\texecutionId,\n\t\t\t\t})\n\t\t\t\treturn { ...fallbackResult.result, _fallbackExecuted: true }\n\t\t\t}\n\n\t\t\tthrow fallbackResult.error\n\t\t}\n\n\t\tthrow executionResult.error\n\t}\n\n\tpublic getExecutorForNode(nodeId: string, context: ExecutionContext<TContext, TDependencies>): any {\n\t\treturn this.executorFactory.createExecutorForNode(nodeId, context)\n\t}\n\n\tpublic createForSubflow(\n\t\tsubBlueprint: WorkflowBlueprint,\n\t\tinitialSubState: Partial<TContext>,\n\t\texecutionId: string,\n\t\tsignal?: AbortSignal,\n\t): ExecutionContext<TContext, TDependencies> {\n\t\tconst subState = new WorkflowState<TContext>(initialSubState)\n\t\treturn new ExecutionContext(\n\t\t\tsubBlueprint,\n\t\t\tsubState,\n\t\t\tthis.registry,\n\t\t\texecutionId,\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tlogger: this.logger,\n\t\t\t\teventBus: this.eventBus,\n\t\t\t\tserializer: this.serializer,\n\t\t\t\tevaluator: this.evaluator,\n\t\t\t\tmiddleware: this.middleware,\n\t\t\t\tdependencies: this.dependencies,\n\t\t\t},\n\t\t\tsignal,\n\t\t)\n\t}\n\n\tasync determineNextNodes(\n\t\tblueprint: WorkflowBlueprint,\n\t\tnodeId: string,\n\t\tresult: NodeResult<any, any>,\n\t\tcontext: ContextImplementation<TContext>,\n\t\texecutionId?: string,\n\t): Promise<{ node: NodeDefinition; edge: EdgeDefinition }[]> {\n\t\treturn this.logicHandler.determineNextNodes(blueprint, nodeId, result, context, executionId)\n\t}\n\n\tpublic async applyEdgeTransform(\n\t\tedge: EdgeDefinition,\n\t\tsourceResult: NodeResult<any, any>,\n\t\ttargetNode: NodeDefinition,\n\t\tcontext: ContextImplementation<TContext>,\n\t\tallPredecessors?: Map<string, Set<string>>,\n\t\texecutionId?: string,\n\t): Promise<void> {\n\t\treturn this.logicHandler.applyEdgeTransform(edge, sourceResult, targetNode, context, allPredecessors, executionId)\n\t}\n\n\tpublic async resolveNodeInput(\n\t\tnodeId: string,\n\t\tblueprint: WorkflowBlueprint,\n\t\tcontext: ContextImplementation<TContext>,\n\t): Promise<any> {\n\t\treturn this.logicHandler.resolveNodeInput(nodeId, blueprint, context)\n\t}\n\n\t/**\n\t * Replay a workflow execution from a pre-recorded event history.\n\t * This reconstructs the final workflow state without executing any node logic,\n\t * enabling time-travel debugging and post-mortem analysis.\n\t *\n\t * @param blueprint The workflow blueprint\n\t * @param events The recorded event history for the execution\n\t * @param executionId Optional execution ID to filter events (if events contain multiple executions)\n\t * @returns The reconstructed workflow result\n\t */\n\tasync replay(\n\t\tblueprint: WorkflowBlueprint,\n\t\tevents: FlowcraftEvent[],\n\t\texecutionId?: string,\n\t): Promise<WorkflowResult<TContext>> {\n\t\tlet filteredEvents = events\n\t\tif (executionId) {\n\t\t\tfilteredEvents = events.filter((event) => {\n\t\t\t\tif ('executionId' in event.payload) {\n\t\t\t\t\treturn event.payload.executionId === executionId\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t})\n\t\t}\n\n\t\tif (!executionId) {\n\t\t\tconst workflowStartEvent = filteredEvents.find((e) => e.type === 'workflow:start')\n\t\t\tif (workflowStartEvent && 'executionId' in workflowStartEvent.payload) {\n\t\t\t\texecutionId = workflowStartEvent.payload.executionId\n\t\t\t} else {\n\t\t\t\tthrow new FlowcraftError('Cannot determine execution ID from events', { isFatal: true })\n\t\t\t}\n\t\t}\n\n\t\tconst tempContext = this._setupExecutionContext(\n\t\t\tblueprint,\n\t\t\t{},\n\t\t\t{ strict: false }, // allow cycles in replay\n\t\t)\n\n\t\tconst executionContext = new ExecutionContext(\n\t\t\tblueprint,\n\t\t\ttempContext.state,\n\t\t\ttempContext.nodeRegistry,\n\t\t\texecutionId,\n\t\t\tthis,\n\t\t\ttempContext.services,\n\t\t\ttempContext.signal,\n\t\t\ttempContext.concurrency,\n\t\t)\n\n\t\tconst { ReplayOrchestrator } = await import('./orchestrators/replay')\n\t\tconst replayOrchestrator = new ReplayOrchestrator(filteredEvents)\n\n\t\tconst traverser = new GraphTraverser(blueprint)\n\n\t\treturn await replayOrchestrator.run(executionContext, traverser)\n\t}\n}\n"]}
@@ -1,39 +0,0 @@
1
- import { NodeExecutor, ClassNodeExecutor, FunctionNodeExecutor } from './chunk-ONH7PIJZ.js';
2
- import { FlowcraftError } from './chunk-BCRWXTWX.js';
3
- import { isNodeClass } from './chunk-LNK7LZER.js';
4
-
5
- // src/runtime/node-executor-factory.ts
6
- var NodeExecutorFactory = class {
7
- constructor(eventBus) {
8
- this.eventBus = eventBus;
9
- }
10
- createExecutorForNode(nodeId, context) {
11
- const nodeDef = context.blueprint.nodes.find((n) => n.id === nodeId);
12
- if (!nodeDef) {
13
- throw new FlowcraftError(`Node '${nodeId}' not found in blueprint.`, {
14
- nodeId,
15
- blueprintId: context.blueprint.id,
16
- executionId: context.executionId,
17
- isFatal: false
18
- });
19
- }
20
- const strategy = this.getExecutionStrategy(nodeDef, context.nodeRegistry);
21
- return new NodeExecutor({ context, nodeDef, strategy });
22
- }
23
- getExecutionStrategy(nodeDef, nodeRegistry) {
24
- const implementation = nodeRegistry.get(nodeDef.uses);
25
- if (!implementation) {
26
- throw new FlowcraftError(`Implementation for '${nodeDef.uses}' not found.`, {
27
- nodeId: nodeDef.id,
28
- blueprintId: "",
29
- isFatal: true
30
- });
31
- }
32
- const maxRetries = nodeDef.config?.maxRetries ?? 1;
33
- return isNodeClass(implementation) ? new ClassNodeExecutor(implementation, maxRetries, this.eventBus) : new FunctionNodeExecutor(implementation, maxRetries, this.eventBus);
34
- }
35
- };
36
-
37
- export { NodeExecutorFactory };
38
- //# sourceMappingURL=chunk-DL7KVYZF.js.map
39
- //# sourceMappingURL=chunk-DL7KVYZF.js.map