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,164 +0,0 @@
1
- import { AsyncContextView } from './chunk-ZETQCNEF.js';
2
- import { FlowcraftError } from './chunk-BCRWXTWX.js';
3
-
4
- // src/runtime/workflow-logic-handler.ts
5
- var WorkflowLogicHandler = class {
6
- constructor(evaluator, eventBus) {
7
- this.evaluator = evaluator;
8
- this.eventBus = eventBus;
9
- }
10
- async determineNextNodes(blueprint, completedNodeId, result, context, executionId) {
11
- if (!result) return [];
12
- const effectiveSourceNodeId = completedNodeId;
13
- const directOutgoingEdges = blueprint.edges.filter((edge) => edge.source === effectiveSourceNodeId);
14
- const nodesThisIsAFallbackFor = blueprint.nodes.filter((n) => n.config?.fallback === completedNodeId);
15
- const inheritedOutgoingEdges = nodesThisIsAFallbackFor.flatMap(
16
- (originalNode) => blueprint.edges.filter((edge) => edge.source === originalNode.id)
17
- );
18
- const allPossibleEdges = [...directOutgoingEdges, ...inheritedOutgoingEdges];
19
- const outgoingEdges = [
20
- ...new Map(
21
- allPossibleEdges.map((edge) => [
22
- `${edge.source}-${edge.target}-${edge.action || ""}-${edge.condition || ""}`,
23
- edge
24
- ])
25
- ).values()
26
- ];
27
- const matched = [];
28
- const evaluateEdge = async (edge) => {
29
- if (!edge.condition) return true;
30
- const contextData = context.type === "sync" ? context.toJSON() : await context.toJSON();
31
- const evaluationResult = !!this.evaluator.evaluate(edge.condition, {
32
- ...contextData,
33
- result
34
- });
35
- await this.eventBus.emit({
36
- type: "edge:evaluate",
37
- payload: { source: edge.source, target: edge.target, condition: edge.condition, result: evaluationResult }
38
- });
39
- return evaluationResult;
40
- };
41
- const completedNode = blueprint.nodes.find((n) => n.id === completedNodeId);
42
- const isLoopController = completedNode?.uses === "loop-controller";
43
- if (isLoopController) {
44
- const conditionalEdges = outgoingEdges.filter((edge) => edge.condition);
45
- for (const edge of conditionalEdges) {
46
- if (await evaluateEdge(edge)) {
47
- const targetNode = blueprint.nodes.find((n) => n.id === edge.target);
48
- if (targetNode) matched.push({ node: targetNode, edge });
49
- } else {
50
- await this.eventBus.emit({
51
- type: "node:skipped",
52
- payload: { nodeId: completedNodeId, edge, executionId: executionId || "", blueprintId: blueprint.id }
53
- });
54
- }
55
- }
56
- if (matched.length > 0) {
57
- return matched;
58
- }
59
- }
60
- if (result.action) {
61
- const actionEdges = outgoingEdges.filter((edge) => edge.action === result.action);
62
- for (const edge of actionEdges) {
63
- if (await evaluateEdge(edge)) {
64
- const targetNode = blueprint.nodes.find((n) => n.id === edge.target);
65
- if (targetNode) matched.push({ node: targetNode, edge });
66
- } else {
67
- await this.eventBus.emit({
68
- type: "node:skipped",
69
- payload: { nodeId: completedNodeId, edge, executionId: executionId || "", blueprintId: blueprint.id }
70
- });
71
- }
72
- }
73
- }
74
- if (matched.length === 0) {
75
- const defaultEdges = outgoingEdges.filter((edge) => !edge.action);
76
- for (const edge of defaultEdges) {
77
- if (await evaluateEdge(edge)) {
78
- const targetNode = blueprint.nodes.find((n) => n.id === edge.target);
79
- if (targetNode) matched.push({ node: targetNode, edge });
80
- } else {
81
- await this.eventBus.emit({
82
- type: "node:skipped",
83
- payload: { nodeId: completedNodeId, edge, executionId: executionId || "", blueprintId: blueprint.id }
84
- });
85
- }
86
- }
87
- }
88
- return matched;
89
- }
90
- async applyEdgeTransform(edge, sourceResult, targetNode, context, allPredecessors, executionId) {
91
- const asyncContext = context.type === "sync" ? new AsyncContextView(context) : context;
92
- const predecessors = allPredecessors?.get(targetNode.id);
93
- const hasSinglePredecessor = predecessors && predecessors.size === 1;
94
- const hasExplicitInputs = targetNode.inputs !== void 0;
95
- const hasEdgeTransform = edge.transform !== void 0;
96
- if (!hasExplicitInputs && !hasSinglePredecessor && !hasEdgeTransform) {
97
- return;
98
- }
99
- const finalInput = edge.transform ? this.evaluator.evaluate(edge.transform, {
100
- input: sourceResult.output,
101
- context: await asyncContext.toJSON()
102
- }) : sourceResult.output;
103
- const inputKey = `_inputs.${targetNode.id}`;
104
- await asyncContext.set(inputKey, finalInput);
105
- await this.eventBus.emit({
106
- type: "context:change",
107
- payload: {
108
- sourceNode: edge.source,
109
- key: inputKey,
110
- op: "set",
111
- value: finalInput,
112
- executionId: executionId || "unknown"
113
- }
114
- });
115
- if (!hasExplicitInputs) {
116
- targetNode.inputs = inputKey;
117
- }
118
- }
119
- async resolveNodeInput(nodeId, blueprint, context) {
120
- const nodeDef = blueprint.nodes.find((n) => n.id === nodeId);
121
- if (!nodeDef) {
122
- throw new FlowcraftError(`Node '${nodeId}' not found in blueprint.`, {
123
- nodeId,
124
- blueprintId: blueprint.id,
125
- isFatal: false
126
- });
127
- }
128
- const asyncContext = context.type === "sync" ? new AsyncContextView(context) : context;
129
- if (nodeDef.inputs) {
130
- if (typeof nodeDef.inputs === "string") {
131
- const key = nodeDef.inputs;
132
- if (key.startsWith("_")) return await asyncContext.get(key);
133
- const outputKey = `_outputs.${key}`;
134
- if (await asyncContext.has(outputKey)) {
135
- return await asyncContext.get(outputKey);
136
- }
137
- return await asyncContext.get(key);
138
- }
139
- if (typeof nodeDef.inputs === "object") {
140
- const input = {};
141
- for (const key in nodeDef.inputs) {
142
- const contextKey = nodeDef.inputs[key];
143
- if (contextKey.startsWith("_")) {
144
- input[key] = await asyncContext.get(contextKey);
145
- } else {
146
- const outputKey = `_outputs.${contextKey}`;
147
- if (await asyncContext.has(outputKey)) {
148
- input[key] = await asyncContext.get(outputKey);
149
- } else {
150
- input[key] = await asyncContext.get(contextKey);
151
- }
152
- }
153
- }
154
- return input;
155
- }
156
- }
157
- const inputKey = `_inputs.${nodeDef.id}`;
158
- return await asyncContext.get(inputKey);
159
- }
160
- };
161
-
162
- export { WorkflowLogicHandler };
163
- //# sourceMappingURL=chunk-PU2VTWJD.js.map
164
- //# sourceMappingURL=chunk-PU2VTWJD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/workflow-logic-handler.ts"],"names":[],"mappings":"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","file":"chunk-PU2VTWJD.js","sourcesContent":["import { AsyncContextView } from '../context'\nimport { FlowcraftError } from '../errors'\nimport type {\n\tContextImplementation,\n\tEdgeDefinition,\n\tIEvaluator,\n\tIEventBus,\n\tNodeDefinition,\n\tNodeResult,\n\tWorkflowBlueprint,\n} from '../types'\n\nexport class WorkflowLogicHandler {\n\tconstructor(\n\t\tprivate readonly evaluator: IEvaluator,\n\t\tprivate readonly eventBus: IEventBus,\n\t) {}\n\n\tpublic async determineNextNodes(\n\t\tblueprint: WorkflowBlueprint,\n\t\tcompletedNodeId: string,\n\t\tresult: NodeResult<any, any>,\n\t\tcontext: ContextImplementation<any>,\n\t\texecutionId?: string,\n\t): Promise<{ node: NodeDefinition; edge: EdgeDefinition }[]> {\n\t\tif (!result) return []\n\n\t\tconst effectiveSourceNodeId = completedNodeId\n\n\t\tconst directOutgoingEdges = blueprint.edges.filter((edge) => edge.source === effectiveSourceNodeId)\n\n\t\tconst nodesThisIsAFallbackFor = blueprint.nodes.filter((n) => n.config?.fallback === completedNodeId)\n\t\tconst inheritedOutgoingEdges = nodesThisIsAFallbackFor.flatMap((originalNode) =>\n\t\t\tblueprint.edges.filter((edge) => edge.source === originalNode.id),\n\t\t)\n\t\tconst allPossibleEdges = [...directOutgoingEdges, ...inheritedOutgoingEdges]\n\t\tconst outgoingEdges = [\n\t\t\t...new Map(\n\t\t\t\tallPossibleEdges.map((edge) => [\n\t\t\t\t\t`${edge.source}-${edge.target}-${edge.action || ''}-${edge.condition || ''}`,\n\t\t\t\t\tedge,\n\t\t\t\t]),\n\t\t\t).values(),\n\t\t]\n\n\t\tconst matched: { node: NodeDefinition; edge: EdgeDefinition }[] = []\n\t\tconst evaluateEdge = async (edge: EdgeDefinition): Promise<boolean> => {\n\t\t\tif (!edge.condition) return true\n\t\t\tconst contextData = context.type === 'sync' ? context.toJSON() : await context.toJSON()\n\t\t\tconst evaluationResult = !!this.evaluator.evaluate(edge.condition, {\n\t\t\t\t...contextData,\n\t\t\t\tresult,\n\t\t\t})\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'edge:evaluate',\n\t\t\t\tpayload: { source: edge.source, target: edge.target, condition: edge.condition, result: evaluationResult },\n\t\t\t})\n\t\t\treturn evaluationResult\n\t\t}\n\n\t\tconst completedNode = blueprint.nodes.find((n) => n.id === completedNodeId)\n\t\tconst isLoopController = completedNode?.uses === 'loop-controller'\n\n\t\tif (isLoopController) {\n\t\t\tconst conditionalEdges = outgoingEdges.filter((edge) => edge.condition)\n\t\t\tfor (const edge of conditionalEdges) {\n\t\t\t\tif (await evaluateEdge(edge)) {\n\t\t\t\t\tconst targetNode = blueprint.nodes.find((n) => n.id === edge.target)\n\t\t\t\t\tif (targetNode) matched.push({ node: targetNode, edge })\n\t\t\t\t} else {\n\t\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\t\ttype: 'node:skipped',\n\t\t\t\t\t\tpayload: { nodeId: completedNodeId, edge, executionId: executionId || '', blueprintId: blueprint.id },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matched.length > 0) {\n\t\t\t\treturn matched\n\t\t\t}\n\t\t}\n\n\t\tif (result.action) {\n\t\t\tconst actionEdges = outgoingEdges.filter((edge) => edge.action === result.action)\n\t\t\tfor (const edge of actionEdges) {\n\t\t\t\tif (await evaluateEdge(edge)) {\n\t\t\t\t\tconst targetNode = blueprint.nodes.find((n) => n.id === edge.target)\n\t\t\t\t\tif (targetNode) matched.push({ node: targetNode, edge })\n\t\t\t\t} else {\n\t\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\t\ttype: 'node:skipped',\n\t\t\t\t\t\tpayload: { nodeId: completedNodeId, edge, executionId: executionId || '', blueprintId: blueprint.id },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (matched.length === 0) {\n\t\t\tconst defaultEdges = outgoingEdges.filter((edge) => !edge.action)\n\t\t\tfor (const edge of defaultEdges) {\n\t\t\t\tif (await evaluateEdge(edge)) {\n\t\t\t\t\tconst targetNode = blueprint.nodes.find((n) => n.id === edge.target)\n\t\t\t\t\tif (targetNode) matched.push({ node: targetNode, edge })\n\t\t\t\t} else {\n\t\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\t\ttype: 'node:skipped',\n\t\t\t\t\t\tpayload: { nodeId: completedNodeId, edge, executionId: executionId || '', blueprintId: blueprint.id },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn matched\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<any>,\n\t\tallPredecessors?: Map<string, Set<string>>,\n\t\texecutionId?: string,\n\t): Promise<void> {\n\t\tconst asyncContext = context.type === 'sync' ? new AsyncContextView(context) : context\n\t\tconst predecessors = allPredecessors?.get(targetNode.id)\n\t\tconst hasSinglePredecessor = predecessors && predecessors.size === 1\n\t\tconst hasExplicitInputs = targetNode.inputs !== undefined\n\t\tconst hasEdgeTransform = edge.transform !== undefined\n\n\t\tif (!hasExplicitInputs && !hasSinglePredecessor && !hasEdgeTransform) {\n\t\t\treturn\n\t\t}\n\n\t\tconst finalInput = edge.transform\n\t\t\t? this.evaluator.evaluate(edge.transform, {\n\t\t\t\t\tinput: sourceResult.output,\n\t\t\t\t\tcontext: await asyncContext.toJSON(),\n\t\t\t\t})\n\t\t\t: sourceResult.output\n\t\tconst inputKey = `_inputs.${targetNode.id}`\n\t\tawait asyncContext.set(inputKey as any, finalInput)\n\t\tawait this.eventBus.emit({\n\t\t\ttype: 'context:change',\n\t\t\tpayload: {\n\t\t\t\tsourceNode: edge.source,\n\t\t\t\tkey: inputKey,\n\t\t\t\top: 'set',\n\t\t\t\tvalue: finalInput,\n\t\t\t\texecutionId: executionId || 'unknown',\n\t\t\t},\n\t\t})\n\t\tif (!hasExplicitInputs) {\n\t\t\ttargetNode.inputs = inputKey\n\t\t}\n\t}\n\n\tpublic async resolveNodeInput(\n\t\tnodeId: string,\n\t\tblueprint: WorkflowBlueprint,\n\t\tcontext: ContextImplementation<any>,\n\t): Promise<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\tisFatal: false,\n\t\t\t})\n\t\t}\n\t\tconst asyncContext = context.type === 'sync' ? new AsyncContextView(context) : context\n\t\tif (nodeDef.inputs) {\n\t\t\tif (typeof nodeDef.inputs === 'string') {\n\t\t\t\tconst key = nodeDef.inputs\n\t\t\t\tif (key.startsWith('_')) return await asyncContext.get(key as any)\n\t\t\t\tconst outputKey = `_outputs.${key}`\n\t\t\t\tif (await asyncContext.has(outputKey as any)) {\n\t\t\t\t\treturn await asyncContext.get(outputKey as any)\n\t\t\t\t}\n\t\t\t\treturn await asyncContext.get(key as any)\n\t\t\t}\n\t\t\tif (typeof nodeDef.inputs === 'object') {\n\t\t\t\tconst input: Record<string, any> = {}\n\t\t\t\tfor (const key in nodeDef.inputs) {\n\t\t\t\t\tconst contextKey = nodeDef.inputs[key]\n\t\t\t\t\tif (contextKey.startsWith('_')) {\n\t\t\t\t\t\tinput[key] = await asyncContext.get(contextKey as any)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst outputKey = `_outputs.${contextKey}`\n\t\t\t\t\t\tif (await asyncContext.has(outputKey as any)) {\n\t\t\t\t\t\t\tinput[key] = await asyncContext.get(outputKey as any)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinput[key] = await asyncContext.get(contextKey as any)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn input\n\t\t\t}\n\t\t}\n\t\t// Default to standardized input key\n\t\tconst inputKey = `_inputs.${nodeDef.id}`\n\t\treturn await asyncContext.get(inputKey as any)\n\t}\n}\n"]}
@@ -1,74 +0,0 @@
1
- import { executeBatch, processResults } from './chunk-26VTGQAF.js';
2
- import { ExecutionContext } from './chunk-L3MX5MTA.js';
3
- import { FlowcraftError } from './chunk-BCRWXTWX.js';
4
-
5
- // src/runtime/orchestrator.ts
6
- var DefaultOrchestrator = class {
7
- async run(context, traverser) {
8
- const hardwareConcurrency = globalThis.navigator?.hardwareConcurrency || 4;
9
- const maxConcurrency = context.concurrency != null && context.concurrency > 0 ? context.concurrency : Math.min(hardwareConcurrency, 10);
10
- try {
11
- context.signal?.throwIfAborted();
12
- } catch (error) {
13
- if (error instanceof DOMException && error.name === "AbortError") {
14
- throw new FlowcraftError("Workflow cancelled", { isFatal: false });
15
- }
16
- throw error;
17
- }
18
- let iterations = 0;
19
- const maxIterations = 1e4;
20
- while (traverser.hasMoreWork()) {
21
- if (++iterations > maxIterations) {
22
- throw new Error("Traversal exceeded maximum iterations, possible infinite loop");
23
- }
24
- try {
25
- context.signal?.throwIfAborted();
26
- } catch (error) {
27
- if (error instanceof DOMException && error.name === "AbortError") {
28
- throw new FlowcraftError("Workflow cancelled", { isFatal: false });
29
- }
30
- throw error;
31
- }
32
- const readyNodes = traverser.getReadyNodes();
33
- const dynamicBlueprint = traverser.getDynamicBlueprint();
34
- const updatedContext = new ExecutionContext(
35
- dynamicBlueprint,
36
- context.state,
37
- context.nodeRegistry,
38
- context.executionId,
39
- context.runtime,
40
- context.services,
41
- context.signal,
42
- context.concurrency
43
- );
44
- const settledResults = await executeBatch(
45
- readyNodes,
46
- dynamicBlueprint,
47
- context.state,
48
- (nodeId) => context.runtime.getExecutorForNode(nodeId, updatedContext),
49
- context.runtime,
50
- maxConcurrency
51
- );
52
- await processResults(
53
- settledResults,
54
- traverser,
55
- context.state,
56
- context.runtime,
57
- context.blueprint,
58
- context.executionId
59
- );
60
- if (context.state.isAwaiting()) {
61
- break;
62
- }
63
- }
64
- const isTraversalComplete = !traverser.hasMoreWork();
65
- const status = context.state.getStatus(isTraversalComplete);
66
- const result = await context.state.toResult(context.services.serializer, context.executionId);
67
- result.status = status;
68
- return result;
69
- }
70
- };
71
-
72
- export { DefaultOrchestrator };
73
- //# sourceMappingURL=chunk-QA2WDZPV.js.map
74
- //# sourceMappingURL=chunk-QA2WDZPV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/orchestrator.ts"],"names":[],"mappings":"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","file":"chunk-QA2WDZPV.js","sourcesContent":["import { FlowcraftError } from '../errors'\nimport type { WorkflowResult } from '../types'\nimport { ExecutionContext } from './execution-context'\nimport { executeBatch, processResults } from './orchestrators/utils'\nimport type { GraphTraverser } from './traverser'\nimport type { IOrchestrator } from './types'\n\nexport class DefaultOrchestrator implements IOrchestrator {\n\tasync run(context: ExecutionContext<any, any>, traverser: GraphTraverser): Promise<WorkflowResult<any>> {\n\t\tconst hardwareConcurrency = globalThis.navigator?.hardwareConcurrency || 4\n\t\tconst maxConcurrency =\n\t\t\tcontext.concurrency != null && context.concurrency > 0 ? context.concurrency : Math.min(hardwareConcurrency, 10)\n\n\t\ttry {\n\t\t\tcontext.signal?.throwIfAborted()\n\t\t} catch (error) {\n\t\t\tif (error instanceof DOMException && error.name === 'AbortError') {\n\t\t\t\tthrow new FlowcraftError('Workflow cancelled', { isFatal: false })\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\n\t\tlet iterations = 0\n\t\tconst maxIterations = 10000\n\n\t\twhile (traverser.hasMoreWork()) {\n\t\t\tif (++iterations > maxIterations) {\n\t\t\t\tthrow new Error('Traversal exceeded maximum iterations, possible infinite loop')\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcontext.signal?.throwIfAborted()\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DOMException && error.name === 'AbortError') {\n\t\t\t\t\tthrow new FlowcraftError('Workflow cancelled', { isFatal: false })\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tconst readyNodes = traverser.getReadyNodes()\n\t\t\tconst dynamicBlueprint = traverser.getDynamicBlueprint()\n\t\t\tconst updatedContext = new ExecutionContext(\n\t\t\t\tdynamicBlueprint,\n\t\t\t\tcontext.state,\n\t\t\t\tcontext.nodeRegistry,\n\t\t\t\tcontext.executionId,\n\t\t\t\tcontext.runtime,\n\t\t\t\tcontext.services,\n\t\t\t\tcontext.signal,\n\t\t\t\tcontext.concurrency,\n\t\t\t)\n\t\t\tconst settledResults = await executeBatch(\n\t\t\t\treadyNodes,\n\t\t\t\tdynamicBlueprint,\n\t\t\t\tcontext.state,\n\t\t\t\t(nodeId: string) => context.runtime.getExecutorForNode(nodeId, updatedContext),\n\t\t\t\tcontext.runtime,\n\t\t\t\tmaxConcurrency,\n\t\t\t)\n\n\t\t\tawait processResults(\n\t\t\t\tsettledResults,\n\t\t\t\ttraverser,\n\t\t\t\tcontext.state,\n\t\t\t\tcontext.runtime,\n\t\t\t\tcontext.blueprint,\n\t\t\t\tcontext.executionId,\n\t\t\t)\n\n\t\t\tif (context.state.isAwaiting()) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tconst isTraversalComplete = !traverser.hasMoreWork()\n\t\tconst status = context.state.getStatus(isTraversalComplete)\n\t\tconst result = await context.state.toResult(context.services.serializer, context.executionId)\n\t\tresult.status = status\n\t\treturn result\n\t}\n}\n"]}
@@ -1,52 +0,0 @@
1
- import { BaseNode } from './chunk-LNK7LZER.js';
2
-
3
- // src/nodes/batch-scatter.ts
4
- var BatchScatterNode = class extends BaseNode {
5
- async exec(_prepResult, context) {
6
- const inputArray = context.input || [];
7
- if (!Array.isArray(inputArray)) {
8
- throw new Error(`Input for batch-scatter node '${this.nodeId}' must be an array.`);
9
- }
10
- const { chunkSize = inputArray.length, workerUsesKey, gatherNodeId } = this.params || {};
11
- if (!workerUsesKey || !gatherNodeId) {
12
- throw new Error(`BatchScatterNode requires 'workerUsesKey' and 'gatherNodeId' parameters.`);
13
- }
14
- const batchId = globalThis.crypto.randomUUID();
15
- const currentIndex = await context.context.get(`${this.nodeId}_currentIndex`) || 0;
16
- const endIndex = Math.min(currentIndex + chunkSize, inputArray.length);
17
- const dynamicNodes = [];
18
- const workerIds = [];
19
- for (let i = currentIndex; i < endIndex; i++) {
20
- const item = inputArray[i];
21
- const itemInputKey = `_batch.${this.nodeId}_${batchId}_item_${i}`;
22
- await context.context.set(itemInputKey, item);
23
- const workerId = `${workerUsesKey}_${batchId}_${i}`;
24
- workerIds.push(workerId);
25
- dynamicNodes.push({
26
- id: workerId,
27
- uses: workerUsesKey,
28
- inputs: itemInputKey
29
- });
30
- }
31
- const parentBatchId = this.nodeId?.replace("_scatter", "") || "";
32
- await context.dependencies.runtime.services.eventBus.emit({
33
- type: "batch:start",
34
- payload: {
35
- batchId: parentBatchId,
36
- scatterNodeId: this.nodeId,
37
- workerNodeIds: workerIds
38
- }
39
- });
40
- await context.context.set(`${this.nodeId}_currentIndex`, endIndex);
41
- const hasMore = endIndex < inputArray.length;
42
- await context.context.set(`${gatherNodeId}_hasMore`, hasMore);
43
- const existingWorkerIds = await context.context.get(`${gatherNodeId}_allWorkerIds`) || [];
44
- const allWorkerIds = [...existingWorkerIds, ...workerIds];
45
- await context.context.set(`${gatherNodeId}_allWorkerIds`, allWorkerIds);
46
- return { dynamicNodes, output: { gatherNodeId, hasMore } };
47
- }
48
- };
49
-
50
- export { BatchScatterNode };
51
- //# sourceMappingURL=chunk-RM677CNU.js.map
52
- //# sourceMappingURL=chunk-RM677CNU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/nodes/batch-scatter.ts"],"names":[],"mappings":"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","file":"chunk-RM677CNU.js","sourcesContent":["import { BaseNode } from '../node'\nimport type { NodeContext, NodeResult } from '../types'\n\nexport class BatchScatterNode extends BaseNode {\n\tasync exec(_prepResult: any, context: NodeContext<any, any, any>): Promise<Omit<NodeResult, 'error'>> {\n\t\tconst inputArray = context.input || []\n\t\tif (!Array.isArray(inputArray)) {\n\t\t\tthrow new Error(`Input for batch-scatter node '${this.nodeId}' must be an array.`)\n\t\t}\n\t\tconst { chunkSize = inputArray.length, workerUsesKey, gatherNodeId } = (this.params as any) || {}\n\t\tif (!workerUsesKey || !gatherNodeId) {\n\t\t\tthrow new Error(`BatchScatterNode requires 'workerUsesKey' and 'gatherNodeId' parameters.`)\n\t\t}\n\t\tconst batchId = globalThis.crypto.randomUUID()\n\t\tconst currentIndex = (await context.context.get(`${this.nodeId}_currentIndex`)) || 0\n\t\tconst endIndex = Math.min(currentIndex + chunkSize, inputArray.length)\n\t\tconst dynamicNodes: any[] = []\n\t\tconst workerIds = []\n\t\tfor (let i = currentIndex; i < endIndex; i++) {\n\t\t\tconst item = inputArray[i]\n\t\t\tconst itemInputKey = `_batch.${this.nodeId}_${batchId}_item_${i}`\n\t\t\tawait context.context.set(itemInputKey as any, item)\n\t\t\tconst workerId = `${workerUsesKey}_${batchId}_${i}`\n\t\t\tworkerIds.push(workerId)\n\t\t\tdynamicNodes.push({\n\t\t\t\tid: workerId,\n\t\t\t\tuses: workerUsesKey,\n\t\t\t\tinputs: itemInputKey,\n\t\t\t})\n\t\t}\n\n\t\tconst parentBatchId = this.nodeId?.replace('_scatter', '') || ''\n\t\tawait context.dependencies.runtime.services.eventBus.emit({\n\t\t\ttype: 'batch:start',\n\t\t\tpayload: {\n\t\t\t\tbatchId: parentBatchId,\n\t\t\t\tscatterNodeId: this.nodeId,\n\t\t\t\tworkerNodeIds: workerIds,\n\t\t\t},\n\t\t})\n\n\t\tawait context.context.set(`${this.nodeId}_currentIndex`, endIndex)\n\t\tconst hasMore = endIndex < inputArray.length\n\t\tawait context.context.set(`${gatherNodeId}_hasMore`, hasMore)\n\t\tconst existingWorkerIds = (await context.context.get(`${gatherNodeId}_allWorkerIds`)) || []\n\t\tconst allWorkerIds = [...existingWorkerIds, ...workerIds]\n\t\tawait context.context.set(`${gatherNodeId}_allWorkerIds`, allWorkerIds)\n\t\treturn { dynamicNodes, output: { gatherNodeId, hasMore } }\n\t}\n}\n"]}
@@ -1,39 +0,0 @@
1
- // src/sanitizer.ts
2
- function sanitizeBlueprint(raw) {
3
- let nodesArray = [];
4
- if (Array.isArray(raw.nodes)) {
5
- nodesArray = raw.nodes;
6
- } else if (typeof raw.nodes === "object" && raw.nodes !== null) {
7
- nodesArray = Object.values(raw.nodes);
8
- }
9
- const nodes = nodesArray.map((node) => ({
10
- id: node.id,
11
- uses: node.uses,
12
- params: node.params,
13
- inputs: node.inputs,
14
- config: node.config
15
- }));
16
- let edgesArray = [];
17
- if (Array.isArray(raw.edges)) {
18
- edgesArray = raw.edges;
19
- } else if (typeof raw.edges === "object" && raw.edges !== null) {
20
- edgesArray = Object.values(raw.edges);
21
- }
22
- const edges = edgesArray.map((edge) => ({
23
- source: edge.source,
24
- target: edge.target,
25
- action: edge.action,
26
- condition: edge.condition,
27
- transform: edge.transform
28
- }));
29
- return {
30
- id: raw.id,
31
- nodes,
32
- edges,
33
- metadata: raw.metadata
34
- };
35
- }
36
-
37
- export { sanitizeBlueprint };
38
- //# sourceMappingURL=chunk-TKSSRS5U.js.map
39
- //# sourceMappingURL=chunk-TKSSRS5U.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sanitizer.ts"],"names":[],"mappings":";AAOO,SAAS,kBAAkB,GAAA,EAA6B;AAC9D,EAAA,IAAI,aAAoB,EAAC;AACzB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,IAAA,UAAA,GAAa,GAAA,CAAI,KAAA;AAAA,EAClB,WAAW,OAAO,GAAA,CAAI,UAAU,QAAA,IAAY,GAAA,CAAI,UAAU,IAAA,EAAM;AAC/D,IAAA,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,KAAA,GAA0B,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,IAC9D,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK;AAAA,GACd,CAAE,CAAA;AAEF,EAAA,IAAI,aAAoB,EAAC;AACzB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,IAAA,UAAA,GAAa,GAAA,CAAI,KAAA;AAAA,EAClB,WAAW,OAAO,GAAA,CAAI,UAAU,QAAA,IAAY,GAAA,CAAI,UAAU,IAAA,EAAM;AAC/D,IAAA,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,KAAA,GAA0B,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,IAC9D,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAW,IAAA,CAAK;AAAA,GACjB,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACN,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,KAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,GAAA,CAAI;AAAA,GACf;AACD","file":"chunk-TKSSRS5U.js","sourcesContent":["import type { EdgeDefinition, NodeDefinition, WorkflowBlueprint } from './types'\n\n/**\n * Sanitizes a raw workflow blueprint by removing extra properties\n * added by UI tools (e.g., position, style) and keeping only the\n * properties defined in NodeDefinition and EdgeDefinition.\n */\nexport function sanitizeBlueprint(raw: any): WorkflowBlueprint {\n\tlet nodesArray: any[] = []\n\tif (Array.isArray(raw.nodes)) {\n\t\tnodesArray = raw.nodes\n\t} else if (typeof raw.nodes === 'object' && raw.nodes !== null) {\n\t\tnodesArray = Object.values(raw.nodes)\n\t}\n\n\tconst nodes: NodeDefinition[] = nodesArray.map((node: any) => ({\n\t\tid: node.id,\n\t\tuses: node.uses,\n\t\tparams: node.params,\n\t\tinputs: node.inputs,\n\t\tconfig: node.config,\n\t}))\n\n\tlet edgesArray: any[] = []\n\tif (Array.isArray(raw.edges)) {\n\t\tedgesArray = raw.edges\n\t} else if (typeof raw.edges === 'object' && raw.edges !== null) {\n\t\tedgesArray = Object.values(raw.edges)\n\t}\n\n\tconst edges: EdgeDefinition[] = edgesArray.map((edge: any) => ({\n\t\tsource: edge.source,\n\t\ttarget: edge.target,\n\t\taction: edge.action,\n\t\tcondition: edge.condition,\n\t\ttransform: edge.transform,\n\t}))\n\n\treturn {\n\t\tid: raw.id,\n\t\tnodes,\n\t\tedges,\n\t\tmetadata: raw.metadata,\n\t}\n}\n"]}
@@ -1,103 +0,0 @@
1
- // src/runtime/orchestrators/replay.ts
2
- var ReplayOrchestrator = class {
3
- /**
4
- * Creates a new ReplayOrchestrator with a sequence of recorded workflow events.
5
- *
6
- * @param events - Array of FlowcraftEvent objects representing the recorded workflow execution
7
- */
8
- constructor(events) {
9
- this.events = events;
10
- }
11
- /**
12
- * Replays the recorded workflow events to reconstruct the workflow state.
13
- *
14
- * This method filters events for the specific execution, applies each event in sequence
15
- * to rebuild the context state, and returns the final reconstructed workflow result.
16
- * Replayed executions always have a "completed" status since they reconstruct the final state.
17
- *
18
- * @param context - The execution context containing state and services
19
- * @param _traverser - Graph traverser (unused in replay mode)
20
- * @returns Promise resolving to the reconstructed workflow result
21
- */
22
- async run(context, _traverser) {
23
- const executionEvents = this.events.filter((event) => {
24
- if ("executionId" in event.payload) {
25
- return event.payload.executionId === context.executionId;
26
- }
27
- return false;
28
- });
29
- const fallbackMap = /* @__PURE__ */ new Map();
30
- for (const event of executionEvents) {
31
- await this.applyEvent(event, context, fallbackMap);
32
- }
33
- const includeExecutionId = executionEvents.length > 0;
34
- const result = await context.state.toResult(
35
- context.services.serializer,
36
- includeExecutionId ? context.executionId : void 0
37
- );
38
- result.status = "completed";
39
- return result;
40
- }
41
- /**
42
- * Applies a single workflow event to reconstruct the execution state.
43
- *
44
- * This method handles different event types by updating the workflow state accordingly,
45
- * including node completions, context changes, errors, fallbacks, and workflow control events.
46
- *
47
- * @param event - The workflow event to apply
48
- * @param context - The execution context to update
49
- * @param fallbackMap - Map tracking fallback node relationships (fallbackNodeId -> originalNodeId)
50
- */
51
- async applyEvent(event, context, fallbackMap) {
52
- const { type, payload } = event;
53
- switch (type) {
54
- case "node:start":
55
- break;
56
- case "node:finish": {
57
- const originalNodeId = fallbackMap.get(payload.nodeId);
58
- if (originalNodeId) {
59
- await context.state.addCompletedNode(originalNodeId, payload.result.output);
60
- } else {
61
- await context.state.addCompletedNode(payload.nodeId, payload.result.output);
62
- }
63
- break;
64
- }
65
- case "context:change":
66
- if (payload.op === "set") {
67
- await context.state.getContext().set(payload.key, payload.value);
68
- } else if (payload.op === "delete") {
69
- await context.state.getContext().delete(payload.key);
70
- }
71
- break;
72
- case "node:error":
73
- context.state.addError(payload.nodeId, payload.error);
74
- break;
75
- case "node:fallback":
76
- fallbackMap.set(payload.fallback, payload.nodeId);
77
- context.state.markFallbackExecuted();
78
- break;
79
- case "node:retry":
80
- break;
81
- case "edge:evaluate":
82
- break;
83
- case "workflow:stall":
84
- case "workflow:pause":
85
- if ("remainingNodes" in payload) {
86
- for (let i = 0; i < payload.remainingNodes; i++) {
87
- await context.state.markAsAwaiting(`node-${i}`);
88
- }
89
- }
90
- break;
91
- case "batch:start":
92
- break;
93
- case "batch:finish":
94
- for (const _result of payload.results) {
95
- }
96
- break;
97
- }
98
- }
99
- };
100
-
101
- export { ReplayOrchestrator };
102
- //# sourceMappingURL=chunk-UNORA7EM.js.map
103
- //# sourceMappingURL=chunk-UNORA7EM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/orchestrators/replay.ts"],"names":[],"mappings":"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","file":"chunk-UNORA7EM.js","sourcesContent":["import type { FlowcraftEvent, WorkflowResult } from '../../types'\nimport type { ExecutionContext } from '../execution-context'\nimport type { GraphTraverser } from '../traverser'\nimport type { IOrchestrator } from '../types'\n\n/**\n * An orchestrator that replays a pre-recorded sequence of workflow events\n * to reconstruct the workflow state without executing any node logic.\n *\n * This enables time-travel debugging by allowing developers to inspect\n * the exact state of a workflow at any point in its execution history.\n */\nexport class ReplayOrchestrator implements IOrchestrator {\n\t/**\n\t * Creates a new ReplayOrchestrator with a sequence of recorded workflow events.\n\t *\n\t * @param events - Array of FlowcraftEvent objects representing the recorded workflow execution\n\t */\n\tconstructor(private events: FlowcraftEvent[]) {}\n\n\t/**\n\t * Replays the recorded workflow events to reconstruct the workflow state.\n\t *\n\t * This method filters events for the specific execution, applies each event in sequence\n\t * to rebuild the context state, and returns the final reconstructed workflow result.\n\t * Replayed executions always have a \"completed\" status since they reconstruct the final state.\n\t *\n\t * @param context - The execution context containing state and services\n\t * @param _traverser - Graph traverser (unused in replay mode)\n\t * @returns Promise resolving to the reconstructed workflow result\n\t */\n\tasync run(context: ExecutionContext<any, any>, _traverser: GraphTraverser): Promise<WorkflowResult<any>> {\n\t\tconst executionEvents = this.events.filter((event) => {\n\t\t\tif ('executionId' in event.payload) {\n\t\t\t\treturn event.payload.executionId === context.executionId\n\t\t\t}\n\t\t\treturn false\n\t\t})\n\n\t\tconst fallbackMap = new Map<string, string>()\n\n\t\tfor (const event of executionEvents) {\n\t\t\tawait this.applyEvent(event, context, fallbackMap)\n\t\t}\n\n\t\tconst includeExecutionId = executionEvents.length > 0\n\t\tconst result = await context.state.toResult(\n\t\t\tcontext.services.serializer,\n\t\t\tincludeExecutionId ? context.executionId : undefined,\n\t\t)\n\t\tresult.status = 'completed'\n\t\treturn result\n\t}\n\n\t/**\n\t * Applies a single workflow event to reconstruct the execution state.\n\t *\n\t * This method handles different event types by updating the workflow state accordingly,\n\t * including node completions, context changes, errors, fallbacks, and workflow control events.\n\t *\n\t * @param event - The workflow event to apply\n\t * @param context - The execution context to update\n\t * @param fallbackMap - Map tracking fallback node relationships (fallbackNodeId -> originalNodeId)\n\t */\n\tprivate async applyEvent(\n\t\tevent: FlowcraftEvent,\n\t\tcontext: ExecutionContext<any, any>,\n\t\tfallbackMap: Map<string, string>,\n\t): Promise<void> {\n\t\tconst { type, payload } = event\n\n\t\tswitch (type) {\n\t\t\tcase 'node:start':\n\t\t\t\tbreak\n\n\t\t\tcase 'node:finish': {\n\t\t\t\tconst originalNodeId = fallbackMap.get(payload.nodeId)\n\t\t\t\tif (originalNodeId) {\n\t\t\t\t\tawait context.state.addCompletedNode(originalNodeId, payload.result.output)\n\t\t\t\t} else {\n\t\t\t\t\tawait context.state.addCompletedNode(payload.nodeId, payload.result.output)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tcase 'context:change':\n\t\t\t\tif (payload.op === 'set') {\n\t\t\t\t\tawait context.state.getContext().set(payload.key, payload.value)\n\t\t\t\t} else if (payload.op === 'delete') {\n\t\t\t\t\tawait context.state.getContext().delete(payload.key)\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tcase 'node:error':\n\t\t\t\tcontext.state.addError(payload.nodeId, payload.error)\n\t\t\t\tbreak\n\n\t\t\tcase 'node:fallback':\n\t\t\t\tfallbackMap.set(payload.fallback, payload.nodeId)\n\t\t\t\tcontext.state.markFallbackExecuted()\n\t\t\t\tbreak\n\n\t\t\tcase 'node:retry':\n\t\t\t\tbreak\n\n\t\t\tcase 'edge:evaluate':\n\t\t\t\tbreak\n\n\t\t\tcase 'workflow:stall':\n\t\t\tcase 'workflow:pause':\n\t\t\t\tif ('remainingNodes' in payload) {\n\t\t\t\t\tfor (let i = 0; i < payload.remainingNodes; i++) {\n\t\t\t\t\t\tawait context.state.markAsAwaiting(`node-${i}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tcase 'batch:start':\n\t\t\t\tbreak\n\n\t\t\tcase 'batch:finish':\n\t\t\t\tfor (const _result of payload.results) {\n\t\t\t\t\t// TODO?\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tdefault:\n\t\t\t\tbreak\n\t\t}\n\t}\n}\n"]}
@@ -1,54 +0,0 @@
1
- import { executeBatch, processResults } from './chunk-26VTGQAF.js';
2
- import { FlowcraftError } from './chunk-BCRWXTWX.js';
3
-
4
- // src/runtime/orchestrators/step-by-step.ts
5
- var StepByStepOrchestrator = class {
6
- async run(context, traverser) {
7
- try {
8
- context.signal?.throwIfAborted();
9
- } catch (error) {
10
- if (error instanceof DOMException && error.name === "AbortError") {
11
- throw new FlowcraftError("Workflow cancelled", { isFatal: false });
12
- }
13
- throw error;
14
- }
15
- if (!traverser.hasMoreWork()) {
16
- const isTraversalComplete2 = !traverser.hasMoreWork();
17
- const status2 = context.state.getStatus(isTraversalComplete2);
18
- const result2 = await context.state.toResult(context.services.serializer, context.executionId);
19
- result2.status = status2;
20
- return result2;
21
- }
22
- const allReadyNodes = traverser.getReadyNodes();
23
- const nodesToExecute = context.concurrency ? allReadyNodes.slice(0, context.concurrency) : allReadyNodes;
24
- const nodesToSkip = context.concurrency ? allReadyNodes.slice(context.concurrency) : [];
25
- const settledResults = await executeBatch(
26
- nodesToExecute,
27
- traverser.getDynamicBlueprint(),
28
- context.state,
29
- (nodeId) => context.runtime.getExecutorForNode(nodeId, context),
30
- context.runtime,
31
- context.concurrency
32
- );
33
- await processResults(
34
- settledResults,
35
- traverser,
36
- context.state,
37
- context.runtime,
38
- context.blueprint,
39
- context.executionId
40
- );
41
- for (const { nodeId } of nodesToSkip) {
42
- traverser.addToFrontier(nodeId);
43
- }
44
- const isTraversalComplete = !traverser.hasMoreWork();
45
- const status = context.state.getStatus(isTraversalComplete);
46
- const result = await context.state.toResult(context.services.serializer, context.executionId);
47
- result.status = status;
48
- return result;
49
- }
50
- };
51
-
52
- export { StepByStepOrchestrator };
53
- //# sourceMappingURL=chunk-VZ4BRDBK.js.map
54
- //# sourceMappingURL=chunk-VZ4BRDBK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/orchestrators/step-by-step.ts"],"names":["isTraversalComplete","status","result"],"mappings":";;;;AAeO,IAAM,yBAAN,MAAsD;AAAA,EAC5D,MAAa,GAAA,CAAI,OAAA,EAAqC,SAAA,EAAyD;AAC9G,IAAA,IAAI;AACH,MAAA,OAAA,CAAQ,QAAQ,cAAA,EAAe;AAAA,IAChC,SAAS,KAAA,EAAO;AACf,MAAA,IAAI,KAAA,YAAiB,YAAA,IAAgB,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACjE,QAAA,MAAM,IAAI,cAAA,CAAe,oBAAA,EAAsB,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,MAClE;AACA,MAAA,MAAM,KAAA;AAAA,IACP;AAEA,IAAA,IAAI,CAAC,SAAA,CAAU,WAAA,EAAY,EAAG;AAC7B,MAAA,MAAMA,oBAAAA,GAAsB,CAAC,SAAA,CAAU,WAAA,EAAY;AACnD,MAAA,MAAMC,OAAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAUD,oBAAmB,CAAA;AAC1D,MAAA,MAAME,OAAAA,GAAS,MAAM,OAAA,CAAQ,KAAA,CAAM,SAAS,OAAA,CAAQ,QAAA,CAAS,UAAA,EAAY,OAAA,CAAQ,WAAW,CAAA;AAC5F,MAAAA,QAAO,MAAA,GAASD,OAAAA;AAChB,MAAA,OAAOC,OAAAA;AAAA,IACR;AAEA,IAAA,MAAM,aAAA,GAAgB,UAAU,aAAA,EAAc;AAC9C,IAAA,MAAM,cAAA,GAAiB,QAAQ,WAAA,GAAc,aAAA,CAAc,MAAM,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,GAAI,aAAA;AAC3F,IAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,GAAc,aAAA,CAAc,MAAM,OAAA,CAAQ,WAAW,IAAI,EAAC;AAEtF,IAAA,MAAM,iBAAiB,MAAM,YAAA;AAAA,MAC5B,cAAA;AAAA,MACA,UAAU,mBAAA,EAAoB;AAAA,MAC9B,OAAA,CAAQ,KAAA;AAAA,MACR,CAAC,MAAA,KAAmB,OAAA,CAAQ,OAAA,CAAQ,kBAAA,CAAmB,QAAQ,OAAO,CAAA;AAAA,MACtE,OAAA,CAAQ,OAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACT;AAEA,IAAA,MAAM,cAAA;AAAA,MACL,cAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,CAAQ,KAAA;AAAA,MACR,OAAA,CAAQ,OAAA;AAAA,MACR,OAAA,CAAQ,SAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACT;AAEA,IAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,WAAA,EAAa;AACrC,MAAA,SAAA,CAAU,cAAc,MAAM,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,mBAAA,GAAsB,CAAC,SAAA,CAAU,WAAA,EAAY;AACnD,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAU,mBAAmB,CAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA,CAAM,SAAS,OAAA,CAAQ,QAAA,CAAS,UAAA,EAAY,OAAA,CAAQ,WAAW,CAAA;AAC5F,IAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,IAAA,OAAO,MAAA;AAAA,EACR;AACD","file":"chunk-VZ4BRDBK.js","sourcesContent":["import { FlowcraftError } from '../../errors'\n\nimport type { WorkflowResult } from '../../types'\nimport type { ExecutionContext } from '../execution-context'\nimport type { GraphTraverser } from '../traverser'\nimport type { IOrchestrator } from '../types'\nimport { executeBatch, processResults } from './utils'\n\n/**\n * An orchestrator that executes only one \"tick\" or \"turn\" of the workflow.\n * It processes a single batch of ready nodes from the frontier and then returns,\n * allowing the caller to inspect the intermediate state before proceeding.\n *\n * Useful for debugging, testing, or building interactive tools.\n */\nexport class StepByStepOrchestrator implements IOrchestrator {\n\tpublic async run(context: ExecutionContext<any, any>, traverser: GraphTraverser): Promise<WorkflowResult<any>> {\n\t\ttry {\n\t\t\tcontext.signal?.throwIfAborted()\n\t\t} catch (error) {\n\t\t\tif (error instanceof DOMException && error.name === 'AbortError') {\n\t\t\t\tthrow new FlowcraftError('Workflow cancelled', { isFatal: false })\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\n\t\tif (!traverser.hasMoreWork()) {\n\t\t\tconst isTraversalComplete = !traverser.hasMoreWork()\n\t\t\tconst status = context.state.getStatus(isTraversalComplete)\n\t\t\tconst result = await context.state.toResult(context.services.serializer, context.executionId)\n\t\t\tresult.status = status\n\t\t\treturn result\n\t\t}\n\n\t\tconst allReadyNodes = traverser.getReadyNodes()\n\t\tconst nodesToExecute = context.concurrency ? allReadyNodes.slice(0, context.concurrency) : allReadyNodes\n\t\tconst nodesToSkip = context.concurrency ? allReadyNodes.slice(context.concurrency) : []\n\n\t\tconst settledResults = await executeBatch(\n\t\t\tnodesToExecute,\n\t\t\ttraverser.getDynamicBlueprint(),\n\t\t\tcontext.state,\n\t\t\t(nodeId: string) => context.runtime.getExecutorForNode(nodeId, context),\n\t\t\tcontext.runtime,\n\t\t\tcontext.concurrency,\n\t\t)\n\n\t\tawait processResults(\n\t\t\tsettledResults,\n\t\t\ttraverser,\n\t\t\tcontext.state,\n\t\t\tcontext.runtime,\n\t\t\tcontext.blueprint,\n\t\t\tcontext.executionId,\n\t\t)\n\n\t\tfor (const { nodeId } of nodesToSkip) {\n\t\t\ttraverser.addToFrontier(nodeId)\n\t\t}\n\n\t\tconst isTraversalComplete = !traverser.hasMoreWork()\n\t\tconst status = context.state.getStatus(isTraversalComplete)\n\t\tconst result = await context.state.toResult(context.services.serializer, context.executionId)\n\t\tresult.status = status\n\t\treturn result\n\t}\n}\n"]}