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 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/node-executor-factory.ts"],"names":[],"mappings":";;;;;AAOO,IAAM,sBAAN,MAA0B;AAAA,EAChC,YAA6B,QAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAAsB;AAAA,EAE5C,qBAAA,CAAsB,QAAgB,OAAA,EAA6D;AACzG,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AACnE,IAAA,IAAI,CAAC,OAAA,EAAS;AACb,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,MAAA,EAAS,MAAM,CAAA,yBAAA,CAAA,EAA6B;AAAA,QACpE,MAAA;AAAA,QACA,WAAA,EAAa,QAAQ,SAAA,CAAU,EAAA;AAAA,QAC/B,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,OAAA,EAAS;AAAA,OACT,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,QAAQ,YAAY,CAAA;AAExE,IAAA,OAAO,IAAI,YAAA,CAAa,EAAE,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AAAA,EACvD;AAAA,EAEQ,oBAAA,CACP,SACA,YAAA,EACoB;AACpB,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AACpD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACpB,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,oBAAA,EAAuB,OAAA,CAAQ,IAAI,CAAA,YAAA,CAAA,EAAgB;AAAA,QAC3E,QAAQ,OAAA,CAAQ,EAAA;AAAA,QAChB,WAAA,EAAa,EAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACT,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,EAAQ,UAAA,IAAc,CAAA;AACjD,IAAA,OAAO,WAAA,CAAY,cAAc,CAAA,GAC9B,IAAI,kBAAkB,cAAA,EAAgB,UAAA,EAAY,IAAA,CAAK,QAAQ,IAC/D,IAAI,oBAAA,CAAqB,cAAA,EAAgB,UAAA,EAAY,KAAK,QAAQ,CAAA;AAAA,EACtE;AACD","file":"chunk-DL7KVYZF.js","sourcesContent":["import { FlowcraftError } from '../errors'\nimport { isNodeClass } from '../node'\nimport type { IEventBus, NodeClass, NodeDefinition, NodeFunction } from '../types'\nimport type { ExecutionContext } from './execution-context'\nimport type { ExecutionStrategy } from './executors'\nimport { ClassNodeExecutor, FunctionNodeExecutor, NodeExecutor } from './executors'\n\nexport class NodeExecutorFactory {\n\tconstructor(private readonly eventBus: IEventBus) {}\n\n\tpublic createExecutorForNode(nodeId: string, context: ExecutionContext<any, any>): NodeExecutor<any, any> {\n\t\tconst nodeDef = context.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: context.blueprint.id,\n\t\t\t\texecutionId: context.executionId,\n\t\t\t\tisFatal: false,\n\t\t\t})\n\t\t}\n\n\t\tconst strategy = this.getExecutionStrategy(nodeDef, context.nodeRegistry)\n\n\t\treturn new NodeExecutor({ context, nodeDef, strategy })\n\t}\n\n\tprivate getExecutionStrategy(\n\t\tnodeDef: NodeDefinition,\n\t\tnodeRegistry: Map<string, NodeFunction | NodeClass>,\n\t): ExecutionStrategy {\n\t\tconst implementation = nodeRegistry.get(nodeDef.uses)\n\t\tif (!implementation) {\n\t\t\tthrow new FlowcraftError(`Implementation for '${nodeDef.uses}' not found.`, {\n\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\tblueprintId: '',\n\t\t\t\tisFatal: true,\n\t\t\t})\n\t\t}\n\n\t\tconst maxRetries = nodeDef.config?.maxRetries ?? 1\n\t\treturn isNodeClass(implementation)\n\t\t\t? new ClassNodeExecutor(implementation, maxRetries, this.eventBus)\n\t\t\t: new FunctionNodeExecutor(implementation, maxRetries, this.eventBus)\n\t}\n}\n"]}
@@ -1,25 +0,0 @@
1
- import { DefaultOrchestrator } from './chunk-QA2WDZPV.js';
2
- import { NullLogger } from './chunk-4PELJWF7.js';
3
- import { JsonSerializer } from './chunk-6RKHCJUU.js';
4
- import { DIContainer, ServiceTokens } from './chunk-OOJEXFYY.js';
5
- import { PropertyEvaluator } from './chunk-PH2IYZHV.js';
6
-
7
- // src/container-factory.ts
8
- function createDefaultContainer(options = {}) {
9
- const container = new DIContainer();
10
- container.register(ServiceTokens.Logger, options.logger || new NullLogger());
11
- container.register(ServiceTokens.Serializer, options.serializer || new JsonSerializer());
12
- container.register(ServiceTokens.Evaluator, options.evaluator || new PropertyEvaluator());
13
- container.register(ServiceTokens.EventBus, options.eventBus || { emit: async () => {
14
- } });
15
- container.register(ServiceTokens.Middleware, options.middleware || []);
16
- container.register(ServiceTokens.NodeRegistry, options.registry || {});
17
- container.register(ServiceTokens.BlueprintRegistry, options.blueprints || {});
18
- container.register(ServiceTokens.Dependencies, options.dependencies || {});
19
- container.registerFactory(ServiceTokens.Orchestrator, () => new DefaultOrchestrator());
20
- return container;
21
- }
22
-
23
- export { createDefaultContainer };
24
- //# sourceMappingURL=chunk-E6ICIXVR.js.map
25
- //# sourceMappingURL=chunk-E6ICIXVR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/container-factory.ts"],"names":[],"mappings":";;;;;;;AA4BO,SAAS,sBAAA,CACf,OAAA,GAA2C,EAAC,EAC9B;AACd,EAAA,MAAM,SAAA,GAAY,IAAI,WAAA,EAAY;AAElC,EAAA,SAAA,CAAU,SAAS,aAAA,CAAc,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAI,YAAY,CAAA;AAC3E,EAAA,SAAA,CAAU,SAAS,aAAA,CAAc,UAAA,EAAY,QAAQ,UAAA,IAAc,IAAI,gBAAgB,CAAA;AACvF,EAAA,SAAA,CAAU,SAAS,aAAA,CAAc,SAAA,EAAW,QAAQ,SAAA,IAAa,IAAI,mBAAmB,CAAA;AACxF,EAAA,SAAA,CAAU,SAAS,aAAA,CAAc,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAE,MAAM,YAAY;AAAA,EAAC,GAAG,CAAA;AACvF,EAAA,SAAA,CAAU,SAAS,aAAA,CAAc,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,EAAE,CAAA;AACrE,EAAA,SAAA,CAAU,SAAS,aAAA,CAAc,YAAA,EAAc,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA;AACrE,EAAA,SAAA,CAAU,SAAS,aAAA,CAAc,iBAAA,EAAmB,OAAA,CAAQ,UAAA,IAAc,EAAE,CAAA;AAC5E,EAAA,SAAA,CAAU,SAAS,aAAA,CAAc,YAAA,EAAc,OAAA,CAAQ,YAAA,IAAiB,EAAoB,CAAA;AAE5F,EAAA,SAAA,CAAU,gBAAgB,aAAA,CAAc,YAAA,EAAc,MAAM,IAAI,qBAAqB,CAAA;AAErF,EAAA,OAAO,SAAA;AACR","file":"chunk-E6ICIXVR.js","sourcesContent":["import { DIContainer, ServiceTokens } from './container'\nimport { PropertyEvaluator } from './evaluator'\nimport { NullLogger } from './logger'\nimport { DefaultOrchestrator } from './runtime/orchestrator'\nimport { JsonSerializer } from './serializer'\nimport type {\n\tIEvaluator,\n\tIEventBus,\n\tILogger,\n\tISerializer,\n\tMiddleware,\n\tNodeClass,\n\tNodeFunction,\n\tRuntimeDependencies,\n\tWorkflowBlueprint,\n} from './types'\n\nexport interface ContainerOptions<TDependencies extends RuntimeDependencies = RuntimeDependencies> {\n\tlogger?: ILogger\n\tserializer?: ISerializer\n\tevaluator?: IEvaluator\n\teventBus?: IEventBus\n\tmiddleware?: Middleware[]\n\tregistry?: Record<string, NodeFunction | NodeClass>\n\tblueprints?: Record<string, WorkflowBlueprint>\n\tdependencies?: TDependencies\n}\n\nexport function createDefaultContainer<TDependencies extends RuntimeDependencies = RuntimeDependencies>(\n\toptions: ContainerOptions<TDependencies> = {},\n): DIContainer {\n\tconst container = new DIContainer()\n\n\tcontainer.register(ServiceTokens.Logger, options.logger || new NullLogger())\n\tcontainer.register(ServiceTokens.Serializer, options.serializer || new JsonSerializer())\n\tcontainer.register(ServiceTokens.Evaluator, options.evaluator || new PropertyEvaluator())\n\tcontainer.register(ServiceTokens.EventBus, options.eventBus || { emit: async () => {} })\n\tcontainer.register(ServiceTokens.Middleware, options.middleware || [])\n\tcontainer.register(ServiceTokens.NodeRegistry, options.registry || {})\n\tcontainer.register(ServiceTokens.BlueprintRegistry, options.blueprints || {})\n\tcontainer.register(ServiceTokens.Dependencies, options.dependencies || ({} as TDependencies))\n\n\tcontainer.registerFactory(ServiceTokens.Orchestrator, () => new DefaultOrchestrator())\n\n\treturn container\n}\n"]}
@@ -1,3 +0,0 @@
1
-
2
- //# sourceMappingURL=chunk-HFJXYY4E.js.map
3
- //# sourceMappingURL=chunk-HFJXYY4E.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-HFJXYY4E.js"}
@@ -1,52 +0,0 @@
1
- import { BaseNode } from './chunk-LNK7LZER.js';
2
-
3
- // src/nodes/sleep.ts
4
- var SleepNode = class extends BaseNode {
5
- async exec(_prepResult, context) {
6
- const durationParam = this.params?.duration;
7
- let durationMs;
8
- if (typeof durationParam === "string") {
9
- const match = durationParam.match(/^(\d+)([smhd])$/);
10
- if (!match) {
11
- throw new Error(
12
- `SleepNode '${this.nodeId}' received an invalid duration string: '${durationParam}'. Expected format: '5m', '10s', '1h', '2d'`
13
- );
14
- }
15
- const [, numStr, unit] = match;
16
- const num = parseInt(numStr, 10);
17
- switch (unit) {
18
- case "s":
19
- durationMs = num * 1e3;
20
- break;
21
- case "m":
22
- durationMs = num * 60 * 1e3;
23
- break;
24
- case "h":
25
- durationMs = num * 60 * 60 * 1e3;
26
- break;
27
- case "d":
28
- durationMs = num * 24 * 60 * 60 * 1e3;
29
- break;
30
- default:
31
- throw new Error(`Invalid duration unit: ${unit}`);
32
- }
33
- } else if (typeof durationParam === "number") {
34
- durationMs = durationParam;
35
- } else {
36
- throw new Error(`SleepNode '${this.nodeId}' received an invalid duration type: ${typeof durationParam}`);
37
- }
38
- if (durationMs < 0) {
39
- throw new Error(`SleepNode '${this.nodeId}' received a negative duration.`);
40
- }
41
- const wakeUpAt = new Date(Date.now() + durationMs).toISOString();
42
- await context.dependencies.workflowState.markAsAwaiting(this.nodeId ?? "", {
43
- reason: "timer",
44
- wakeUpAt
45
- });
46
- return { output: void 0 };
47
- }
48
- };
49
-
50
- export { SleepNode };
51
- //# sourceMappingURL=chunk-HNHM3FDK.js.map
52
- //# sourceMappingURL=chunk-HNHM3FDK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/nodes/sleep.ts"],"names":[],"mappings":";;;AAGO,IAAM,SAAA,GAAN,cAAwB,QAAA,CAAS;AAAA,EACvC,MAAM,IAAA,CACL,WAAA,EACA,OAAA,EACqC;AACrC,IAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,EAAQ,QAAA;AAEnC,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,OAAO,kBAAkB,QAAA,EAAU;AACtC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,iBAAiB,CAAA;AACnD,MAAA,IAAI,CAAC,KAAA,EAAO;AACX,QAAA,MAAM,IAAI,KAAA;AAAA,UACT,CAAA,WAAA,EAAc,IAAA,CAAK,MAAM,CAAA,wCAAA,EAA2C,aAAa,CAAA,2CAAA;AAAA,SAClF;AAAA,MACD;AACA,MAAA,MAAM,GAAG,MAAA,EAAQ,IAAI,CAAA,GAAI,KAAA;AACzB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAC/B,MAAA,QAAQ,IAAA;AAAM,QACb,KAAK,GAAA;AACJ,UAAA,UAAA,GAAa,GAAA,GAAM,GAAA;AACnB,UAAA;AAAA,QACD,KAAK,GAAA;AACJ,UAAA,UAAA,GAAa,MAAM,EAAA,GAAK,GAAA;AACxB,UAAA;AAAA,QACD,KAAK,GAAA;AACJ,UAAA,UAAA,GAAa,GAAA,GAAM,KAAK,EAAA,GAAK,GAAA;AAC7B,UAAA;AAAA,QACD,KAAK,GAAA;AACJ,UAAA,UAAA,GAAa,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAClC,UAAA;AAAA,QACD;AACC,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAAA;AAClD,IACD,CAAA,MAAA,IAAW,OAAO,aAAA,KAAkB,QAAA,EAAU;AAC7C,MAAA,UAAA,GAAa,aAAA;AAAA,IACd,CAAA,MAAO;AACN,MAAA,MAAM,IAAI,MAAM,CAAA,WAAA,EAAc,IAAA,CAAK,MAAM,CAAA,qCAAA,EAAwC,OAAO,aAAa,CAAA,CAAE,CAAA;AAAA,IACxG;AAEA,IAAA,IAAI,aAAa,CAAA,EAAG;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,IAAA,CAAK,MAAM,CAAA,+BAAA,CAAiC,CAAA;AAAA,IAC3E;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,GAAI,UAAU,EAAE,WAAA,EAAY;AAE/D,IAAA,MAAM,QAAQ,YAAA,CAAa,aAAA,CAAc,cAAA,CAAe,IAAA,CAAK,UAAU,EAAA,EAAI;AAAA,MAC1E,MAAA,EAAQ,OAAA;AAAA,MACR;AAAA,KACA,CAAA;AAED,IAAA,OAAO,EAAE,QAAQ,MAAA,EAAU;AAAA,EAC5B;AACD","file":"chunk-HNHM3FDK.js","sourcesContent":["import { BaseNode } from '../node'\nimport type { NodeContext, NodeResult } from '../types'\n\nexport class SleepNode extends BaseNode {\n\tasync exec(\n\t\t_prepResult: any,\n\t\tcontext: NodeContext<Record<string, any>, any, any>,\n\t): Promise<Omit<NodeResult, 'error'>> {\n\t\tconst durationParam = this.params?.duration as string | number\n\n\t\tlet durationMs: number\n\t\tif (typeof durationParam === 'string') {\n\t\t\tconst match = durationParam.match(/^(\\d+)([smhd])$/)\n\t\t\tif (!match) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`SleepNode '${this.nodeId}' received an invalid duration string: '${durationParam}'. Expected format: '5m', '10s', '1h', '2d'`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst [, numStr, unit] = match\n\t\t\tconst num = parseInt(numStr, 10)\n\t\t\tswitch (unit) {\n\t\t\t\tcase 's':\n\t\t\t\t\tdurationMs = num * 1000\n\t\t\t\t\tbreak\n\t\t\t\tcase 'm':\n\t\t\t\t\tdurationMs = num * 60 * 1000\n\t\t\t\t\tbreak\n\t\t\t\tcase 'h':\n\t\t\t\t\tdurationMs = num * 60 * 60 * 1000\n\t\t\t\t\tbreak\n\t\t\t\tcase 'd':\n\t\t\t\t\tdurationMs = num * 24 * 60 * 60 * 1000\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Invalid duration unit: ${unit}`)\n\t\t\t}\n\t\t} else if (typeof durationParam === 'number') {\n\t\t\tdurationMs = durationParam\n\t\t} else {\n\t\t\tthrow new Error(`SleepNode '${this.nodeId}' received an invalid duration type: ${typeof durationParam}`)\n\t\t}\n\n\t\tif (durationMs < 0) {\n\t\t\tthrow new Error(`SleepNode '${this.nodeId}' received a negative duration.`)\n\t\t}\n\n\t\tconst wakeUpAt = new Date(Date.now() + durationMs).toISOString()\n\n\t\tawait context.dependencies.workflowState.markAsAwaiting(this.nodeId ?? '', {\n\t\t\treason: 'timer',\n\t\t\twakeUpAt,\n\t\t})\n\n\t\treturn { output: undefined }\n\t}\n}\n"]}
@@ -1,26 +0,0 @@
1
- import { BaseNode } from './chunk-LNK7LZER.js';
2
-
3
- // src/nodes/webhook.ts
4
- var WebhookNode = class extends BaseNode {
5
- async prep(context) {
6
- const runId = context.dependencies.runtime.executionId;
7
- const nodeId = this.nodeId ?? "";
8
- const adapter = context.dependencies.adapter;
9
- const { url, event } = await adapter.registerWebhookEndpoint(runId, nodeId);
10
- return { url, event };
11
- }
12
- async exec(prepResult, _context) {
13
- const webhook = {
14
- url: prepResult.url,
15
- event: prepResult.event,
16
- request: new Promise(() => {
17
- })
18
- // will be resolved by the wait node
19
- };
20
- return { output: webhook };
21
- }
22
- };
23
-
24
- export { WebhookNode };
25
- //# sourceMappingURL=chunk-I53JB2KW.js.map
26
- //# sourceMappingURL=chunk-I53JB2KW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/nodes/webhook.ts"],"names":[],"mappings":";;;AAIO,IAAM,WAAA,GAAN,cAA0B,QAAA,CAAS;AAAA,EACzC,MAAM,KAAK,OAAA,EAAmE;AAC7E,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,WAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,EAAA;AAC9B,IAAA,MAAM,OAAA,GAAW,QAAQ,YAAA,CAAqB,OAAA;AAC9C,IAAA,MAAM,EAAE,KAAK,KAAA,EAAM,GAAI,MAAM,OAAA,CAAQ,uBAAA,CAAwB,OAAO,MAAM,CAAA;AAC1E,IAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,MAAM,IAAA,CACL,UAAA,EACA,QAAA,EACqC;AACrC,IAAA,MAAM,OAAA,GAAmB;AAAA,MACxB,KAAK,UAAA,CAAW,GAAA;AAAA,MAChB,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,OAAA,EAAS,IAAI,OAAA,CAAQ,MAAM;AAAA,MAAC,CAAC;AAAA;AAAA,KAC9B;AAEA,IAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAAA,EAC1B;AACD","file":"chunk-I53JB2KW.js","sourcesContent":["import { BaseNode } from '../node'\nimport type { Webhook } from '../sdk'\nimport type { NodeContext, NodeResult } from '../types'\n\nexport class WebhookNode extends BaseNode {\n\tasync prep(context: NodeContext<Record<string, any>, any, any>): Promise<any> {\n\t\tconst runId = context.dependencies.runtime.executionId\n\t\tconst nodeId = this.nodeId ?? ''\n\t\tconst adapter = (context.dependencies as any).adapter\n\t\tconst { url, event } = await adapter.registerWebhookEndpoint(runId, nodeId)\n\t\treturn { url, event }\n\t}\n\n\tasync exec(\n\t\tprepResult: { url: string; event: string },\n\t\t_context: NodeContext<Record<string, any>, any, any>,\n\t): Promise<Omit<NodeResult, 'error'>> {\n\t\tconst webhook: Webhook = {\n\t\t\turl: prepResult.url,\n\t\t\tevent: prepResult.event,\n\t\t\trequest: new Promise(() => {}), // will be resolved by the wait node\n\t\t}\n\n\t\treturn { output: webhook }\n\t}\n}\n"]}
@@ -1,16 +0,0 @@
1
- import { BaseNode } from './chunk-LNK7LZER.js';
2
-
3
- // src/nodes/wait.ts
4
- var WaitNode = class extends BaseNode {
5
- async exec(_prepResult, context) {
6
- await context.dependencies.workflowState.markAsAwaiting(this.nodeId ?? "", {
7
- reason: "external_event"
8
- // params: this.params // NOTE: can add more details if needed in the future
9
- });
10
- return { output: void 0 };
11
- }
12
- };
13
-
14
- export { WaitNode };
15
- //# sourceMappingURL=chunk-IDTYHLDQ.js.map
16
- //# sourceMappingURL=chunk-IDTYHLDQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/nodes/wait.ts"],"names":[],"mappings":";;;AAGO,IAAM,QAAA,GAAN,cAAuB,QAAA,CAAS;AAAA,EACtC,MAAM,IAAA,CACL,WAAA,EACA,OAAA,EACqC;AACrC,IAAA,MAAM,QAAQ,YAAA,CAAa,aAAA,CAAc,cAAA,CAAe,IAAA,CAAK,UAAU,EAAA,EAAI;AAAA,MAC1E,MAAA,EAAQ;AAAA;AAAA,KAER,CAAA;AACD,IAAA,OAAO,EAAE,QAAQ,MAAA,EAAU;AAAA,EAC5B;AACD","file":"chunk-IDTYHLDQ.js","sourcesContent":["import { BaseNode } from '../node'\nimport type { NodeContext, NodeResult } from '../types'\n\nexport class WaitNode extends BaseNode {\n\tasync exec(\n\t\t_prepResult: any,\n\t\tcontext: NodeContext<Record<string, any>, any, any>,\n\t): Promise<Omit<NodeResult, 'error'>> {\n\t\tawait context.dependencies.workflowState.markAsAwaiting(this.nodeId ?? '', {\n\t\t\treason: 'external_event',\n\t\t\t// params: this.params // NOTE: can add more details if needed in the future\n\t\t})\n\t\treturn { output: undefined }\n\t}\n}\n"]}
@@ -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":";;;AA+BO,SAAS,aAAA,CACf,SAAA,EACA,QAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACxD,EAAA,MAAM,YAAA,GAAe,QAAA,YAAoB,GAAA,GAAM,IAAI,IAAI,QAAA,CAAS,IAAA,EAAM,CAAA,GAAI,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAGvG,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,KAAA,EAAO;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,KAAK,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,IAAK,CAAC,aAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACtG,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EAAS,CAAA,yBAAA,EAA4B,IAAA,CAAK,IAAI,CAAA,wCAAA,CAAA;AAAA,QAC9C,QAAQ,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACF;AAAA,EACD;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,KAAA,EAAO;AACnC,IAAA,IAAI,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,IAAA,CAAK,QAAQ,aAAA,EAAe;AACjE,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,EAAG;AACjD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,0BAAA;AAAA,UACN,SAAS,CAAA,YAAA,EAAe,IAAA,CAAK,EAAE,CAAA,4BAAA,EAA+B,IAAA,CAAK,OAAO,aAAa,CAAA,qCAAA,CAAA;AAAA,UACvF,QAAQ,IAAA,CAAK;AAAA,SACb,CAAA;AAAA,MACF;AAAA,IACD;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,QAAQ,WAAA,EAAa;AACxD,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,WAAW,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AACxD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,8BAAA;AAAA,UACN,SAAS,CAAA,cAAA,EAAiB,IAAA,CAAK,EAAE,CAAA,0BAAA,EAA6B,IAAA,CAAK,OAAO,WAAW,CAAA,gDAAA,CAAA;AAAA,UACrF,QAAQ,IAAA,CAAK;AAAA,SACb,CAAA;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,KAAA,IAAS,EAAC,EAAG;AACzC,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,CAAA,aAAA,EAAgB,IAAA,CAAK,MAAM,CAAA,yCAAA,CAAA;AAAA,QACpC,WAAW,IAAA,CAAK;AAAA,OAChB,CAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,CAAA,aAAA,EAAgB,IAAA,CAAK,MAAM,CAAA,yCAAA,CAAA;AAAA,QACpC,WAAW,IAAA,CAAK;AAAA,OAChB,CAAA;AAAA,IACF;AAAA,EACD;AAGA,EAAA,IAAI,SAAA,CAAU,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,QAAA,GAAW,iBAAiB,SAAS,CAAA;AAC3C,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,QAAA,CAAS,YAAY,CAAA;AAC9C,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,IAAA,OAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AAC/B,MAAA,MAAM,SAAA,GAAY,aAAa,GAAA,EAAI;AACnC,MAAA,IAAI,CAAC,SAAA,IAAa,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AAE1C,MAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,MAAA,cAAA,CAAe,IAAI,SAAS,CAAA;AAE5B,MAAA,KAAA,MAAW,CAAA,IAAK,UAAU,KAAA,CAAM,MAAA,CAAO,CAACA,EAAAA,KAAMA,EAAAA,CAAE,MAAA,KAAW,SAAS,CAAA,EAAG;AACtE,QAAA,YAAA,CAAa,IAAA,CAAK,EAAE,MAAM,CAAA;AAAA,MAC3B;AAAA,IACD;AAEA,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC7B,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,EAAG;AAChC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,aAAA;AAAA,UACN,OAAA,EAAS,SAAS,MAAM,CAAA,uCAAA,CAAA;AAAA,UACxB;AAAA,SACA,CAAA;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAEA,EAAA,OAAO;AAAA,IACN,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B;AAAA,GACD;AACD","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,25 +0,0 @@
1
- import { InMemoryEventLogger } from './chunk-7EBKWATZ.js';
2
- import { FlowRuntime } from './chunk-CIXL7AKH.js';
3
-
4
- // src/testing/run-with-trace.ts
5
- async function runWithTrace(runtime, blueprint, initialState = {}, options = {}) {
6
- const eventLogger = new InMemoryEventLogger();
7
- const testRuntime = new FlowRuntime({
8
- ...runtime.options,
9
- eventBus: eventLogger
10
- });
11
- try {
12
- const result = await testRuntime.run(blueprint, initialState, options);
13
- if (process.env.DEBUG) {
14
- eventLogger.printLog(`Successful Trace: ${blueprint.id}`);
15
- }
16
- return result;
17
- } catch (error) {
18
- eventLogger.printLog(`Failing Test Trace: ${blueprint.id}`);
19
- throw error;
20
- }
21
- }
22
-
23
- export { runWithTrace };
24
- //# sourceMappingURL=chunk-K446NZ4E.js.map
25
- //# sourceMappingURL=chunk-K446NZ4E.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/testing/run-with-trace.ts"],"names":[],"mappings":";;;;AA+BA,eAAsB,YAAA,CACrB,SACA,SAAA,EACA,YAAA,GAA2C,EAAC,EAC5C,OAAA,GAII,EAAC,EACJ;AACD,EAAA,MAAM,WAAA,GAAc,IAAI,mBAAA,EAAoB;AAC5C,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY;AAAA,IACnC,GAAG,OAAA,CAAQ,OAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACV,CAAA;AAED,EAAA,IAAI;AACH,IAAA,MAAM,SAAS,MAAM,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,cAAc,OAAO,CAAA;AACrE,IAAA,IAAI,OAAA,CAAQ,IAAI,KAAA,EAAO;AACtB,MAAA,WAAA,CAAY,QAAA,CAAS,CAAA,kBAAA,EAAqB,SAAA,CAAU,EAAE,CAAA,CAAE,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,MAAA;AAAA,EACR,SAAS,KAAA,EAAO;AACf,IAAA,WAAA,CAAY,QAAA,CAAS,CAAA,oBAAA,EAAuB,SAAA,CAAU,EAAE,CAAA,CAAE,CAAA;AAC1D,IAAA,MAAM,KAAA;AAAA,EACP;AACD","file":"chunk-K446NZ4E.js","sourcesContent":["import { FlowRuntime } from '../runtime'\nimport type { WorkflowBlueprint } from '../types'\nimport { InMemoryEventLogger } from './event-logger'\n\n/**\n * A test helper that executes a workflow and automatically prints a detailed\n * execution trace to the console if the workflow fails.\n *\n * @example\n * // In your test file (e.g., my-workflow.test.ts)\n * it('should process data correctly', async () => {\n * const flow = createFlow('my-flow')\n * .node('a', async () => ({ output: 1 }))\n * .node('b', async ({ input }) => ({ output: input + 1 })) // Bug: returns { output: 3 }\n * .edge('a', 'b')\n *\n * const runtime = new FlowRuntime({})\n *\n * // If this test fails, a full, human-readable trace of the execution\n * // (inputs, outputs, context changes) is printed to the console.\n * const result = await runWithTrace(runtime, flow.toBlueprint())\n *\n * expect(result.context.b).toBe(2)\n * })\n *\n * @param runtime The original FlowRuntime instance (its options will be used).\n * @param blueprint The WorkflowBlueprint to execute.\n * @param initialState The initial state for the workflow run.\n * @param options Additional options for the run.\n * @returns The WorkflowResult if successful.\n */\nexport async function runWithTrace<TContext extends Record<string, any>>(\n\truntime: FlowRuntime<TContext, any>,\n\tblueprint: WorkflowBlueprint,\n\tinitialState: Partial<TContext> | string = {},\n\toptions: {\n\t\tfunctionRegistry?: Map<string, any>\n\t\tstrict?: boolean\n\t\tsignal?: AbortSignal\n\t} = {},\n) {\n\tconst eventLogger = new InMemoryEventLogger()\n\tconst testRuntime = new FlowRuntime({\n\t\t...runtime.options,\n\t\teventBus: eventLogger,\n\t})\n\n\ttry {\n\t\tconst result = await testRuntime.run(blueprint, initialState, options)\n\t\tif (process.env.DEBUG) {\n\t\t\teventLogger.printLog(`Successful Trace: ${blueprint.id}`)\n\t\t}\n\t\treturn result\n\t} catch (error) {\n\t\teventLogger.printLog(`Failing Test Trace: ${blueprint.id}`)\n\t\tthrow error\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":"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","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"]}