flowcraft 2.7.1 → 2.8.1

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 (229) hide show
  1. package/README.md +1 -1
  2. package/dist/index-D3dyjW2G.d.mts +1269 -0
  3. package/dist/index.d.mts +2 -0
  4. package/dist/index.mjs +727 -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-CmefIAu_.mjs +2216 -0
  9. package/dist/runtime-CmefIAu_.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 +59 -59
  17. package/LICENSE +0 -21
  18. package/dist/adapters/index.d.ts +0 -4
  19. package/dist/adapters/index.js +0 -4
  20. package/dist/adapters/index.js.map +0 -1
  21. package/dist/adapters/persistent-event-bus.d.ts +0 -69
  22. package/dist/adapters/persistent-event-bus.js +0 -3
  23. package/dist/adapters/persistent-event-bus.js.map +0 -1
  24. package/dist/analysis.d.ts +0 -53
  25. package/dist/analysis.js +0 -3
  26. package/dist/analysis.js.map +0 -1
  27. package/dist/chunk-27STBUGG.js +0 -44
  28. package/dist/chunk-27STBUGG.js.map +0 -1
  29. package/dist/chunk-2TSADFQX.js +0 -46
  30. package/dist/chunk-2TSADFQX.js.map +0 -1
  31. package/dist/chunk-3Y5O5EGB.js +0 -3
  32. package/dist/chunk-3Y5O5EGB.js.map +0 -1
  33. package/dist/chunk-4PELJWF7.js +0 -29
  34. package/dist/chunk-4PELJWF7.js.map +0 -1
  35. package/dist/chunk-55J6XMHW.js +0 -3
  36. package/dist/chunk-55J6XMHW.js.map +0 -1
  37. package/dist/chunk-6RKHCJUU.js +0 -29
  38. package/dist/chunk-6RKHCJUU.js.map +0 -1
  39. package/dist/chunk-7EBKWATZ.js +0 -86
  40. package/dist/chunk-7EBKWATZ.js.map +0 -1
  41. package/dist/chunk-7EMUOH77.js +0 -90
  42. package/dist/chunk-7EMUOH77.js.map +0 -1
  43. package/dist/chunk-7M6FHFHP.js +0 -25
  44. package/dist/chunk-7M6FHFHP.js.map +0 -1
  45. package/dist/chunk-AKDL2ZX7.js +0 -287
  46. package/dist/chunk-AKDL2ZX7.js.map +0 -1
  47. package/dist/chunk-BC4G7OM6.js +0 -42
  48. package/dist/chunk-BC4G7OM6.js.map +0 -1
  49. package/dist/chunk-BCMR7Y4U.js +0 -76
  50. package/dist/chunk-BCMR7Y4U.js.map +0 -1
  51. package/dist/chunk-BCRWXTWX.js +0 -21
  52. package/dist/chunk-BCRWXTWX.js.map +0 -1
  53. package/dist/chunk-BEHVGFIM.js +0 -532
  54. package/dist/chunk-BEHVGFIM.js.map +0 -1
  55. package/dist/chunk-DL7KVYZF.js +0 -39
  56. package/dist/chunk-DL7KVYZF.js.map +0 -1
  57. package/dist/chunk-DV2CXHOY.js +0 -74
  58. package/dist/chunk-DV2CXHOY.js.map +0 -1
  59. package/dist/chunk-H4JTZYIT.js +0 -172
  60. package/dist/chunk-H4JTZYIT.js.map +0 -1
  61. package/dist/chunk-HFJXYY4E.js +0 -3
  62. package/dist/chunk-HFJXYY4E.js.map +0 -1
  63. package/dist/chunk-HNHM3FDK.js +0 -52
  64. package/dist/chunk-HNHM3FDK.js.map +0 -1
  65. package/dist/chunk-HXSK5P2X.js +0 -150
  66. package/dist/chunk-HXSK5P2X.js.map +0 -1
  67. package/dist/chunk-I53JB2KW.js +0 -26
  68. package/dist/chunk-I53JB2KW.js.map +0 -1
  69. package/dist/chunk-IDTYHLDQ.js +0 -16
  70. package/dist/chunk-IDTYHLDQ.js.map +0 -1
  71. package/dist/chunk-IKOTX22J.js +0 -85
  72. package/dist/chunk-IKOTX22J.js.map +0 -1
  73. package/dist/chunk-L3MX5MTA.js +0 -33
  74. package/dist/chunk-L3MX5MTA.js.map +0 -1
  75. package/dist/chunk-L46TQXCV.js +0 -144
  76. package/dist/chunk-L46TQXCV.js.map +0 -1
  77. package/dist/chunk-LM4ACVHL.js +0 -73
  78. package/dist/chunk-LM4ACVHL.js.map +0 -1
  79. package/dist/chunk-LNK7LZER.js +0 -51
  80. package/dist/chunk-LNK7LZER.js.map +0 -1
  81. package/dist/chunk-N63S5NEG.js +0 -107
  82. package/dist/chunk-N63S5NEG.js.map +0 -1
  83. package/dist/chunk-NVLZFLYM.js +0 -3
  84. package/dist/chunk-NVLZFLYM.js.map +0 -1
  85. package/dist/chunk-ONH7PIJZ.js +0 -300
  86. package/dist/chunk-ONH7PIJZ.js.map +0 -1
  87. package/dist/chunk-PH2IYZHV.js +0 -48
  88. package/dist/chunk-PH2IYZHV.js.map +0 -1
  89. package/dist/chunk-RAZWRNAJ.js +0 -54
  90. package/dist/chunk-RAZWRNAJ.js.map +0 -1
  91. package/dist/chunk-RM677CNU.js +0 -52
  92. package/dist/chunk-RM677CNU.js.map +0 -1
  93. package/dist/chunk-TKSSRS5U.js +0 -39
  94. package/dist/chunk-TKSSRS5U.js.map +0 -1
  95. package/dist/chunk-U7DKCIWT.js +0 -340
  96. package/dist/chunk-U7DKCIWT.js.map +0 -1
  97. package/dist/chunk-UNORA7EM.js +0 -103
  98. package/dist/chunk-UNORA7EM.js.map +0 -1
  99. package/dist/chunk-WWGFIYKW.js +0 -47
  100. package/dist/chunk-WWGFIYKW.js.map +0 -1
  101. package/dist/chunk-XZZWIJ4G.js +0 -25
  102. package/dist/chunk-XZZWIJ4G.js.map +0 -1
  103. package/dist/chunk-ZETQCNEF.js +0 -139
  104. package/dist/chunk-ZETQCNEF.js.map +0 -1
  105. package/dist/chunk-ZLW4QOTS.js +0 -192
  106. package/dist/chunk-ZLW4QOTS.js.map +0 -1
  107. package/dist/container-factory.d.ts +0 -17
  108. package/dist/container-factory.js +0 -13
  109. package/dist/container-factory.js.map +0 -1
  110. package/dist/container.d.ts +0 -23
  111. package/dist/container.js +0 -3
  112. package/dist/container.js.map +0 -1
  113. package/dist/context.d.ts +0 -65
  114. package/dist/context.js +0 -3
  115. package/dist/context.js.map +0 -1
  116. package/dist/error-mapper.d.ts +0 -15
  117. package/dist/error-mapper.js +0 -4
  118. package/dist/error-mapper.js.map +0 -1
  119. package/dist/errors.d.ts +0 -20
  120. package/dist/errors.js +0 -3
  121. package/dist/errors.js.map +0 -1
  122. package/dist/evaluator.d.ts +0 -32
  123. package/dist/evaluator.js +0 -3
  124. package/dist/evaluator.js.map +0 -1
  125. package/dist/flow.d.ts +0 -85
  126. package/dist/flow.js +0 -4
  127. package/dist/flow.js.map +0 -1
  128. package/dist/index.d.ts +0 -18
  129. package/dist/index.js +0 -38
  130. package/dist/index.js.map +0 -1
  131. package/dist/linter.d.ts +0 -26
  132. package/dist/linter.js +0 -4
  133. package/dist/linter.js.map +0 -1
  134. package/dist/logger.d.ts +0 -20
  135. package/dist/logger.js +0 -3
  136. package/dist/logger.js.map +0 -1
  137. package/dist/node.d.ts +0 -3
  138. package/dist/node.js +0 -3
  139. package/dist/node.js.map +0 -1
  140. package/dist/nodes/batch-gather.d.ts +0 -9
  141. package/dist/nodes/batch-gather.js +0 -4
  142. package/dist/nodes/batch-gather.js.map +0 -1
  143. package/dist/nodes/batch-scatter.d.ts +0 -9
  144. package/dist/nodes/batch-scatter.js +0 -4
  145. package/dist/nodes/batch-scatter.js.map +0 -1
  146. package/dist/nodes/sleep.d.ts +0 -9
  147. package/dist/nodes/sleep.js +0 -4
  148. package/dist/nodes/sleep.js.map +0 -1
  149. package/dist/nodes/subflow.d.ts +0 -9
  150. package/dist/nodes/subflow.js +0 -10
  151. package/dist/nodes/subflow.js.map +0 -1
  152. package/dist/nodes/wait.d.ts +0 -9
  153. package/dist/nodes/wait.js +0 -4
  154. package/dist/nodes/wait.js.map +0 -1
  155. package/dist/nodes/webhook.d.ts +0 -13
  156. package/dist/nodes/webhook.js +0 -4
  157. package/dist/nodes/webhook.js.map +0 -1
  158. package/dist/runtime/adapter.d.ts +0 -114
  159. package/dist/runtime/adapter.js +0 -28
  160. package/dist/runtime/adapter.js.map +0 -1
  161. package/dist/runtime/builtin-keys.d.ts +0 -38
  162. package/dist/runtime/builtin-keys.js +0 -10
  163. package/dist/runtime/builtin-keys.js.map +0 -1
  164. package/dist/runtime/execution-context.d.ts +0 -3
  165. package/dist/runtime/execution-context.js +0 -6
  166. package/dist/runtime/execution-context.js.map +0 -1
  167. package/dist/runtime/executors.d.ts +0 -3
  168. package/dist/runtime/executors.js +0 -4
  169. package/dist/runtime/executors.js.map +0 -1
  170. package/dist/runtime/index.d.ts +0 -7
  171. package/dist/runtime/index.js +0 -31
  172. package/dist/runtime/index.js.map +0 -1
  173. package/dist/runtime/node-executor-factory.d.ts +0 -12
  174. package/dist/runtime/node-executor-factory.js +0 -6
  175. package/dist/runtime/node-executor-factory.js.map +0 -1
  176. package/dist/runtime/orchestrator.d.ts +0 -9
  177. package/dist/runtime/orchestrator.js +0 -8
  178. package/dist/runtime/orchestrator.js.map +0 -1
  179. package/dist/runtime/orchestrators/replay.d.ts +0 -45
  180. package/dist/runtime/orchestrators/replay.js +0 -3
  181. package/dist/runtime/orchestrators/replay.js.map +0 -1
  182. package/dist/runtime/orchestrators/step-by-step.d.ts +0 -16
  183. package/dist/runtime/orchestrators/step-by-step.js +0 -5
  184. package/dist/runtime/orchestrators/step-by-step.js.map +0 -1
  185. package/dist/runtime/orchestrators/utils.d.ts +0 -35
  186. package/dist/runtime/orchestrators/utils.js +0 -4
  187. package/dist/runtime/orchestrators/utils.js.map +0 -1
  188. package/dist/runtime/runtime.d.ts +0 -3
  189. package/dist/runtime/runtime.js +0 -27
  190. package/dist/runtime/runtime.js.map +0 -1
  191. package/dist/runtime/scheduler.d.ts +0 -3
  192. package/dist/runtime/scheduler.js +0 -3
  193. package/dist/runtime/scheduler.js.map +0 -1
  194. package/dist/runtime/state.d.ts +0 -3
  195. package/dist/runtime/state.js +0 -5
  196. package/dist/runtime/state.js.map +0 -1
  197. package/dist/runtime/traverser.d.ts +0 -3
  198. package/dist/runtime/traverser.js +0 -4
  199. package/dist/runtime/traverser.js.map +0 -1
  200. package/dist/runtime/types.d.ts +0 -3
  201. package/dist/runtime/types.js +0 -3
  202. package/dist/runtime/types.js.map +0 -1
  203. package/dist/runtime/workflow-logic-handler.d.ts +0 -17
  204. package/dist/runtime/workflow-logic-handler.js +0 -5
  205. package/dist/runtime/workflow-logic-handler.js.map +0 -1
  206. package/dist/sanitizer.d.ts +0 -12
  207. package/dist/sanitizer.js +0 -3
  208. package/dist/sanitizer.js.map +0 -1
  209. package/dist/sdk.js +0 -20
  210. package/dist/sdk.js.map +0 -1
  211. package/dist/serializer.d.ts +0 -18
  212. package/dist/serializer.js +0 -3
  213. package/dist/serializer.js.map +0 -1
  214. package/dist/testing/event-logger.d.ts +0 -63
  215. package/dist/testing/event-logger.js +0 -3
  216. package/dist/testing/event-logger.js.map +0 -1
  217. package/dist/testing/index.d.ts +0 -7
  218. package/dist/testing/index.js +0 -37
  219. package/dist/testing/index.js.map +0 -1
  220. package/dist/testing/run-with-trace.d.ts +0 -38
  221. package/dist/testing/run-with-trace.js +0 -33
  222. package/dist/testing/run-with-trace.js.map +0 -1
  223. package/dist/testing/stepper.d.ts +0 -79
  224. package/dist/testing/stepper.js +0 -11
  225. package/dist/testing/stepper.js.map +0 -1
  226. package/dist/types-CKhffqyb.d.ts +0 -666
  227. package/dist/types.d.ts +0 -3
  228. package/dist/types.js +0 -3
  229. package/dist/types.js.map +0 -1
@@ -1,85 +0,0 @@
1
- import { analyzeBlueprint } from './chunk-ZLW4QOTS.js';
2
-
3
- // src/linter.ts
4
- function lintBlueprint(blueprint, registry, blueprints) {
5
- const issues = [];
6
- const nodeIds = new Set(blueprint.nodes.map((n) => n.id));
7
- const registryKeys = registry instanceof Map ? new Set(registry.keys()) : new Set(Object.keys(registry));
8
- for (const node of blueprint.nodes) {
9
- if (!node.uses.startsWith("batch-") && !node.uses.startsWith("loop-") && !registryKeys.has(node.uses)) {
10
- issues.push({
11
- code: "MISSING_NODE_IMPLEMENTATION",
12
- message: `Node implementation key '${node.uses}' is not found in the provided registry.`,
13
- nodeId: node.id
14
- });
15
- }
16
- }
17
- for (const node of blueprint.nodes) {
18
- if (node.uses.startsWith("batch-") && node.params?.workerUsesKey) {
19
- if (!registryKeys.has(node.params.workerUsesKey)) {
20
- issues.push({
21
- code: "INVALID_BATCH_WORKER_KEY",
22
- message: `Batch node '${node.id}' references workerUsesKey '${node.params.workerUsesKey}' which is not found in the registry.`,
23
- nodeId: node.id
24
- });
25
- }
26
- }
27
- if (node.uses === "subflow" && node.params?.blueprintId) {
28
- if (!blueprints || !blueprints[node.params.blueprintId]) {
29
- issues.push({
30
- code: "INVALID_SUBFLOW_BLUEPRINT_ID",
31
- message: `Subflow node '${node.id}' references blueprintId '${node.params.blueprintId}' which is not found in the blueprints registry.`,
32
- nodeId: node.id
33
- });
34
- }
35
- }
36
- }
37
- for (const edge of blueprint.edges || []) {
38
- if (!nodeIds.has(edge.source)) {
39
- issues.push({
40
- code: "INVALID_EDGE_SOURCE",
41
- message: `Edge source '${edge.source}' does not correspond to a valid node ID.`,
42
- relatedId: edge.target
43
- });
44
- }
45
- if (!nodeIds.has(edge.target)) {
46
- issues.push({
47
- code: "INVALID_EDGE_TARGET",
48
- message: `Edge target '${edge.target}' does not correspond to a valid node ID.`,
49
- relatedId: edge.source
50
- });
51
- }
52
- }
53
- if (blueprint.nodes.length > 1) {
54
- const analysis = analyzeBlueprint(blueprint);
55
- const connectedNodes = /* @__PURE__ */ new Set();
56
- const nodesToVisit = [...analysis.startNodeIds];
57
- const visited = /* @__PURE__ */ new Set();
58
- while (nodesToVisit.length > 0) {
59
- const currentId = nodesToVisit.pop();
60
- if (!currentId || visited.has(currentId)) continue;
61
- visited.add(currentId);
62
- connectedNodes.add(currentId);
63
- for (const e of blueprint.edges.filter((e2) => e2.source === currentId)) {
64
- nodesToVisit.push(e.target);
65
- }
66
- }
67
- for (const nodeId of nodeIds) {
68
- if (!connectedNodes.has(nodeId)) {
69
- issues.push({
70
- code: "ORPHAN_NODE",
71
- message: `Node '${nodeId}' is not reachable from any start node.`,
72
- nodeId
73
- });
74
- }
75
- }
76
- }
77
- return {
78
- isValid: issues.length === 0,
79
- issues
80
- };
81
- }
82
-
83
- export { lintBlueprint };
84
- //# sourceMappingURL=chunk-IKOTX22J.js.map
85
- //# sourceMappingURL=chunk-IKOTX22J.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/linter.ts"],"names":["e"],"mappings":"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","file":"chunk-IKOTX22J.js","sourcesContent":["import { analyzeBlueprint } from './analysis'\nimport type { NodeClass, NodeFunction, WorkflowBlueprint } from './types'\n\nexport type LinterIssueCode =\n\t| 'INVALID_EDGE_SOURCE'\n\t| 'INVALID_EDGE_TARGET'\n\t| 'MISSING_NODE_IMPLEMENTATION'\n\t| 'ORPHAN_NODE'\n\t| 'INVALID_BATCH_WORKER_KEY'\n\t| 'INVALID_SUBFLOW_BLUEPRINT_ID'\n\nexport interface LinterIssue {\n\tcode: LinterIssueCode\n\tmessage: string\n\tnodeId?: string\n\trelatedId?: string\n}\n\nexport interface LinterResult {\n\tisValid: boolean\n\tissues: LinterIssue[]\n}\n\n/**\n * Statically analyzes a workflow blueprint against a registry of implementations\n * to find common errors before runtime.\n *\n * @param blueprint The WorkflowBlueprint to analyze.\n * @param registry A map of node implementations (functions or classes) to check against.\n * @returns A LinterResult object containing any issues found.\n */\nexport function lintBlueprint(\n\tblueprint: WorkflowBlueprint,\n\tregistry: Map<string, NodeFunction | NodeClass> | Record<string, NodeFunction | NodeClass>,\n\tblueprints?: Record<string, WorkflowBlueprint>,\n): LinterResult {\n\tconst issues: LinterIssue[] = []\n\tconst nodeIds = new Set(blueprint.nodes.map((n) => n.id))\n\tconst registryKeys = registry instanceof Map ? new Set(registry.keys()) : new Set(Object.keys(registry))\n\n\t// check for missing node implementations\n\tfor (const node of blueprint.nodes) {\n\t\tif (!node.uses.startsWith('batch-') && !node.uses.startsWith('loop-') && !registryKeys.has(node.uses)) {\n\t\t\tissues.push({\n\t\t\t\tcode: 'MISSING_NODE_IMPLEMENTATION',\n\t\t\t\tmessage: `Node implementation key '${node.uses}' is not found in the provided registry.`,\n\t\t\t\tnodeId: node.id,\n\t\t\t})\n\t\t}\n\t}\n\n\t// check for dynamic node validation\n\tfor (const node of blueprint.nodes) {\n\t\tif (node.uses.startsWith('batch-') && node.params?.workerUsesKey) {\n\t\t\tif (!registryKeys.has(node.params.workerUsesKey)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tcode: 'INVALID_BATCH_WORKER_KEY',\n\t\t\t\t\tmessage: `Batch node '${node.id}' references workerUsesKey '${node.params.workerUsesKey}' which is not found in the registry.`,\n\t\t\t\t\tnodeId: node.id,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (node.uses === 'subflow' && node.params?.blueprintId) {\n\t\t\tif (!blueprints || !blueprints[node.params.blueprintId]) {\n\t\t\t\tissues.push({\n\t\t\t\t\tcode: 'INVALID_SUBFLOW_BLUEPRINT_ID',\n\t\t\t\t\tmessage: `Subflow node '${node.id}' references blueprintId '${node.params.blueprintId}' which is not found in the blueprints registry.`,\n\t\t\t\t\tnodeId: node.id,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\t// check for graph integrity (edges must point to valid nodes)\n\tfor (const edge of blueprint.edges || []) {\n\t\tif (!nodeIds.has(edge.source)) {\n\t\t\tissues.push({\n\t\t\t\tcode: 'INVALID_EDGE_SOURCE',\n\t\t\t\tmessage: `Edge source '${edge.source}' does not correspond to a valid node ID.`,\n\t\t\t\trelatedId: edge.target,\n\t\t\t})\n\t\t}\n\t\tif (!nodeIds.has(edge.target)) {\n\t\t\tissues.push({\n\t\t\t\tcode: 'INVALID_EDGE_TARGET',\n\t\t\t\tmessage: `Edge target '${edge.target}' does not correspond to a valid node ID.`,\n\t\t\t\trelatedId: edge.source,\n\t\t\t})\n\t\t}\n\t}\n\n\t// check for orphan nodes (not connected to the main graph)\n\tif (blueprint.nodes.length > 1) {\n\t\tconst analysis = analyzeBlueprint(blueprint)\n\t\tconst connectedNodes = new Set<string>()\n\t\tconst nodesToVisit = [...analysis.startNodeIds]\n\t\tconst visited = new Set<string>()\n\n\t\twhile (nodesToVisit.length > 0) {\n\t\t\tconst currentId = nodesToVisit.pop()\n\t\t\tif (!currentId || visited.has(currentId)) continue\n\n\t\t\tvisited.add(currentId)\n\t\t\tconnectedNodes.add(currentId)\n\n\t\t\tfor (const e of blueprint.edges.filter((e) => e.source === currentId)) {\n\t\t\t\tnodesToVisit.push(e.target)\n\t\t\t}\n\t\t}\n\n\t\tfor (const nodeId of nodeIds) {\n\t\t\tif (!connectedNodes.has(nodeId)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tcode: 'ORPHAN_NODE',\n\t\t\t\t\tmessage: `Node '${nodeId}' is not reachable from any start node.`,\n\t\t\t\t\tnodeId,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tisValid: issues.length === 0,\n\t\tissues,\n\t}\n}\n"]}
@@ -1,33 +0,0 @@
1
- import { WorkflowState } from './chunk-L46TQXCV.js';
2
-
3
- // src/runtime/execution-context.ts
4
- var ExecutionContext = class _ExecutionContext {
5
- constructor(blueprint, state, nodeRegistry, executionId, runtime, services, signal, concurrency) {
6
- this.blueprint = blueprint;
7
- this.state = state;
8
- this.nodeRegistry = nodeRegistry;
9
- this.executionId = executionId;
10
- this.runtime = runtime;
11
- this.services = services;
12
- this.signal = signal;
13
- this.concurrency = concurrency;
14
- this.state.setEventEmitter(this.services.eventBus, this.executionId);
15
- }
16
- createForSubflow(subBlueprint, initialSubState) {
17
- const subState = new WorkflowState(initialSubState);
18
- return new _ExecutionContext(
19
- subBlueprint,
20
- subState,
21
- this.nodeRegistry,
22
- this.executionId,
23
- this.runtime,
24
- this.services,
25
- this.signal,
26
- this.concurrency
27
- );
28
- }
29
- };
30
-
31
- export { ExecutionContext };
32
- //# sourceMappingURL=chunk-L3MX5MTA.js.map
33
- //# sourceMappingURL=chunk-L3MX5MTA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/execution-context.ts"],"names":[],"mappings":";;;AAkBO,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAAkG;AAAA,EAC9G,WAAA,CACiB,WACA,KAAA,EACA,YAAA,EACA,aACA,OAAA,EACA,QAAA,EAQA,QACA,WAAA,EACf;AAfe,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAQA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAEhB,IAAA,IAAA,CAAK,MAAM,eAAA,CAAgB,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA,EACpE;AAAA,EAEO,gBAAA,CACN,cACA,eAAA,EAC4C;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAI,aAAA,CAAwB,eAAe,CAAA;AAC5D,IAAA,OAAO,IAAI,iBAAA;AAAA,MACV,YAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK,OAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACN;AAAA,EACD;AACD","file":"chunk-L3MX5MTA.js","sourcesContent":["import type {\n\tIEvaluator,\n\tIEventBus,\n\tILogger,\n\tISerializer,\n\tMiddleware,\n\tNodeClass,\n\tNodeFunction,\n\tRuntimeDependencies,\n\tWorkflowBlueprint,\n} from '../types'\nimport type { FlowRuntime } from './runtime'\nimport { WorkflowState } from './state'\n\n/**\n * A container for all state and dependencies of a single workflow execution.\n * This object is created once per `run` and passed through the execution stack.\n */\nexport class ExecutionContext<TContext extends Record<string, any>, TDependencies extends RuntimeDependencies> {\n\tconstructor(\n\t\tpublic readonly blueprint: WorkflowBlueprint,\n\t\tpublic readonly state: WorkflowState<TContext>,\n\t\tpublic readonly nodeRegistry: Map<string, NodeFunction | NodeClass>,\n\t\tpublic readonly executionId: string,\n\t\tpublic readonly runtime: FlowRuntime<TContext, TDependencies>, // A reference back to the runtime for orchestrating subflows\n\t\tpublic readonly services: {\n\t\t\tlogger: ILogger\n\t\t\teventBus: IEventBus\n\t\t\tserializer: ISerializer\n\t\t\tevaluator: IEvaluator\n\t\t\tmiddleware: Middleware[]\n\t\t\tdependencies: TDependencies\n\t\t},\n\t\tpublic readonly signal?: AbortSignal,\n\t\tpublic readonly concurrency?: number,\n\t) {\n\t\tthis.state.setEventEmitter(this.services.eventBus, this.executionId)\n\t}\n\n\tpublic createForSubflow(\n\t\tsubBlueprint: WorkflowBlueprint,\n\t\tinitialSubState: Partial<TContext>,\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.nodeRegistry,\n\t\t\tthis.executionId,\n\t\t\tthis.runtime,\n\t\t\tthis.services,\n\t\t\tthis.signal,\n\t\t\tthis.concurrency,\n\t\t)\n\t}\n}\n"]}
@@ -1,144 +0,0 @@
1
- import { TrackedAsyncContext, AsyncContextView, Context } from './chunk-ZETQCNEF.js';
2
- import { FlowcraftError } from './chunk-BCRWXTWX.js';
3
-
4
- // src/runtime/state.ts
5
- var WorkflowState = class {
6
- _completedNodes = /* @__PURE__ */ new Set();
7
- errors = [];
8
- anyFallbackExecuted = false;
9
- context;
10
- _isAwaiting = false;
11
- _awaitingNodeIds = /* @__PURE__ */ new Set();
12
- _awaitingDetails = /* @__PURE__ */ new Map();
13
- constructor(initialData, context) {
14
- if (context) {
15
- this.context = context instanceof TrackedAsyncContext ? context : new TrackedAsyncContext(context);
16
- } else {
17
- this.context = new TrackedAsyncContext(new AsyncContextView(new Context(initialData)));
18
- }
19
- if (initialData._awaitingNodeIds) {
20
- this._isAwaiting = true;
21
- const awaitingIds = initialData._awaitingNodeIds;
22
- if (Array.isArray(awaitingIds)) {
23
- for (const id of awaitingIds) {
24
- this._awaitingNodeIds.add(id);
25
- }
26
- }
27
- }
28
- if (initialData._awaitingDetails) {
29
- this._awaitingDetails = new Map(Object.entries(initialData._awaitingDetails));
30
- }
31
- for (const key of Object.keys(initialData)) {
32
- if (key.startsWith("_outputs.")) {
33
- const nodeId = key.substring("_outputs.".length);
34
- this._completedNodes.add(nodeId);
35
- }
36
- }
37
- }
38
- /**
39
- * Configure the context to emit events when modified.
40
- * This is called after the ExecutionContext is created.
41
- */
42
- setEventEmitter(eventBus, executionId, sourceNode) {
43
- if (this.context instanceof TrackedAsyncContext) {
44
- this.context.configureEventEmitter(eventBus, executionId, sourceNode);
45
- }
46
- }
47
- async addCompletedNode(nodeId, output) {
48
- this._completedNodes.add(nodeId);
49
- await this.context.set(`_outputs.${nodeId}`, output);
50
- }
51
- addError(nodeId, error) {
52
- const flowcraftError = new FlowcraftError(error.message, {
53
- cause: error,
54
- nodeId,
55
- isFatal: false
56
- });
57
- this.errors.push({
58
- ...flowcraftError,
59
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
60
- originalError: error
61
- // legacy compatibility
62
- });
63
- }
64
- clearError(nodeId) {
65
- this.errors = this.errors.filter((err) => err.nodeId !== nodeId);
66
- }
67
- markFallbackExecuted() {
68
- this.anyFallbackExecuted = true;
69
- }
70
- getContext() {
71
- return this.context;
72
- }
73
- getCompletedNodes() {
74
- return new Set(this._completedNodes);
75
- }
76
- getErrors() {
77
- return this.errors;
78
- }
79
- getAnyFallbackExecuted() {
80
- return this.anyFallbackExecuted;
81
- }
82
- async markAsAwaiting(nodeId, details) {
83
- this._isAwaiting = true;
84
- this._awaitingNodeIds.add(nodeId);
85
- if (details) {
86
- this._awaitingDetails.set(nodeId, details);
87
- }
88
- await this.context.set("_awaitingNodeIds", Array.from(this._awaitingNodeIds));
89
- await this.context.set("_awaitingDetails", Object.fromEntries(this._awaitingDetails));
90
- }
91
- isAwaiting() {
92
- return this._isAwaiting && this._awaitingNodeIds.size > 0;
93
- }
94
- getAwaitingNodeIds() {
95
- return Array.from(this._awaitingNodeIds);
96
- }
97
- getAwaitingDetails(nodeId) {
98
- return this._awaitingDetails.get(nodeId);
99
- }
100
- clearAwaiting(nodeId) {
101
- if (nodeId) {
102
- this._awaitingNodeIds.delete(nodeId);
103
- this._awaitingDetails.delete(nodeId);
104
- } else {
105
- this._awaitingNodeIds.clear();
106
- this._awaitingDetails.clear();
107
- }
108
- this._isAwaiting = this._awaitingNodeIds.size > 0;
109
- if (this._awaitingNodeIds.size > 0) {
110
- this.context.set("_awaitingNodeIds", Array.from(this._awaitingNodeIds));
111
- this.context.set("_awaitingDetails", Object.fromEntries(this._awaitingDetails));
112
- } else {
113
- this.context.delete("_awaitingNodeIds");
114
- this.context.delete("_awaitingDetails");
115
- }
116
- }
117
- getStatus(isTraversalComplete = false) {
118
- if (this._isAwaiting) return "awaiting";
119
- if (this.anyFallbackExecuted) return "completed";
120
- if (this.errors.length > 0) return "failed";
121
- if (isTraversalComplete) return "completed";
122
- return "stalled";
123
- }
124
- async toResult(serializer, executionId) {
125
- const contextJSON = await this.context.toJSON();
126
- if (!this._isAwaiting && contextJSON._awaitingNodeIds) {
127
- delete contextJSON._awaitingNodeIds;
128
- delete contextJSON._awaitingDetails;
129
- }
130
- if (executionId) {
131
- contextJSON._executionId = executionId;
132
- }
133
- return {
134
- context: contextJSON,
135
- serializedContext: serializer.serialize(contextJSON),
136
- status: this.getStatus(),
137
- errors: this.errors.length > 0 ? this.errors : void 0
138
- };
139
- }
140
- };
141
-
142
- export { WorkflowState };
143
- //# sourceMappingURL=chunk-L46TQXCV.js.map
144
- //# sourceMappingURL=chunk-L46TQXCV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/state.ts"],"names":[],"mappings":";;;;AAIO,IAAM,gBAAN,MAA0D;AAAA,EACxD,eAAA,uBAAsB,GAAA,EAAY;AAAA,EAClC,SAA0B,EAAC;AAAA,EAC3B,mBAAA,GAAsB,KAAA;AAAA,EACtB,OAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,gBAAA,uBAAuB,GAAA,EAAY;AAAA,EACnC,gBAAA,uBAAuB,GAAA,EAAiB;AAAA,EAEhD,WAAA,CAAY,aAAgC,OAAA,EAAmC;AAC9E,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,UAAU,OAAA,YAAmB,mBAAA,GAAsB,OAAA,GAAU,IAAI,oBAAoB,OAAO,CAAA;AAAA,IAClG,CAAA,MAAO;AACN,MAAA,IAAA,CAAK,OAAA,GAAU,IAAI,mBAAA,CAAoB,IAAI,iBAAiB,IAAI,OAAA,CAAsB,WAAW,CAAC,CAAC,CAAA;AAAA,IACpG;AACA,IAAA,IAAK,YAAoB,gBAAA,EAAkB;AAC1C,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,MAAM,cAAe,WAAA,CAAoB,gBAAA;AACzC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/B,QAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC7B,UAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,EAAE,CAAA;AAAA,QAC7B;AAAA,MACD;AAAA,IACD;AACA,IAAA,IAAK,YAAoB,gBAAA,EAAkB;AAC1C,MAAA,IAAA,CAAK,mBAAmB,IAAI,GAAA,CAAI,OAAO,OAAA,CAAS,WAAA,CAAoB,gBAAgB,CAAC,CAAA;AAAA,IACtF;AACA,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAC3C,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAChC,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,WAAA,CAAY,MAAM,CAAA;AAC/C,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,MAAM,CAAA;AAAA,MAChC;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,CAAgB,QAAA,EAAe,WAAA,EAAqB,UAAA,EAA2B;AAC9E,IAAA,IAAI,IAAA,CAAK,mBAAmB,mBAAA,EAAqB;AAChD,MAAA,IAAA,CAAK,OAAA,CAAQ,qBAAA,CAAsB,QAAA,EAAU,WAAA,EAAa,UAAU,CAAA;AAAA,IACrE;AAAA,EACD;AAAA,EAEA,MAAM,gBAAA,CAAiB,MAAA,EAAgB,MAAA,EAAa;AACnD,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,MAAM,CAAA;AAC/B,IAAA,MAAM,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,MAAM,IAAW,MAAM,CAAA;AAAA,EAC3D;AAAA,EAEA,QAAA,CAAS,QAAgB,KAAA,EAAc;AACtC,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,KAAA,CAAM,OAAA,EAAS;AAAA,MACxD,KAAA,EAAO,KAAA;AAAA,MACP,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACT,CAAA;AACD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MAChB,GAAG,cAAA;AAAA,MACH,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,aAAA,EAAe;AAAA;AAAA,KACf,CAAA;AAAA,EACF;AAAA,EAEA,WAAW,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAW,MAAM,CAAA;AAAA,EAChE;AAAA,EAEA,oBAAA,GAAuB;AACtB,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAAA,EAC5B;AAAA,EAEA,UAAA,GAAsC;AACrC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACb;AAAA,EAEA,iBAAA,GAAiC;AAChC,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,eAAe,CAAA;AAAA,EACpC;AAAA,EAEA,SAAA,GAA6B;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EAEA,sBAAA,GAAkC;AACjC,IAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,EACb;AAAA,EAEA,MAAM,cAAA,CAAe,MAAA,EAAgB,OAAA,EAA8B;AAClE,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,MAAM,CAAA;AAChC,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC1C;AACA,IAAA,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAI,kBAAA,EAA2B,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAgB,CAAC,CAAA;AACnF,IAAA,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAI,kBAAA,EAA2B,OAAO,WAAA,CAAY,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAAA,EAC5F;AAAA,EAEA,UAAA,GAAsB;AACrB,IAAA,OAAO,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,gBAAA,CAAiB,IAAA,GAAO,CAAA;AAAA,EACzD;AAAA,EAEA,kBAAA,GAA+B;AAC9B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAgB,CAAA;AAAA,EACxC;AAAA,EAEA,mBAAmB,MAAA,EAAqB;AACvC,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,cAAc,MAAA,EAAuB;AACpC,IAAA,IAAI,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,MAAM,CAAA;AACnC,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAAA,IACpC,CAAA,MAAO;AACN,MAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,MAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,IAAA,GAAO,CAAA;AAEhD,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,IAAA,GAAO,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,kBAAA,EAA2B,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAC7E,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,kBAAA,EAA2B,OAAO,WAAA,CAAY,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAAA,IACtF,CAAA,MAAO;AACN,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,kBAAyB,CAAA;AAC7C,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,kBAAyB,CAAA;AAAA,IAC9C;AAAA,EACD;AAAA,EAEA,SAAA,CAAU,sBAAsB,KAAA,EAAiC;AAChE,IAAA,IAAI,IAAA,CAAK,aAAa,OAAO,UAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,qBAAqB,OAAO,WAAA;AACrC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,QAAA;AACnC,IAAA,IAAI,qBAAqB,OAAO,WAAA;AAChC,IAAA,OAAO,SAAA;AAAA,EACR;AAAA,EAEA,MAAM,QAAA,CAAS,UAAA,EAAyB,WAAA,EAAyD;AAChG,IAAA,MAAM,WAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAgB,WAAA,CAAoB,gBAAA,EAAkB;AAC/D,MAAA,OAAQ,WAAA,CAAoB,gBAAA;AAC5B,MAAA,OAAQ,WAAA,CAAoB,gBAAA;AAAA,IAC7B;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAC,YAAoB,YAAA,GAAe,WAAA;AAAA,IACtC;AACA,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,WAAA;AAAA,MACT,iBAAA,EAAmB,UAAA,CAAW,SAAA,CAAU,WAAW,CAAA;AAAA,MACnD,MAAA,EAAQ,KAAK,SAAA,EAAU;AAAA,MACvB,QAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,KAAK,MAAA,GAAS;AAAA,KAChD;AAAA,EACD;AACD","file":"chunk-L46TQXCV.js","sourcesContent":["import { AsyncContextView, Context as SyncContext, TrackedAsyncContext } from '../context'\nimport { FlowcraftError } from '../errors'\nimport type { IAsyncContext, ISerializer, WorkflowError, WorkflowResult } from '../types'\n\nexport class WorkflowState<TContext extends Record<string, any>> {\n\tprivate _completedNodes = new Set<string>()\n\tprivate errors: WorkflowError[] = []\n\tprivate anyFallbackExecuted = false\n\tprivate context: IAsyncContext<TContext>\n\tprivate _isAwaiting = false\n\tprivate _awaitingNodeIds = new Set<string>()\n\tprivate _awaitingDetails = new Map<string, any>()\n\n\tconstructor(initialData: Partial<TContext>, context?: IAsyncContext<TContext>) {\n\t\tif (context) {\n\t\t\tthis.context = context instanceof TrackedAsyncContext ? context : new TrackedAsyncContext(context)\n\t\t} else {\n\t\t\tthis.context = new TrackedAsyncContext(new AsyncContextView(new SyncContext<TContext>(initialData)))\n\t\t}\n\t\tif ((initialData as any)._awaitingNodeIds) {\n\t\t\tthis._isAwaiting = true\n\t\t\tconst awaitingIds = (initialData as any)._awaitingNodeIds\n\t\t\tif (Array.isArray(awaitingIds)) {\n\t\t\t\tfor (const id of awaitingIds) {\n\t\t\t\t\tthis._awaitingNodeIds.add(id)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ((initialData as any)._awaitingDetails) {\n\t\t\tthis._awaitingDetails = new Map(Object.entries((initialData as any)._awaitingDetails))\n\t\t}\n\t\tfor (const key of Object.keys(initialData)) {\n\t\t\tif (key.startsWith('_outputs.')) {\n\t\t\t\tconst nodeId = key.substring('_outputs.'.length)\n\t\t\t\tthis._completedNodes.add(nodeId)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Configure the context to emit events when modified.\n\t * This is called after the ExecutionContext is created.\n\t */\n\tsetEventEmitter(eventBus: any, executionId: string, sourceNode?: string): void {\n\t\tif (this.context instanceof TrackedAsyncContext) {\n\t\t\tthis.context.configureEventEmitter(eventBus, executionId, sourceNode)\n\t\t}\n\t}\n\n\tasync addCompletedNode(nodeId: string, output: any) {\n\t\tthis._completedNodes.add(nodeId)\n\t\tawait this.context.set(`_outputs.${nodeId}` as any, output)\n\t}\n\n\taddError(nodeId: string, error: Error) {\n\t\tconst flowcraftError = new FlowcraftError(error.message, {\n\t\t\tcause: error,\n\t\t\tnodeId,\n\t\t\tisFatal: false,\n\t\t})\n\t\tthis.errors.push({\n\t\t\t...flowcraftError,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\toriginalError: error, // legacy compatibility\n\t\t})\n\t}\n\n\tclearError(nodeId: string) {\n\t\tthis.errors = this.errors.filter((err) => err.nodeId !== nodeId)\n\t}\n\n\tmarkFallbackExecuted() {\n\t\tthis.anyFallbackExecuted = true\n\t}\n\n\tgetContext(): IAsyncContext<TContext> {\n\t\treturn this.context\n\t}\n\n\tgetCompletedNodes(): Set<string> {\n\t\treturn new Set(this._completedNodes)\n\t}\n\n\tgetErrors(): WorkflowError[] {\n\t\treturn this.errors\n\t}\n\n\tgetAnyFallbackExecuted(): boolean {\n\t\treturn this.anyFallbackExecuted\n\t}\n\n\tasync markAsAwaiting(nodeId: string, details?: any): Promise<void> {\n\t\tthis._isAwaiting = true\n\t\tthis._awaitingNodeIds.add(nodeId)\n\t\tif (details) {\n\t\t\tthis._awaitingDetails.set(nodeId, details)\n\t\t}\n\t\tawait this.context.set('_awaitingNodeIds' as any, Array.from(this._awaitingNodeIds))\n\t\tawait this.context.set('_awaitingDetails' as any, Object.fromEntries(this._awaitingDetails))\n\t}\n\n\tisAwaiting(): boolean {\n\t\treturn this._isAwaiting && this._awaitingNodeIds.size > 0\n\t}\n\n\tgetAwaitingNodeIds(): string[] {\n\t\treturn Array.from(this._awaitingNodeIds)\n\t}\n\n\tgetAwaitingDetails(nodeId: string): any {\n\t\treturn this._awaitingDetails.get(nodeId)\n\t}\n\n\tclearAwaiting(nodeId?: string): void {\n\t\tif (nodeId) {\n\t\t\tthis._awaitingNodeIds.delete(nodeId)\n\t\t\tthis._awaitingDetails.delete(nodeId)\n\t\t} else {\n\t\t\tthis._awaitingNodeIds.clear()\n\t\t\tthis._awaitingDetails.clear()\n\t\t}\n\t\tthis._isAwaiting = this._awaitingNodeIds.size > 0\n\n\t\tif (this._awaitingNodeIds.size > 0) {\n\t\t\tthis.context.set('_awaitingNodeIds' as any, Array.from(this._awaitingNodeIds))\n\t\t\tthis.context.set('_awaitingDetails' as any, Object.fromEntries(this._awaitingDetails))\n\t\t} else {\n\t\t\tthis.context.delete('_awaitingNodeIds' as any)\n\t\t\tthis.context.delete('_awaitingDetails' as any)\n\t\t}\n\t}\n\n\tgetStatus(isTraversalComplete = false): WorkflowResult['status'] {\n\t\tif (this._isAwaiting) return 'awaiting'\n\t\tif (this.anyFallbackExecuted) return 'completed'\n\t\tif (this.errors.length > 0) return 'failed'\n\t\tif (isTraversalComplete) return 'completed'\n\t\treturn 'stalled'\n\t}\n\n\tasync toResult(serializer: ISerializer, executionId?: string): Promise<WorkflowResult<TContext>> {\n\t\tconst contextJSON = (await this.context.toJSON()) as TContext\n\t\tif (!this._isAwaiting && (contextJSON as any)._awaitingNodeIds) {\n\t\t\tdelete (contextJSON as any)._awaitingNodeIds\n\t\t\tdelete (contextJSON as any)._awaitingDetails\n\t\t}\n\t\tif (executionId) {\n\t\t\t;(contextJSON as any)._executionId = executionId\n\t\t}\n\t\treturn {\n\t\t\tcontext: contextJSON,\n\t\t\tserializedContext: serializer.serialize(contextJSON),\n\t\t\tstatus: this.getStatus(),\n\t\t\terrors: this.errors.length > 0 ? this.errors : undefined,\n\t\t}\n\t}\n}\n"]}
@@ -1,73 +0,0 @@
1
- // src/runtime/scheduler.ts
2
- var WorkflowScheduler = class {
3
- runtime;
4
- activeWorkflows = /* @__PURE__ */ new Map();
5
- intervalId;
6
- checkIntervalMs;
7
- constructor(runtime, checkIntervalMs = 1e3) {
8
- this.runtime = runtime;
9
- this.checkIntervalMs = checkIntervalMs;
10
- }
11
- start() {
12
- if (this.intervalId) return;
13
- this.intervalId = setInterval(() => {
14
- this.checkAndResumeWorkflows();
15
- }, this.checkIntervalMs);
16
- }
17
- stop() {
18
- if (this.intervalId) {
19
- clearInterval(this.intervalId);
20
- this.intervalId = void 0;
21
- }
22
- }
23
- registerAwaitingWorkflow(executionId, blueprintId, serializedContext, awaitingNodeId, wakeUpAt) {
24
- this.activeWorkflows.set(executionId, {
25
- executionId,
26
- blueprintId,
27
- serializedContext,
28
- awaitingNodeId,
29
- wakeUpAt
30
- });
31
- }
32
- unregisterWorkflow(executionId) {
33
- this.activeWorkflows.delete(executionId);
34
- }
35
- async checkAndResumeWorkflows() {
36
- const now = /* @__PURE__ */ new Date();
37
- const toResume = [];
38
- for (const [_executionId, workflow] of this.activeWorkflows) {
39
- const wakeUpTime = new Date(workflow.wakeUpAt);
40
- if (wakeUpTime <= now) {
41
- toResume.push(workflow);
42
- }
43
- }
44
- for (const workflow of toResume) {
45
- try {
46
- const blueprint = this.runtime.getBlueprint(workflow.blueprintId);
47
- if (!blueprint) {
48
- console.warn(`Blueprint ${workflow.blueprintId} not found, skipping resumption`);
49
- continue;
50
- }
51
- const result = await this.runtime.resume(
52
- blueprint,
53
- workflow.serializedContext,
54
- { output: void 0 },
55
- workflow.awaitingNodeId
56
- );
57
- if (result.status === "completed" || result.status === "failed") {
58
- this.unregisterWorkflow(workflow.executionId);
59
- }
60
- } catch (error) {
61
- console.error(`Failed to resume workflow ${workflow.executionId}:`, error);
62
- this.unregisterWorkflow(workflow.executionId);
63
- }
64
- }
65
- }
66
- getActiveWorkflows() {
67
- return Array.from(this.activeWorkflows.values());
68
- }
69
- };
70
-
71
- export { WorkflowScheduler };
72
- //# sourceMappingURL=chunk-LM4ACVHL.js.map
73
- //# sourceMappingURL=chunk-LM4ACVHL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/scheduler.ts"],"names":[],"mappings":";AAUO,IAAM,oBAAN,MAAwB;AAAA,EACtB,OAAA;AAAA,EACA,eAAA,uBAAqD,GAAA,EAAI;AAAA,EACzD,UAAA;AAAA,EACA,eAAA;AAAA,EAER,WAAA,CAAY,OAAA,EAAgC,eAAA,GAA0B,GAAA,EAAM;AAC3E,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACxB;AAAA,EAEA,KAAA,GAAc;AACb,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AACnC,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,IAC9B,CAAA,EAAG,KAAK,eAAe,CAAA;AAAA,EACxB;AAAA,EAEA,IAAA,GAAa;AACZ,IAAA,IAAI,KAAK,UAAA,EAAY;AACpB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,wBAAA,CACC,WAAA,EACA,WAAA,EACA,iBAAA,EACA,gBACA,QAAA,EACO;AACP,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,WAAA,EAAa;AAAA,MACrC,WAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACA,CAAA;AAAA,EACF;AAAA,EAEA,mBAAmB,WAAA,EAA2B;AAC7C,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,WAAW,CAAA;AAAA,EACxC;AAAA,EAEA,MAAc,uBAAA,GAAyC;AACtD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,WAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,CAAC,YAAA,EAAc,QAAQ,CAAA,IAAK,KAAK,eAAA,EAAiB;AAC5D,MAAA,MAAM,UAAA,GAAa,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAC7C,MAAA,IAAI,cAAc,GAAA,EAAK;AACtB,QAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,MACvB;AAAA,IACD;AAEA,IAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAChC,MAAA,IAAI;AACH,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,SAAS,WAAW,CAAA;AAChE,QAAA,IAAI,CAAC,SAAA,EAAW;AACf,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,QAAA,CAAS,WAAW,CAAA,+BAAA,CAAiC,CAAA;AAC/E,UAAA;AAAA,QACD;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA;AAAA,UACjC,SAAA;AAAA,UACA,QAAA,CAAS,iBAAA;AAAA,UACT,EAAE,QAAQ,KAAA,CAAA,EAAU;AAAA,UACpB,QAAA,CAAS;AAAA,SACV;AAEA,QAAA,IAAI,MAAA,CAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,QAAA,EAAU;AAChE,UAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,WAAW,CAAA;AAAA,QAC7C;AAAA,MACD,SAAS,KAAA,EAAO;AACf,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAA,CAAS,WAAW,KAAK,KAAK,CAAA;AACzE,QAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,WAAW,CAAA;AAAA,MAC7C;AAAA,IACD;AAAA,EACD;AAAA,EAEA,kBAAA,GAAyC;AACxC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAAA,EAChD;AACD","file":"chunk-LM4ACVHL.js","sourcesContent":["import type { FlowRuntime } from './runtime'\n\nexport interface AwaitingWorkflow {\n\texecutionId: string\n\tblueprintId: string\n\tserializedContext: string\n\tawaitingNodeId: string\n\twakeUpAt: string\n}\n\nexport class WorkflowScheduler {\n\tprivate runtime: FlowRuntime<any, any>\n\tprivate activeWorkflows: Map<string, AwaitingWorkflow> = new Map()\n\tprivate intervalId?: NodeJS.Timeout\n\tprivate checkIntervalMs: number\n\n\tconstructor(runtime: FlowRuntime<any, any>, checkIntervalMs: number = 1000) {\n\t\tthis.runtime = runtime\n\t\tthis.checkIntervalMs = checkIntervalMs\n\t}\n\n\tstart(): void {\n\t\tif (this.intervalId) return\n\n\t\tthis.intervalId = setInterval(() => {\n\t\t\tthis.checkAndResumeWorkflows()\n\t\t}, this.checkIntervalMs)\n\t}\n\n\tstop(): void {\n\t\tif (this.intervalId) {\n\t\t\tclearInterval(this.intervalId)\n\t\t\tthis.intervalId = undefined\n\t\t}\n\t}\n\n\tregisterAwaitingWorkflow(\n\t\texecutionId: string,\n\t\tblueprintId: string,\n\t\tserializedContext: string,\n\t\tawaitingNodeId: string,\n\t\twakeUpAt: string,\n\t): void {\n\t\tthis.activeWorkflows.set(executionId, {\n\t\t\texecutionId,\n\t\t\tblueprintId,\n\t\t\tserializedContext,\n\t\t\tawaitingNodeId,\n\t\t\twakeUpAt,\n\t\t})\n\t}\n\n\tunregisterWorkflow(executionId: string): void {\n\t\tthis.activeWorkflows.delete(executionId)\n\t}\n\n\tprivate async checkAndResumeWorkflows(): Promise<void> {\n\t\tconst now = new Date()\n\t\tconst toResume: AwaitingWorkflow[] = []\n\n\t\tfor (const [_executionId, workflow] of this.activeWorkflows) {\n\t\t\tconst wakeUpTime = new Date(workflow.wakeUpAt)\n\t\t\tif (wakeUpTime <= now) {\n\t\t\t\ttoResume.push(workflow)\n\t\t\t}\n\t\t}\n\n\t\tfor (const workflow of toResume) {\n\t\t\ttry {\n\t\t\t\tconst blueprint = this.runtime.getBlueprint(workflow.blueprintId)\n\t\t\t\tif (!blueprint) {\n\t\t\t\t\tconsole.warn(`Blueprint ${workflow.blueprintId} not found, skipping resumption`)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst result = await this.runtime.resume(\n\t\t\t\t\tblueprint,\n\t\t\t\t\tworkflow.serializedContext,\n\t\t\t\t\t{ output: undefined },\n\t\t\t\t\tworkflow.awaitingNodeId,\n\t\t\t\t)\n\n\t\t\t\tif (result.status === 'completed' || result.status === 'failed') {\n\t\t\t\t\tthis.unregisterWorkflow(workflow.executionId)\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Failed to resume workflow ${workflow.executionId}:`, error)\n\t\t\t\tthis.unregisterWorkflow(workflow.executionId)\n\t\t\t}\n\t\t}\n\t}\n\n\tgetActiveWorkflows(): AwaitingWorkflow[] {\n\t\treturn Array.from(this.activeWorkflows.values())\n\t}\n}\n"]}
@@ -1,51 +0,0 @@
1
- // src/node.ts
2
- function isNodeClass(impl) {
3
- return typeof impl === "function" && !!impl.prototype?.exec;
4
- }
5
- var BaseNode = class {
6
- /**
7
- * @param params Static parameters for this node instance, passed from the blueprint.
8
- * @param nodeId The ID of the node in the blueprint.
9
- */
10
- constructor(params, nodeId) {
11
- this.params = params;
12
- this.nodeId = nodeId;
13
- }
14
- /**
15
- * Phase 1: Gathers and prepares data for execution. This phase is NOT retried on failure.
16
- * @param context The node's execution context.
17
- * @returns The data needed for the `exec` phase.
18
- */
19
- async prep(context) {
20
- return context.input;
21
- }
22
- /**
23
- * Phase 3: Processes the result and saves state. This phase is NOT retried.
24
- * @param execResult The successful result from the `exec` or `fallback` phase.
25
- * @param _context The node's execution context.
26
- */
27
- async post(execResult, _context) {
28
- return execResult;
29
- }
30
- /**
31
- * An optional safety net that runs if all `exec` retries fail.
32
- * @param error The final error from the last `exec` attempt.
33
- * @param _context The node's execution context.
34
- */
35
- async fallback(error, _context) {
36
- throw error;
37
- }
38
- /**
39
- * An optional cleanup phase for non-retriable errors that occur outside the main `exec` method.
40
- * This method is invoked in a `finally` block or equivalent construct if a fatal, unhandled exception occurs in the `prep`, `exec`, or `post` phases.
41
- * Allows nodes to perform crucial cleanup, such as closing database connections or releasing locks.
42
- * @param _error The error that caused the failure.
43
- * @param _context The node's execution context.
44
- */
45
- async recover(_error, _context) {
46
- }
47
- };
48
-
49
- export { BaseNode, isNodeClass };
50
- //# sourceMappingURL=chunk-LNK7LZER.js.map
51
- //# sourceMappingURL=chunk-LNK7LZER.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/node.ts"],"names":[],"mappings":";AAGO,SAAS,YAAY,IAAA,EAA8B;AACzD,EAAA,OAAO,OAAO,IAAA,KAAS,UAAA,IAAc,CAAC,CAAC,KAAK,SAAA,EAAW,IAAA;AACxD;AAOO,IAAe,WAAf,MAML;AAAA;AAAA;AAAA;AAAA;AAAA,EAKD,WAAA,CACW,QACA,MAAA,EACT;AAFS,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOH,MAAM,KAAK,OAAA,EAAqE;AAC/E,IAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,IAAA,CACL,UAAA,EACA,QAAA,EACwC;AACxC,IAAA,OAAO,UAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,CACL,KAAA,EACA,QAAA,EACuD;AAEvD,IAAA,MAAM,KAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,CAAQ,MAAA,EAAe,QAAA,EAAuE;AAAA,EAEpG;AACD","file":"chunk-LNK7LZER.js","sourcesContent":["import type { NodeClass, NodeContext, NodeResult, RuntimeDependencies } from './types'\n\n/** A type guard to reliably distinguish a NodeClass from a NodeFunction. */\nexport function isNodeClass(impl: any): impl is NodeClass {\n\treturn typeof impl === 'function' && !!impl.prototype?.exec\n}\n\n/**\n * A structured, class-based node for complex logic with a safe, granular lifecycle.\n * This class is generic, allowing implementations to specify the exact context\n * and dependency types they expect.\n */\nexport abstract class BaseNode<\n\tTContext extends Record<string, any> = Record<string, any>,\n\tTDependencies extends RuntimeDependencies = RuntimeDependencies,\n\tTInput = any,\n\tTOutput = any,\n\tTAction extends string = string,\n> {\n\t/**\n\t * @param params Static parameters for this node instance, passed from the blueprint.\n\t * @param nodeId The ID of the node in the blueprint.\n\t */\n\tconstructor(\n\t\tprotected params?: Record<string, any>,\n\t\tprotected nodeId?: string,\n\t) {}\n\n\t/**\n\t * Phase 1: Gathers and prepares data for execution. This phase is NOT retried on failure.\n\t * @param context The node's execution context.\n\t * @returns The data needed for the `exec` phase.\n\t */\n\tasync prep(context: NodeContext<TContext, TDependencies, TInput>): Promise<any> {\n\t\treturn context.input\n\t}\n\n\t/**\n\t * Phase 2: Performs the core, isolated logic. This is the ONLY phase that is retried.\n\t * @param prepResult The data returned from the `prep` phase.\n\t * @param context The node's execution context.\n\t */\n\tabstract exec(\n\t\tprepResult: any,\n\t\tcontext: NodeContext<TContext, TDependencies, TInput>,\n\t): Promise<Omit<NodeResult<TOutput, TAction>, 'error'>>\n\n\t/**\n\t * Phase 3: Processes the result and saves state. This phase is NOT retried.\n\t * @param execResult The successful result from the `exec` or `fallback` phase.\n\t * @param _context The node's execution context.\n\t */\n\tasync post(\n\t\texecResult: Omit<NodeResult<TOutput, TAction>, 'error'>,\n\t\t_context: NodeContext<TContext, TDependencies, TInput>,\n\t): Promise<NodeResult<TOutput, TAction>> {\n\t\treturn execResult\n\t}\n\n\t/**\n\t * An optional safety net that runs if all `exec` retries fail.\n\t * @param error The final error from the last `exec` attempt.\n\t * @param _context The node's execution context.\n\t */\n\tasync fallback(\n\t\terror: Error,\n\t\t_context: NodeContext<TContext, TDependencies, TInput>,\n\t): Promise<Omit<NodeResult<TOutput, TAction>, 'error'>> {\n\t\t// By default, re-throw the error, failing the node.\n\t\tthrow error\n\t}\n\n\t/**\n\t * An optional cleanup phase for non-retriable errors that occur outside the main `exec` method.\n\t * This method is invoked in a `finally` block or equivalent construct if a fatal, unhandled exception occurs in the `prep`, `exec`, or `post` phases.\n\t * Allows nodes to perform crucial cleanup, such as closing database connections or releasing locks.\n\t * @param _error The error that caused the failure.\n\t * @param _context The node's execution context.\n\t */\n\tasync recover(_error: Error, _context: NodeContext<TContext, TDependencies, TInput>): Promise<void> {\n\t\t// Default no-op implementation. Subclasses can override for cleanup.\n\t}\n}\n"]}
@@ -1,107 +0,0 @@
1
- import { FlowcraftError } from './chunk-BCRWXTWX.js';
2
-
3
- // src/runtime/orchestrators/utils.ts
4
- async function executeBatch(readyNodes, blueprint, state, executorFactory, runtime, maxConcurrency) {
5
- const concurrency = maxConcurrency || readyNodes.length;
6
- const results = [];
7
- for (let i = 0; i < readyNodes.length; i += concurrency) {
8
- const batch = readyNodes.slice(i, i + concurrency);
9
- const batchPromises = batch.map(async ({ nodeId }) => {
10
- try {
11
- const executor = executorFactory(nodeId);
12
- if (!executor) throw new Error(`No executor for node ${nodeId}`);
13
- const executionResult = await executor.execute(
14
- await runtime.resolveNodeInput(nodeId, blueprint, state.getContext())
15
- );
16
- results.push({
17
- status: "fulfilled",
18
- value: { nodeId, executionResult }
19
- });
20
- } catch (error) {
21
- results.push({
22
- status: "rejected",
23
- reason: { nodeId, error }
24
- });
25
- }
26
- });
27
- await Promise.all(batchPromises);
28
- }
29
- return results;
30
- }
31
- async function processResults(settledResults, traverser, state, runtime, _blueprint, executionId) {
32
- for (const promiseResult of settledResults) {
33
- if (promiseResult.status === "rejected") {
34
- const { nodeId: nodeId2, error } = promiseResult.reason;
35
- if (error instanceof FlowcraftError && error.message.includes("cancelled")) {
36
- throw error;
37
- }
38
- state.addError(nodeId2, error);
39
- continue;
40
- }
41
- const { nodeId, executionResult } = promiseResult.value;
42
- if (executionResult.status === "success") {
43
- const result = executionResult.result;
44
- if (result) {
45
- state.addCompletedNode(nodeId, result.output);
46
- if (result._fallbackExecuted) {
47
- state.markFallbackExecuted();
48
- }
49
- if (result.dynamicNodes && result.dynamicNodes.length > 0) {
50
- const gatherNodeId = result.output?.gatherNodeId;
51
- for (const dynamicNode of result.dynamicNodes) {
52
- traverser.addDynamicNode(dynamicNode.id, dynamicNode, nodeId, gatherNodeId);
53
- }
54
- }
55
- }
56
- const matched = await runtime.determineNextNodes(
57
- traverser.getDynamicBlueprint(),
58
- nodeId,
59
- result,
60
- state.getContext(),
61
- executionId
62
- );
63
- const loopControllerMatch = matched.find(
64
- (m) => m.node.uses === "loop-controller"
65
- );
66
- const finalMatched = loopControllerMatch ? [loopControllerMatch] : matched;
67
- for (const { node, edge } of finalMatched) {
68
- await runtime.applyEdgeTransform(
69
- edge,
70
- result,
71
- node,
72
- state.getContext(),
73
- traverser.getAllPredecessors(),
74
- executionId
75
- );
76
- }
77
- traverser.markNodeCompleted(
78
- nodeId,
79
- result,
80
- finalMatched.map((m) => m.node)
81
- );
82
- } else if (executionResult.status === "failed_with_fallback") {
83
- const { fallbackNodeId, error } = executionResult;
84
- const blueprint = traverser.getDynamicBlueprint();
85
- const fallbackNodeDef = blueprint.nodes.find((n) => n.id === fallbackNodeId);
86
- if (!fallbackNodeDef) {
87
- const notFoundError = new FlowcraftError(`Fallback node '${fallbackNodeId}' not found in blueprint.`, {
88
- nodeId,
89
- cause: error
90
- });
91
- state.addError(nodeId, notFoundError);
92
- } else {
93
- state.addCompletedNode(nodeId, null);
94
- state.markFallbackExecuted();
95
- traverser.markNodeCompleted(nodeId, { action: "fallback", output: null, _fallbackExecuted: true }, [
96
- fallbackNodeDef
97
- ]);
98
- }
99
- } else {
100
- state.addError(nodeId, executionResult.error);
101
- }
102
- }
103
- }
104
-
105
- export { executeBatch, processResults };
106
- //# sourceMappingURL=chunk-N63S5NEG.js.map
107
- //# sourceMappingURL=chunk-N63S5NEG.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/orchestrators/utils.ts"],"names":["nodeId"],"mappings":"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","file":"chunk-N63S5NEG.js","sourcesContent":["import { FlowcraftError } from '../../errors'\nimport type { NodeDefinition, WorkflowBlueprint } from '../../types'\nimport type { NodeExecutionResult } from '../executors'\nimport type { WorkflowState } from '../state'\nimport type { GraphTraverser } from '../traverser'\n\nexport async function executeBatch(\n\treadyNodes: Array<{ nodeId: string; nodeDef: any }>,\n\tblueprint: WorkflowBlueprint,\n\tstate: WorkflowState<any>,\n\texecutorFactory: (nodeId: string) => any,\n\truntime: any,\n\tmaxConcurrency?: number,\n): Promise<\n\tArray<\n\t\t| { status: 'fulfilled'; value: { nodeId: string; executionResult: NodeExecutionResult } }\n\t\t| { status: 'rejected'; reason: { nodeId: string; error: unknown } }\n\t>\n> {\n\tconst concurrency = maxConcurrency || readyNodes.length\n\tconst results: Array<\n\t\t| { status: 'fulfilled'; value: { nodeId: string; executionResult: NodeExecutionResult } }\n\t\t| { status: 'rejected'; reason: { nodeId: string; error: unknown } }\n\t> = []\n\n\tfor (let i = 0; i < readyNodes.length; i += concurrency) {\n\t\tconst batch = readyNodes.slice(i, i + concurrency)\n\t\tconst batchPromises = batch.map(async ({ nodeId }) => {\n\t\t\ttry {\n\t\t\t\tconst executor = executorFactory(nodeId)\n\t\t\t\tif (!executor) throw new Error(`No executor for node ${nodeId}`)\n\t\t\t\tconst executionResult = await executor.execute(\n\t\t\t\t\tawait runtime.resolveNodeInput(nodeId, blueprint, state.getContext()),\n\t\t\t\t)\n\t\t\t\tresults.push({\n\t\t\t\t\tstatus: 'fulfilled' as const,\n\t\t\t\t\tvalue: { nodeId, executionResult },\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tresults.push({\n\t\t\t\t\tstatus: 'rejected' as const,\n\t\t\t\t\treason: { nodeId, error },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\tawait Promise.all(batchPromises)\n\t}\n\n\treturn results\n}\n\nexport async function processResults(\n\tsettledResults: Array<\n\t\t| { status: 'fulfilled'; value: { nodeId: string; executionResult: NodeExecutionResult } }\n\t\t| { status: 'rejected'; reason: { nodeId: string; error: unknown } }\n\t>,\n\ttraverser: GraphTraverser,\n\tstate: WorkflowState<any>,\n\truntime: any,\n\t_blueprint: WorkflowBlueprint,\n\texecutionId?: string,\n): Promise<void> {\n\tfor (const promiseResult of settledResults) {\n\t\tif (promiseResult.status === 'rejected') {\n\t\t\tconst { nodeId, error } = promiseResult.reason\n\t\t\tif (error instanceof FlowcraftError && error.message.includes('cancelled')) {\n\t\t\t\tthrow error\n\t\t\t}\n\t\t\tstate.addError(nodeId, error as Error)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst { nodeId, executionResult } = promiseResult.value\n\n\t\tif (executionResult.status === 'success') {\n\t\t\tconst result = executionResult.result\n\t\t\tif (result) {\n\t\t\t\tstate.addCompletedNode(nodeId, result.output)\n\t\t\t\tif (result._fallbackExecuted) {\n\t\t\t\t\tstate.markFallbackExecuted()\n\t\t\t\t}\n\n\t\t\t\tif (result.dynamicNodes && result.dynamicNodes.length > 0) {\n\t\t\t\t\tconst gatherNodeId = result.output?.gatherNodeId\n\t\t\t\t\tfor (const dynamicNode of result.dynamicNodes) {\n\t\t\t\t\t\ttraverser.addDynamicNode(dynamicNode.id, dynamicNode, nodeId, gatherNodeId)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst matched = await runtime.determineNextNodes(\n\t\t\t\ttraverser.getDynamicBlueprint(),\n\t\t\t\tnodeId,\n\t\t\t\tresult,\n\t\t\t\tstate.getContext(),\n\t\t\t\texecutionId,\n\t\t\t)\n\n\t\t\tconst loopControllerMatch = matched.find(\n\t\t\t\t(m: { node: NodeDefinition; edge: any }) => m.node.uses === 'loop-controller',\n\t\t\t)\n\t\t\tconst finalMatched = loopControllerMatch ? [loopControllerMatch] : matched\n\n\t\t\tfor (const { node, edge } of finalMatched) {\n\t\t\t\tawait runtime.applyEdgeTransform(\n\t\t\t\t\tedge,\n\t\t\t\t\tresult,\n\t\t\t\t\tnode,\n\t\t\t\t\tstate.getContext(),\n\t\t\t\t\ttraverser.getAllPredecessors(),\n\t\t\t\t\texecutionId,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\ttraverser.markNodeCompleted(\n\t\t\t\tnodeId,\n\t\t\t\tresult,\n\t\t\t\tfinalMatched.map((m: { node: NodeDefinition; edge: any }) => m.node),\n\t\t\t)\n\t\t} else if (executionResult.status === 'failed_with_fallback') {\n\t\t\tconst { fallbackNodeId, error } = executionResult\n\t\t\tconst blueprint = traverser.getDynamicBlueprint()\n\t\t\tconst fallbackNodeDef = blueprint.nodes.find((n) => n.id === fallbackNodeId)\n\n\t\t\tif (!fallbackNodeDef) {\n\t\t\t\tconst notFoundError = new FlowcraftError(`Fallback node '${fallbackNodeId}' not found in blueprint.`, {\n\t\t\t\t\tnodeId,\n\t\t\t\t\tcause: error,\n\t\t\t\t})\n\t\t\t\tstate.addError(nodeId, notFoundError)\n\t\t\t} else {\n\t\t\t\tstate.addCompletedNode(nodeId, null)\n\t\t\t\tstate.markFallbackExecuted()\n\n\t\t\t\ttraverser.markNodeCompleted(nodeId, { action: 'fallback', output: null, _fallbackExecuted: true }, [\n\t\t\t\t\tfallbackNodeDef,\n\t\t\t\t])\n\t\t\t}\n\t\t} else {\n\t\t\tstate.addError(nodeId, executionResult.error)\n\t\t}\n\t}\n}\n"]}
@@ -1,3 +0,0 @@
1
-
2
- //# sourceMappingURL=chunk-NVLZFLYM.js.map
3
- //# sourceMappingURL=chunk-NVLZFLYM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-NVLZFLYM.js"}