flowcraft 2.4.0 → 2.6.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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/dist/analysis.d.ts +9 -2
  4. package/dist/analysis.js +1 -1
  5. package/dist/chunk-27STBUGG.js +44 -0
  6. package/dist/chunk-27STBUGG.js.map +1 -0
  7. package/dist/{chunk-OZZP5YI6.js → chunk-2ISKDTSN.js} +3 -3
  8. package/dist/{chunk-OZZP5YI6.js.map → chunk-2ISKDTSN.js.map} +1 -1
  9. package/dist/{chunk-OO3FF3DF.js → chunk-5BOUGXZO.js} +8 -8
  10. package/dist/chunk-5BOUGXZO.js.map +1 -0
  11. package/dist/{chunk-J3HZD5ES.js → chunk-5XPW6YEP.js} +54 -15
  12. package/dist/chunk-5XPW6YEP.js.map +1 -0
  13. package/dist/{chunk-VN2JKKAE.js → chunk-6MGLU3UU.js} +3 -3
  14. package/dist/{chunk-VN2JKKAE.js.map → chunk-6MGLU3UU.js.map} +1 -1
  15. package/dist/{chunk-7PBANEG3.js → chunk-7FIOROIR.js} +5 -11
  16. package/dist/chunk-7FIOROIR.js.map +1 -0
  17. package/dist/{chunk-G5BGBPFP.js → chunk-FBPY44WL.js} +3 -3
  18. package/dist/{chunk-G5BGBPFP.js.map → chunk-FBPY44WL.js.map} +1 -1
  19. package/dist/chunk-HNHM3FDK.js +52 -0
  20. package/dist/chunk-HNHM3FDK.js.map +1 -0
  21. package/dist/chunk-I53JB2KW.js +26 -0
  22. package/dist/chunk-I53JB2KW.js.map +1 -0
  23. package/dist/{chunk-GVF7GQXQ.js → chunk-IDTYHLDQ.js} +3 -3
  24. package/dist/chunk-IDTYHLDQ.js.map +1 -0
  25. package/dist/{chunk-EUJWJWFA.js → chunk-IKOTX22J.js} +3 -3
  26. package/dist/{chunk-EUJWJWFA.js.map → chunk-IKOTX22J.js.map} +1 -1
  27. package/dist/{chunk-GIJOZ3AN.js → chunk-JLDHCI2O.js} +5 -5
  28. package/dist/{chunk-GIJOZ3AN.js.map → chunk-JLDHCI2O.js.map} +1 -1
  29. package/dist/{chunk-KXXEA5VE.js → chunk-N4NLAIEN.js} +3 -3
  30. package/dist/{chunk-KXXEA5VE.js.map → chunk-N4NLAIEN.js.map} +1 -1
  31. package/dist/{chunk-CHG6O6JX.js → chunk-OPRR4TAO.js} +14 -12
  32. package/dist/chunk-OPRR4TAO.js.map +1 -0
  33. package/dist/{chunk-MCGK3FXQ.js → chunk-SEI4Z3MO.js} +3 -3
  34. package/dist/{chunk-MCGK3FXQ.js.map → chunk-SEI4Z3MO.js.map} +1 -1
  35. package/dist/{chunk-K6LPGUPR.js → chunk-UXIASXSG.js} +7 -7
  36. package/dist/chunk-UXIASXSG.js.map +1 -0
  37. package/dist/chunk-XDI4TJHA.js +95 -0
  38. package/dist/chunk-XDI4TJHA.js.map +1 -0
  39. package/dist/{chunk-NDWVLU7J.js → chunk-XTW36KQZ.js} +3 -3
  40. package/dist/{chunk-NDWVLU7J.js.map → chunk-XTW36KQZ.js.map} +1 -1
  41. package/dist/{chunk-233SESC2.js → chunk-ZLW4QOTS.js} +74 -3
  42. package/dist/chunk-ZLW4QOTS.js.map +1 -0
  43. package/dist/container-factory.d.ts +1 -1
  44. package/dist/container-factory.js +5 -5
  45. package/dist/context.d.ts +21 -2
  46. package/dist/context.js +1 -1
  47. package/dist/error-mapper.d.ts +15 -0
  48. package/dist/error-mapper.js +4 -0
  49. package/dist/error-mapper.js.map +1 -0
  50. package/dist/evaluator.d.ts +1 -1
  51. package/dist/flow.d.ts +5 -5
  52. package/dist/flow.js +1 -1
  53. package/dist/index.d.ts +5 -4
  54. package/dist/index.js +20 -18
  55. package/dist/linter.d.ts +1 -1
  56. package/dist/linter.js +2 -2
  57. package/dist/logger.d.ts +1 -1
  58. package/dist/node.d.ts +1 -1
  59. package/dist/nodes/batch-gather.d.ts +1 -1
  60. package/dist/nodes/batch-scatter.d.ts +1 -1
  61. package/dist/nodes/sleep.d.ts +1 -1
  62. package/dist/nodes/sleep.js +1 -1
  63. package/dist/nodes/subflow.d.ts +1 -1
  64. package/dist/nodes/subflow.js +6 -6
  65. package/dist/nodes/wait.d.ts +1 -1
  66. package/dist/nodes/wait.js +1 -1
  67. package/dist/nodes/webhook.d.ts +13 -0
  68. package/dist/nodes/webhook.js +4 -0
  69. package/dist/nodes/webhook.js.map +1 -0
  70. package/dist/runtime/adapter.d.ts +13 -1
  71. package/dist/runtime/adapter.js +15 -14
  72. package/dist/runtime/execution-context.d.ts +1 -1
  73. package/dist/runtime/execution-context.js +3 -3
  74. package/dist/runtime/executors.d.ts +1 -1
  75. package/dist/runtime/index.d.ts +1 -1
  76. package/dist/runtime/index.js +15 -14
  77. package/dist/runtime/node-executor-factory.d.ts +1 -1
  78. package/dist/runtime/orchestrator.d.ts +1 -1
  79. package/dist/runtime/orchestrator.js +4 -4
  80. package/dist/runtime/orchestrators/step-by-step.d.ts +1 -1
  81. package/dist/runtime/orchestrators/utils.d.ts +1 -1
  82. package/dist/runtime/runtime.d.ts +1 -1
  83. package/dist/runtime/runtime.js +14 -13
  84. package/dist/runtime/scheduler.d.ts +1 -1
  85. package/dist/runtime/state.d.ts +1 -1
  86. package/dist/runtime/state.js +2 -2
  87. package/dist/runtime/traverser.d.ts +1 -1
  88. package/dist/runtime/traverser.js +2 -2
  89. package/dist/runtime/types.d.ts +1 -1
  90. package/dist/runtime/workflow-logic-handler.d.ts +1 -1
  91. package/dist/runtime/workflow-logic-handler.js +2 -2
  92. package/dist/sanitizer.d.ts +1 -1
  93. package/dist/sdk.d.ts +29 -0
  94. package/dist/sdk.js +20 -0
  95. package/dist/sdk.js.map +1 -0
  96. package/dist/serializer.d.ts +1 -1
  97. package/dist/testing/event-logger.d.ts +1 -1
  98. package/dist/testing/index.d.ts +1 -1
  99. package/dist/testing/index.js +17 -16
  100. package/dist/testing/run-with-trace.d.ts +1 -1
  101. package/dist/testing/run-with-trace.js +16 -15
  102. package/dist/testing/stepper.d.ts +1 -1
  103. package/dist/testing/stepper.js +6 -6
  104. package/dist/{types-DWCZW68f.d.ts → types-B-Drn84R.d.ts} +35 -3
  105. package/dist/types.d.ts +1 -1
  106. package/package.json +59 -55
  107. package/dist/chunk-233SESC2.js.map +0 -1
  108. package/dist/chunk-7PBANEG3.js.map +0 -1
  109. package/dist/chunk-CHG6O6JX.js.map +0 -1
  110. package/dist/chunk-GVF7GQXQ.js.map +0 -1
  111. package/dist/chunk-J3HZD5ES.js.map +0 -1
  112. package/dist/chunk-K6LPGUPR.js.map +0 -1
  113. package/dist/chunk-LJ4COM7S.js +0 -20
  114. package/dist/chunk-LJ4COM7S.js.map +0 -1
  115. package/dist/chunk-OO3FF3DF.js.map +0 -1
  116. package/dist/chunk-R3HQXIEL.js +0 -49
  117. package/dist/chunk-R3HQXIEL.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/traverser.ts"],"names":[],"mappings":"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","file":"chunk-G5BGBPFP.js","sourcesContent":["import { analyzeBlueprint } from '../analysis'\nimport type { NodeDefinition, NodeResult, WorkflowBlueprint } from '../types'\nimport type { WorkflowState } from './state'\n\nexport interface ReadyNode {\n\tnodeId: string\n\tnodeDef: NodeDefinition\n}\n\nexport class GraphTraverser {\n\tprivate frontier = new Set<string>()\n\tprivate allPredecessors: Map<string, Set<string>>\n\tprivate dynamicBlueprint: WorkflowBlueprint\n\tprivate completedNodes = new Set<string>()\n\n\tconstructor(blueprint: WorkflowBlueprint, isStrictMode: boolean = false) {\n\t\tthis.dynamicBlueprint = structuredClone(blueprint) as WorkflowBlueprint\n\t\tthis.allPredecessors = new Map<string, Set<string>>()\n\t\tfor (const node of this.dynamicBlueprint.nodes) {\n\t\t\tthis.allPredecessors.set(node.id, new Set())\n\t\t}\n\t\tfor (const edge of this.dynamicBlueprint.edges) {\n\t\t\tthis.allPredecessors.get(edge.target)?.add(edge.source)\n\t\t}\n\t\tconst analysis = analyzeBlueprint(blueprint)\n\t\tthis.frontier = new Set(analysis.startNodeIds.filter((id) => !this.isFallbackNode(id)))\n\t\tif (this.frontier.size === 0 && analysis.cycles.length > 0 && !isStrictMode) {\n\t\t\tconst uniqueStartNodes = new Set<string>()\n\t\t\tconst cycleEntryPoints = new Set(blueprint.metadata?.cycleEntryPoints || [])\n\t\t\tfor (const cycle of analysis.cycles) {\n\t\t\t\tif (cycle.length > 0) {\n\t\t\t\t\tconst entryPoint = cycle.find((node) => cycleEntryPoints.has(node))\n\t\t\t\t\tuniqueStartNodes.add(entryPoint || cycle[0])\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.frontier = new Set(uniqueStartNodes)\n\t\t}\n\t}\n\n\t/**\n\t * Clears all nodes from the execution frontier.\n\t */\n\tpublic clearFrontier(): void {\n\t\tthis.frontier.clear()\n\t}\n\n\t/**\n\t * Creates and initializes a GraphTraverser from a saved workflow state.\n\t * This is the correct way to prepare a traverser for a `resume` operation.\n\t * @param blueprint The workflow blueprint.\n\t * @param state The workflow state being resumed.\n\t * @returns A configured GraphTraverser instance.\n\t */\n\tpublic static fromState(blueprint: WorkflowBlueprint, state: WorkflowState<any>): GraphTraverser {\n\t\tconst traverser = new GraphTraverser(blueprint)\n\n\t\t// clear auto-populated frontier from constructor\n\t\ttraverser.clearFrontier()\n\n\t\t// re-hydrate the set of completed nodes\n\t\tconst completedNodes = state.getCompletedNodes()\n\t\ttraverser.completedNodes = new Set(completedNodes)\n\n\t\tfor (const node of traverser.dynamicBlueprint.nodes) {\n\t\t\tif (traverser.completedNodes.has(node.id)) continue\n\n\t\t\tconst requiredPredecessors = traverser.allPredecessors.get(node.id)\n\t\t\tconst joinStrategy = traverser.getEffectiveJoinStrategy(node.id)\n\n\t\t\t// if no predecessors and not completed, it's a start node and should be in the frontier\n\t\t\tif (!requiredPredecessors || requiredPredecessors.size === 0) {\n\t\t\t\ttraverser.frontier.add(node.id)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst completedPredecessors = [...requiredPredecessors].filter((p) => traverser.completedNodes.has(p))\n\t\t\tconst isReady =\n\t\t\t\tjoinStrategy === 'any'\n\t\t\t\t\t? completedPredecessors.length > 0\n\t\t\t\t\t: completedPredecessors.length === requiredPredecessors.size\n\n\t\t\tif (isReady) traverser.frontier.add(node.id)\n\t\t}\n\n\t\treturn traverser\n\t}\n\n\tprivate isFallbackNode(nodeId: string): boolean {\n\t\treturn this.dynamicBlueprint.nodes.some((n) => n.config?.fallback === nodeId)\n\t}\n\n\tprivate getEffectiveJoinStrategy(nodeId: string): 'any' | 'all' {\n\t\tconst node = this.dynamicBlueprint.nodes.find((n) => n.id === nodeId)\n\t\tconst baseJoinStrategy = node?.config?.joinStrategy || 'all'\n\n\t\tif (node?.uses === 'loop-controller') {\n\t\t\treturn 'any'\n\t\t}\n\n\t\tconst predecessors = this.allPredecessors.get(nodeId)\n\t\tif (predecessors) {\n\t\t\tfor (const predecessorId of predecessors) {\n\t\t\t\tconst predecessorNode = this.dynamicBlueprint.nodes.find((n) => n.id === predecessorId)\n\t\t\t\tif (predecessorNode?.uses === 'loop-controller') {\n\t\t\t\t\treturn 'any'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn baseJoinStrategy\n\t}\n\n\tgetReadyNodes(): ReadyNode[] {\n\t\tconst readyNodes: ReadyNode[] = []\n\t\tfor (const nodeId of this.frontier) {\n\t\t\tconst nodeDef = this.dynamicBlueprint.nodes.find((n) => n.id === nodeId)\n\t\t\tif (nodeDef) {\n\t\t\t\treadyNodes.push({ nodeId, nodeDef })\n\t\t\t}\n\t\t}\n\t\tthis.frontier.clear()\n\t\treturn readyNodes\n\t}\n\n\thasMoreWork(): boolean {\n\t\treturn this.frontier.size > 0\n\t}\n\n\tmarkNodeCompleted(nodeId: string, result: NodeResult<any, any>, nextNodes: NodeDefinition[]): void {\n\t\tthis.completedNodes.add(nodeId)\n\n\t\tif (result.dynamicNodes && result.dynamicNodes.length > 0) {\n\t\t\tconst gatherNodeId = result.output?.gatherNodeId\n\t\t\tfor (const dynamicNode of result.dynamicNodes) {\n\t\t\t\tthis.dynamicBlueprint.nodes.push(dynamicNode)\n\t\t\t\tthis.allPredecessors.set(dynamicNode.id, new Set([nodeId]))\n\t\t\t\tif (gatherNodeId) {\n\t\t\t\t\tthis.allPredecessors.get(gatherNodeId)?.add(dynamicNode.id)\n\t\t\t\t}\n\t\t\t\tthis.frontier.add(dynamicNode.id)\n\t\t\t}\n\t\t}\n\n\t\tfor (const node of nextNodes) {\n\t\t\tconst joinStrategy = this.getEffectiveJoinStrategy(node.id)\n\t\t\tif (joinStrategy !== 'any' && this.completedNodes.has(node.id)) continue\n\n\t\t\tconst requiredPredecessors = this.allPredecessors.get(node.id)\n\t\t\tif (!requiredPredecessors) continue\n\n\t\t\tconst isReady =\n\t\t\t\tjoinStrategy === 'any'\n\t\t\t\t\t? requiredPredecessors.has(nodeId)\n\t\t\t\t\t: [...requiredPredecessors].every((p) => this.completedNodes.has(p))\n\n\t\t\tif (isReady) {\n\t\t\t\tthis.frontier.add(node.id)\n\t\t\t}\n\t\t}\n\n\t\tif (nextNodes.length === 0) {\n\t\t\tfor (const [potentialNextId, predecessors] of this.allPredecessors) {\n\t\t\t\tif (predecessors.has(nodeId) && !this.completedNodes.has(potentialNextId)) {\n\t\t\t\t\tconst joinStrategy = this.getEffectiveJoinStrategy(potentialNextId)\n\t\t\t\t\tconst isReady =\n\t\t\t\t\t\tjoinStrategy === 'any'\n\t\t\t\t\t\t\t? predecessors.has(nodeId)\n\t\t\t\t\t\t\t: [...predecessors].every((p) => this.completedNodes.has(p))\n\t\t\t\t\tif (isReady) {\n\t\t\t\t\t\tthis.frontier.add(potentialNextId)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetAllNodeIds(): Set<string> {\n\t\treturn new Set(this.dynamicBlueprint.nodes.map((n) => n.id))\n\t}\n\n\tgetFallbackNodeIds(): Set<string> {\n\t\tconst fallbackNodeIds = new Set<string>()\n\t\tfor (const node of this.dynamicBlueprint.nodes) {\n\t\t\tif (node.config?.fallback) fallbackNodeIds.add(node.config.fallback)\n\t\t}\n\t\treturn fallbackNodeIds\n\t}\n\n\tgetCompletedNodes(): Set<string> {\n\t\treturn new Set(this.completedNodes)\n\t}\n\n\tgetDynamicBlueprint(): WorkflowBlueprint {\n\t\treturn this.dynamicBlueprint\n\t}\n\n\tgetAllPredecessors(): Map<string, Set<string>> {\n\t\treturn this.allPredecessors\n\t}\n\n\taddDynamicNode(_nodeId: string, dynamicNode: NodeDefinition, predecessorId: string, gatherNodeId?: string): void {\n\t\tthis.dynamicBlueprint.nodes.push(dynamicNode)\n\t\tthis.allPredecessors.set(dynamicNode.id, new Set([predecessorId]))\n\t\tif (gatherNodeId) {\n\t\t\tthis.allPredecessors.get(gatherNodeId)?.add(dynamicNode.id)\n\t\t}\n\t\tthis.frontier.add(dynamicNode.id)\n\t}\n\n\t/**\n\t * Manually adds a node ID back to the execution frontier.\n\t * Used by orchestrators that need fine-grained control over steps.\n\t * @param nodeId The ID of the node to add to the frontier.\n\t */\n\tpublic addToFrontier(nodeId: string): void {\n\t\tthis.frontier.add(nodeId)\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../src/runtime/traverser.ts"],"names":[],"mappings":";;;AASO,IAAM,cAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EACnB,QAAA,uBAAe,GAAA,EAAY;AAAA,EAC3B,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA,uBAAqB,GAAA,EAAY;AAAA,EAEzC,WAAA,CAAY,SAAA,EAA8B,YAAA,GAAwB,KAAA,EAAO;AACxE,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAgB,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,eAAA,uBAAsB,GAAA,EAAyB;AACpD,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO;AAC/C,MAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,IAAA,CAAK,EAAA,kBAAI,IAAI,KAAK,CAAA;AAAA,IAC5C;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO;AAC/C,MAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACvD;AACA,IAAA,MAAM,QAAA,GAAW,iBAAiB,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,GAAA,CAAI,QAAA,CAAS,YAAA,CAAa,MAAA,CAAO,CAAC,EAAA,KAAO,CAAC,IAAA,CAAK,cAAA,CAAe,EAAE,CAAC,CAAC,CAAA;AACtF,IAAA,IAAI,IAAA,CAAK,SAAS,IAAA,KAAS,CAAA,IAAK,SAAS,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,CAAC,YAAA,EAAc;AAC5E,MAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AACzC,MAAA,MAAM,mBAAmB,IAAI,GAAA,CAAI,UAAU,QAAA,EAAU,gBAAA,IAAoB,EAAE,CAAA;AAC3E,MAAA,KAAA,MAAW,KAAA,IAAS,SAAS,MAAA,EAAQ;AACpC,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACrB,UAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,CAAC,SAAS,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAC,CAAA;AAClE,UAAA,gBAAA,CAAiB,GAAA,CAAI,UAAA,IAAc,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QAC5C;AAAA,MACD;AACA,MAAA,IAAA,CAAK,QAAA,GAAW,IAAI,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACzC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,GAAsB;AAC5B,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAc,SAAA,CAAU,SAAA,EAA8B,KAAA,EAA2C;AAChG,IAAA,MAAM,SAAA,GAAY,IAAI,eAAA,CAAe,SAAS,CAAA;AAG9C,IAAA,SAAA,CAAU,aAAA,EAAc;AAGxB,IAAA,MAAM,cAAA,GAAiB,MAAM,iBAAA,EAAkB;AAC/C,IAAA,SAAA,CAAU,cAAA,GAAiB,IAAI,GAAA,CAAI,cAAc,CAAA;AAEjD,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,gBAAA,CAAiB,KAAA,EAAO;AACpD,MAAA,IAAI,SAAA,CAAU,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAE3C,MAAA,MAAM,oBAAA,GAAuB,SAAA,CAAU,eAAA,CAAgB,GAAA,CAAI,KAAK,EAAE,CAAA;AAClE,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,wBAAA,CAAyB,IAAA,CAAK,EAAE,CAAA;AAG/D,MAAA,IAAI,CAAC,oBAAA,IAAwB,oBAAA,CAAqB,IAAA,KAAS,CAAA,EAAG;AAC7D,QAAA,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAC9B,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,qBAAA,GAAwB,CAAC,GAAG,oBAAoB,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,SAAA,CAAU,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AACrG,MAAA,MAAM,OAAA,GACL,iBAAiB,KAAA,GACd,qBAAA,CAAsB,SAAS,CAAA,GAC/B,qBAAA,CAAsB,WAAW,oBAAA,CAAqB,IAAA;AAE1D,MAAA,IAAI,OAAA,EAAS,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,SAAA;AAAA,EACR;AAAA,EAEQ,eAAe,MAAA,EAAyB;AAC/C,IAAA,OAAO,IAAA,CAAK,iBAAiB,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,EAAQ,QAAA,KAAa,MAAM,CAAA;AAAA,EAC7E;AAAA,EAEQ,yBAAyB,MAAA,EAA+B;AAC/D,IAAA,MAAM,IAAA,GAAO,KAAK,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AACpE,IAAA,MAAM,gBAAA,GAAmB,IAAA,EAAM,MAAA,EAAQ,YAAA,IAAgB,KAAA;AAEvD,IAAA,IAAI,IAAA,EAAM,SAAS,iBAAA,EAAmB;AACrC,MAAA,OAAO,KAAA;AAAA,IACR;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AACpD,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,KAAA,MAAW,iBAAiB,YAAA,EAAc;AACzC,QAAA,MAAM,eAAA,GAAkB,KAAK,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,aAAa,CAAA;AACtF,QAAA,IAAI,eAAA,EAAiB,SAAS,iBAAA,EAAmB;AAChD,UAAA,OAAO,KAAA;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAEA,IAAA,OAAO,gBAAA;AAAA,EACR;AAAA,EAEA,aAAA,GAA6B;AAC5B,IAAA,MAAM,aAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,QAAA,EAAU;AACnC,MAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AACvE,MAAA,IAAI,OAAA,EAAS;AACZ,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAA;AAAA,MACpC;AAAA,IACD;AACA,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,OAAO,UAAA;AAAA,EACR;AAAA,EAEA,WAAA,GAAuB;AACtB,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,GAAO,CAAA;AAAA,EAC7B;AAAA,EAEA,iBAAA,CAAkB,MAAA,EAAgB,MAAA,EAA8B,SAAA,EAAmC;AAClG,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,MAAM,CAAA;AAE9B,IAAA,IAAI,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AAC1D,MAAA,MAAM,YAAA,GAAe,OAAO,MAAA,EAAQ,YAAA;AACpC,MAAA,KAAA,MAAW,WAAA,IAAe,OAAO,YAAA,EAAc;AAC9C,QAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAC5C,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,WAAA,CAAY,EAAA,sBAAQ,GAAA,CAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC1D,QAAA,IAAI,YAAA,EAAc;AACjB,UAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,YAAY,CAAA,EAAG,GAAA,CAAI,YAAY,EAAE,CAAA;AAAA,QAC3D;AACA,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,MACjC;AAAA,IACD;AAEA,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC7B,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,EAAE,CAAA;AAC1D,MAAA,IAAI,iBAAiB,KAAA,IAAS,IAAA,CAAK,eAAe,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAEhE,MAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,EAAE,CAAA;AAC7D,MAAA,IAAI,CAAC,oBAAA,EAAsB;AAE3B,MAAA,MAAM,UACL,YAAA,KAAiB,KAAA,GACd,qBAAqB,GAAA,CAAI,MAAM,IAC/B,CAAC,GAAG,oBAAoB,CAAA,CAAE,MAAM,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAErE,MAAA,IAAI,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAAA,MAC1B;AAAA,IACD;AAEA,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC3B,MAAA,KAAA,MAAW,CAAC,eAAA,EAAiB,YAAY,CAAA,IAAK,KAAK,eAAA,EAAiB;AACnE,QAAA,IAAI,YAAA,CAAa,IAAI,MAAM,CAAA,IAAK,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA,EAAG;AAC1E,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,wBAAA,CAAyB,eAAe,CAAA;AAClE,UAAA,MAAM,UACL,YAAA,KAAiB,KAAA,GACd,aAAa,GAAA,CAAI,MAAM,IACvB,CAAC,GAAG,YAAY,CAAA,CAAE,MAAM,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAC7D,UAAA,IAAI,OAAA,EAAS;AACZ,YAAA,IAAA,CAAK,QAAA,CAAS,IAAI,eAAe,CAAA;AAAA,UAClC;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,aAAA,GAA6B;AAC5B,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEA,kBAAA,GAAkC;AACjC,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AACxC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO;AAC/C,MAAA,IAAI,KAAK,MAAA,EAAQ,QAAA,kBAA0B,GAAA,CAAI,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,eAAA;AAAA,EACR;AAAA,EAEA,iBAAA,GAAiC;AAChC,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,cAAc,CAAA;AAAA,EACnC;AAAA,EAEA,mBAAA,GAAyC;AACxC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACb;AAAA,EAEA,kBAAA,GAA+C;AAC9C,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACb;AAAA,EAEA,cAAA,CAAe,OAAA,EAAiB,WAAA,EAA6B,aAAA,EAAuB,YAAA,EAA6B;AAChH,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAC5C,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,WAAA,CAAY,EAAA,sBAAQ,GAAA,CAAI,CAAC,aAAa,CAAC,CAAC,CAAA;AACjE,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,YAAY,CAAA,EAAG,GAAA,CAAI,YAAY,EAAE,CAAA;AAAA,IAC3D;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,cAAc,MAAA,EAAsB;AAC1C,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,MAAM,CAAA;AAAA,EACzB;AACD","file":"chunk-FBPY44WL.js","sourcesContent":["import { analyzeBlueprint } from '../analysis'\nimport type { NodeDefinition, NodeResult, WorkflowBlueprint } from '../types'\nimport type { WorkflowState } from './state'\n\nexport interface ReadyNode {\n\tnodeId: string\n\tnodeDef: NodeDefinition\n}\n\nexport class GraphTraverser {\n\tprivate frontier = new Set<string>()\n\tprivate allPredecessors: Map<string, Set<string>>\n\tprivate dynamicBlueprint: WorkflowBlueprint\n\tprivate completedNodes = new Set<string>()\n\n\tconstructor(blueprint: WorkflowBlueprint, isStrictMode: boolean = false) {\n\t\tthis.dynamicBlueprint = structuredClone(blueprint) as WorkflowBlueprint\n\t\tthis.allPredecessors = new Map<string, Set<string>>()\n\t\tfor (const node of this.dynamicBlueprint.nodes) {\n\t\t\tthis.allPredecessors.set(node.id, new Set())\n\t\t}\n\t\tfor (const edge of this.dynamicBlueprint.edges) {\n\t\t\tthis.allPredecessors.get(edge.target)?.add(edge.source)\n\t\t}\n\t\tconst analysis = analyzeBlueprint(blueprint)\n\t\tthis.frontier = new Set(analysis.startNodeIds.filter((id) => !this.isFallbackNode(id)))\n\t\tif (this.frontier.size === 0 && analysis.cycles.length > 0 && !isStrictMode) {\n\t\t\tconst uniqueStartNodes = new Set<string>()\n\t\t\tconst cycleEntryPoints = new Set(blueprint.metadata?.cycleEntryPoints || [])\n\t\t\tfor (const cycle of analysis.cycles) {\n\t\t\t\tif (cycle.length > 0) {\n\t\t\t\t\tconst entryPoint = cycle.find((node) => cycleEntryPoints.has(node))\n\t\t\t\t\tuniqueStartNodes.add(entryPoint || cycle[0])\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.frontier = new Set(uniqueStartNodes)\n\t\t}\n\t}\n\n\t/**\n\t * Clears all nodes from the execution frontier.\n\t */\n\tpublic clearFrontier(): void {\n\t\tthis.frontier.clear()\n\t}\n\n\t/**\n\t * Creates and initializes a GraphTraverser from a saved workflow state.\n\t * This is the correct way to prepare a traverser for a `resume` operation.\n\t * @param blueprint The workflow blueprint.\n\t * @param state The workflow state being resumed.\n\t * @returns A configured GraphTraverser instance.\n\t */\n\tpublic static fromState(blueprint: WorkflowBlueprint, state: WorkflowState<any>): GraphTraverser {\n\t\tconst traverser = new GraphTraverser(blueprint)\n\n\t\t// clear auto-populated frontier from constructor\n\t\ttraverser.clearFrontier()\n\n\t\t// re-hydrate the set of completed nodes\n\t\tconst completedNodes = state.getCompletedNodes()\n\t\ttraverser.completedNodes = new Set(completedNodes)\n\n\t\tfor (const node of traverser.dynamicBlueprint.nodes) {\n\t\t\tif (traverser.completedNodes.has(node.id)) continue\n\n\t\t\tconst requiredPredecessors = traverser.allPredecessors.get(node.id)\n\t\t\tconst joinStrategy = traverser.getEffectiveJoinStrategy(node.id)\n\n\t\t\t// if no predecessors and not completed, it's a start node and should be in the frontier\n\t\t\tif (!requiredPredecessors || requiredPredecessors.size === 0) {\n\t\t\t\ttraverser.frontier.add(node.id)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst completedPredecessors = [...requiredPredecessors].filter((p) => traverser.completedNodes.has(p))\n\t\t\tconst isReady =\n\t\t\t\tjoinStrategy === 'any'\n\t\t\t\t\t? completedPredecessors.length > 0\n\t\t\t\t\t: completedPredecessors.length === requiredPredecessors.size\n\n\t\t\tif (isReady) traverser.frontier.add(node.id)\n\t\t}\n\n\t\treturn traverser\n\t}\n\n\tprivate isFallbackNode(nodeId: string): boolean {\n\t\treturn this.dynamicBlueprint.nodes.some((n) => n.config?.fallback === nodeId)\n\t}\n\n\tprivate getEffectiveJoinStrategy(nodeId: string): 'any' | 'all' {\n\t\tconst node = this.dynamicBlueprint.nodes.find((n) => n.id === nodeId)\n\t\tconst baseJoinStrategy = node?.config?.joinStrategy || 'all'\n\n\t\tif (node?.uses === 'loop-controller') {\n\t\t\treturn 'any'\n\t\t}\n\n\t\tconst predecessors = this.allPredecessors.get(nodeId)\n\t\tif (predecessors) {\n\t\t\tfor (const predecessorId of predecessors) {\n\t\t\t\tconst predecessorNode = this.dynamicBlueprint.nodes.find((n) => n.id === predecessorId)\n\t\t\t\tif (predecessorNode?.uses === 'loop-controller') {\n\t\t\t\t\treturn 'any'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn baseJoinStrategy\n\t}\n\n\tgetReadyNodes(): ReadyNode[] {\n\t\tconst readyNodes: ReadyNode[] = []\n\t\tfor (const nodeId of this.frontier) {\n\t\t\tconst nodeDef = this.dynamicBlueprint.nodes.find((n) => n.id === nodeId)\n\t\t\tif (nodeDef) {\n\t\t\t\treadyNodes.push({ nodeId, nodeDef })\n\t\t\t}\n\t\t}\n\t\tthis.frontier.clear()\n\t\treturn readyNodes\n\t}\n\n\thasMoreWork(): boolean {\n\t\treturn this.frontier.size > 0\n\t}\n\n\tmarkNodeCompleted(nodeId: string, result: NodeResult<any, any>, nextNodes: NodeDefinition[]): void {\n\t\tthis.completedNodes.add(nodeId)\n\n\t\tif (result.dynamicNodes && result.dynamicNodes.length > 0) {\n\t\t\tconst gatherNodeId = result.output?.gatherNodeId\n\t\t\tfor (const dynamicNode of result.dynamicNodes) {\n\t\t\t\tthis.dynamicBlueprint.nodes.push(dynamicNode)\n\t\t\t\tthis.allPredecessors.set(dynamicNode.id, new Set([nodeId]))\n\t\t\t\tif (gatherNodeId) {\n\t\t\t\t\tthis.allPredecessors.get(gatherNodeId)?.add(dynamicNode.id)\n\t\t\t\t}\n\t\t\t\tthis.frontier.add(dynamicNode.id)\n\t\t\t}\n\t\t}\n\n\t\tfor (const node of nextNodes) {\n\t\t\tconst joinStrategy = this.getEffectiveJoinStrategy(node.id)\n\t\t\tif (joinStrategy !== 'any' && this.completedNodes.has(node.id)) continue\n\n\t\t\tconst requiredPredecessors = this.allPredecessors.get(node.id)\n\t\t\tif (!requiredPredecessors) continue\n\n\t\t\tconst isReady =\n\t\t\t\tjoinStrategy === 'any'\n\t\t\t\t\t? requiredPredecessors.has(nodeId)\n\t\t\t\t\t: [...requiredPredecessors].every((p) => this.completedNodes.has(p))\n\n\t\t\tif (isReady) {\n\t\t\t\tthis.frontier.add(node.id)\n\t\t\t}\n\t\t}\n\n\t\tif (nextNodes.length === 0) {\n\t\t\tfor (const [potentialNextId, predecessors] of this.allPredecessors) {\n\t\t\t\tif (predecessors.has(nodeId) && !this.completedNodes.has(potentialNextId)) {\n\t\t\t\t\tconst joinStrategy = this.getEffectiveJoinStrategy(potentialNextId)\n\t\t\t\t\tconst isReady =\n\t\t\t\t\t\tjoinStrategy === 'any'\n\t\t\t\t\t\t\t? predecessors.has(nodeId)\n\t\t\t\t\t\t\t: [...predecessors].every((p) => this.completedNodes.has(p))\n\t\t\t\t\tif (isReady) {\n\t\t\t\t\t\tthis.frontier.add(potentialNextId)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetAllNodeIds(): Set<string> {\n\t\treturn new Set(this.dynamicBlueprint.nodes.map((n) => n.id))\n\t}\n\n\tgetFallbackNodeIds(): Set<string> {\n\t\tconst fallbackNodeIds = new Set<string>()\n\t\tfor (const node of this.dynamicBlueprint.nodes) {\n\t\t\tif (node.config?.fallback) fallbackNodeIds.add(node.config.fallback)\n\t\t}\n\t\treturn fallbackNodeIds\n\t}\n\n\tgetCompletedNodes(): Set<string> {\n\t\treturn new Set(this.completedNodes)\n\t}\n\n\tgetDynamicBlueprint(): WorkflowBlueprint {\n\t\treturn this.dynamicBlueprint\n\t}\n\n\tgetAllPredecessors(): Map<string, Set<string>> {\n\t\treturn this.allPredecessors\n\t}\n\n\taddDynamicNode(_nodeId: string, dynamicNode: NodeDefinition, predecessorId: string, gatherNodeId?: string): void {\n\t\tthis.dynamicBlueprint.nodes.push(dynamicNode)\n\t\tthis.allPredecessors.set(dynamicNode.id, new Set([predecessorId]))\n\t\tif (gatherNodeId) {\n\t\t\tthis.allPredecessors.get(gatherNodeId)?.add(dynamicNode.id)\n\t\t}\n\t\tthis.frontier.add(dynamicNode.id)\n\t}\n\n\t/**\n\t * Manually adds a node ID back to the execution frontier.\n\t * Used by orchestrators that need fine-grained control over steps.\n\t * @param nodeId The ID of the node to add to the frontier.\n\t */\n\tpublic addToFrontier(nodeId: string): void {\n\t\tthis.frontier.add(nodeId)\n\t}\n}\n"]}
@@ -0,0 +1,52 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,26 @@
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
@@ -0,0 +1 @@
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"]}
@@ -3,7 +3,7 @@ import { BaseNode } from './chunk-LNK7LZER.js';
3
3
  // src/nodes/wait.ts
4
4
  var WaitNode = class extends BaseNode {
5
5
  async exec(_prepResult, context) {
6
- context.dependencies.workflowState.markAsAwaiting(this.nodeId ?? "", {
6
+ await context.dependencies.workflowState.markAsAwaiting(this.nodeId ?? "", {
7
7
  reason: "external_event"
8
8
  // params: this.params // NOTE: can add more details if needed in the future
9
9
  });
@@ -12,5 +12,5 @@ var WaitNode = class extends BaseNode {
12
12
  };
13
13
 
14
14
  export { WaitNode };
15
- //# sourceMappingURL=chunk-GVF7GQXQ.js.map
16
- //# sourceMappingURL=chunk-GVF7GQXQ.js.map
15
+ //# sourceMappingURL=chunk-IDTYHLDQ.js.map
16
+ //# sourceMappingURL=chunk-IDTYHLDQ.js.map
@@ -0,0 +1 @@
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,4 +1,4 @@
1
- import { analyzeBlueprint } from './chunk-233SESC2.js';
1
+ import { analyzeBlueprint } from './chunk-ZLW4QOTS.js';
2
2
 
3
3
  // src/linter.ts
4
4
  function lintBlueprint(blueprint, registry, blueprints) {
@@ -81,5 +81,5 @@ function lintBlueprint(blueprint, registry, blueprints) {
81
81
  }
82
82
 
83
83
  export { lintBlueprint };
84
- //# sourceMappingURL=chunk-EUJWJWFA.js.map
85
- //# sourceMappingURL=chunk-EUJWJWFA.js.map
84
+ //# sourceMappingURL=chunk-IKOTX22J.js.map
85
+ //# sourceMappingURL=chunk-IKOTX22J.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/linter.ts"],"names":["e"],"mappings":"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","file":"chunk-EUJWJWFA.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
+ {"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,7 +1,7 @@
1
1
  import { StepByStepOrchestrator } from './chunk-G53CSLBF.js';
2
- import { GraphTraverser } from './chunk-G5BGBPFP.js';
3
- import { ExecutionContext } from './chunk-KXXEA5VE.js';
4
- import { WorkflowState } from './chunk-OO3FF3DF.js';
2
+ import { GraphTraverser } from './chunk-FBPY44WL.js';
3
+ import { ExecutionContext } from './chunk-N4NLAIEN.js';
4
+ import { WorkflowState } from './chunk-5BOUGXZO.js';
5
5
 
6
6
  // src/testing/stepper.ts
7
7
  async function createStepper(runtime, blueprint, functionRegistry, initialState = {}) {
@@ -72,5 +72,5 @@ async function createStepper(runtime, blueprint, functionRegistry, initialState
72
72
  }
73
73
 
74
74
  export { createStepper };
75
- //# sourceMappingURL=chunk-GIJOZ3AN.js.map
76
- //# sourceMappingURL=chunk-GIJOZ3AN.js.map
75
+ //# sourceMappingURL=chunk-JLDHCI2O.js.map
76
+ //# sourceMappingURL=chunk-JLDHCI2O.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/testing/stepper.ts"],"names":[],"mappings":";;;;;;AAkFA,eAAsB,cACrB,OAAA,EACA,SAAA,EACA,gBAAA,EACA,YAAA,GAAkC,EAAC,EACG;AACtC,EAAA,MAAM,iBAAA,GAAoB,gBAAgB,SAAS,CAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,gBAAgB,YAAY,CAAA;AAElD,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,YAAA,GAAe,IAAI,sBAAA,EAAuB;AAChD,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAW;AAClD,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,CAAC,GAAG,OAAA,CAAQ,QAAA,EAAU,GAAG,gBAAgB,CAAC,CAAA;AAEvE,EAAA,MAAM,aAAa,MAAM;AACxB,IAAA,KAAA,GAAQ,IAAI,cAAwB,aAAa,CAAA;AACjD,IAAA,SAAA,GAAY,IAAI,eAAe,iBAAiB,CAAA;AAChD,IAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,UAAA,EAAW;AAEX,EAAA,MAAM,OAAA,GAAsC;AAAA,IAC3C,IAAI,KAAA,GAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACR,CAAA;AAAA,IACA,IAAI,SAAA,GAAY;AACf,MAAA,OAAO,SAAA;AAAA,IACR,CAAA;AAAA,IACA,MAAA,GAAS;AACR,MAAA,OAAO,CAAC,SAAA,CAAU,WAAA,EAAY,IAAK,CAAC,MAAM,UAAA,EAAW;AAAA,IACtD,CAAA;AAAA,IACA,KAAA,GAAQ;AACP,MAAA,UAAA,EAAW;AAAA,IACZ,CAAA;AAAA,IACA,MAAM,IAAA,GAAO;AACZ,MAAA,MAAM,iBAAA,GAAoB,QAAQ,GAAA,EAAI;AACtC,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACvB,QAAA,OAAO,IAAA;AAAA,MACR;AAEA,MAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,UAAA,CAAW,WAAA,CAAY,iBAAiB,CAAA;AAE1E,MAAA,KAAA,GAAQ,IAAI,cAAc,iBAAiB,CAAA;AAC3C,MAAA,SAAA,GAAY,cAAA,CAAe,SAAA,CAAU,iBAAA,EAAmB,KAAK,CAAA;AAE7D,MAAA,OAAO,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,MAAM,IAAA,CAAK,OAAA,GAA0D,EAAC,EAAG;AACxE,MAAA,IAAI,OAAA,CAAQ,QAAO,EAAG;AACrB,QAAA,OAAO,IAAA;AAAA,MACR;AAEA,MAAA,MAAM,qBAAqB,MAAM,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA,EAAG,iBAAA;AACrE,MAAA,OAAA,CAAQ,KAAK,iBAAiB,CAAA;AAE9B,MAAA,MAAM,mBAAmB,IAAI,gBAAA;AAAA,QAC5B,iBAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,UACC,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,YAAY,OAAA,CAAQ,UAAA;AAAA,UACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,UACpB,cAAc,OAAA,CAAQ;AAAA,SACvB;AAAA,QACA,OAAA,CAAQ,MAAA;AAAA,QACR,OAAA,CAAQ;AAAA,OACT;AACA,MAAA,OAAO,YAAA,CAAa,GAAA,CAAI,gBAAA,EAAkB,SAAS,CAAA;AAAA,IACpD;AAAA,GACD;AAEA,EAAA,OAAO,OAAA;AACR","file":"chunk-GIJOZ3AN.js","sourcesContent":["import type { FlowRuntime } from '../runtime'\nimport { ExecutionContext } from '../runtime/execution-context'\nimport { StepByStepOrchestrator } from '../runtime/orchestrators/step-by-step'\nimport { WorkflowState } from '../runtime/state'\nimport { GraphTraverser } from '../runtime/traverser'\nimport type { NodeClass, NodeFunction, WorkflowBlueprint, WorkflowResult } from '../types'\n\n/**\n * Represents the controlled, step-by-step execution of a workflow.\n * Returned by the `createStepper` utility.\n */\nexport interface IWorkflowStepper<TContext extends Record<string, any>> {\n\t/** The current state of the workflow. Can be inspected after each step. */\n\treadonly state: WorkflowState<TContext>\n\n\t/** The graph traverser instance. Can be used to inspect the frontier or completed nodes. */\n\treadonly traverser: GraphTraverser\n\n\t/**\n\t * Executes the next \"turn\" or batch of ready nodes in the workflow.\n\t * @param options Optional configuration for this specific step, like a cancellation signal.\n\t * @returns A `WorkflowResult` representing the state after the step, or `null` if the workflow has already completed.\n\t */\n\tnext(options?: { signal?: AbortSignal; concurrency?: number }): Promise<WorkflowResult<TContext> | null>\n\n\t/**\n\t * Reverts the workflow to its previous state.\n\t * @returns The `WorkflowResult` of the previous state, or `null` if there is no history to revert to.\n\t */\n\tprev(): Promise<WorkflowResult<TContext> | null>\n\n\t/**\n\t * Resets the stepper to its initial state, clearing all progress and history.\n\t */\n\treset(): void\n\n\t/**\n\t * A convenience method to check if the workflow has any more steps to run.\n\t * @returns `true` if the workflow is complete or stalled, `false` otherwise.\n\t */\n\tisDone(): boolean\n}\n\n/**\n * A test utility that creates a stepper to execute a workflow one \"turn\" at a time.\n * This is invaluable for debugging and writing fine-grained tests where you need to\n * assert the state of the workflow after each logical step.\n *\n * @example\n * // In your test file\n * it('should correctly execute step-by-step', async () => {\n * const runtime = new FlowRuntime({ ... });\n * const flow = createFlow('test')\n * .node('a', async () => ({ output: 10 }))\n * .node('b', async ({ input }) => ({ output: input * 2 }))\n * .edge('a', 'b');\n *\n * const stepper = await createStepper(runtime, flow.toBlueprint(), flow.getFunctionRegistry());\n *\n * // First step (executes node 'a')\n * const result1 = await stepper.next();\n * expect(stepper.isDone()).toBe(false);\n * expect(result1.status).toBe('stalled');\n * expect(result1.context._outputs.a).toBe(10);\n *\n * // Second step (executes node 'b')\n * const result2 = await stepper.next();\n * expect(stepper.isDone()).toBe(true);\n * expect(result2.status).toBe('completed');\n * expect(result2.context._outputs.b).toBe(20);\n *\n * // Final step (no more work)\n * const result3 = await stepper.next();\n * expect(result3).toBeNull();\n * });\n *\n * @param runtime The `FlowRuntime` instance, used for its configuration.\n * @param blueprint The `WorkflowBlueprint` to execute.\n * @param functionRegistry The function registry from createFlow, containing the node implementations.\n * @param initialState The initial state for the workflow run.\n * @returns A Promise that resolves to an `IWorkflowStepper` instance.\n */\nexport async function createStepper<TContext extends Record<string, any>, TDependencies extends Record<string, any>>(\n\truntime: FlowRuntime<TContext, TDependencies>,\n\tblueprint: WorkflowBlueprint,\n\tfunctionRegistry: Map<string, NodeFunction | NodeClass>,\n\tinitialState: Partial<TContext> = {},\n): Promise<IWorkflowStepper<TContext>> {\n\tconst _initialBlueprint = structuredClone(blueprint)\n\tconst _initialState = structuredClone(initialState)\n\n\tlet state: WorkflowState<TContext>\n\tlet traverser: GraphTraverser\n\tconst history: string[] = []\n\n\tconst orchestrator = new StepByStepOrchestrator()\n\tconst executionId = globalThis.crypto?.randomUUID()\n\tconst nodeRegistry = new Map([...runtime.registry, ...functionRegistry])\n\n\tconst initialize = () => {\n\t\tstate = new WorkflowState<TContext>(_initialState)\n\t\ttraverser = new GraphTraverser(_initialBlueprint)\n\t\thistory.length = 0\n\t}\n\n\tinitialize()\n\n\tconst stepper: IWorkflowStepper<TContext> = {\n\t\tget state() {\n\t\t\treturn state\n\t\t},\n\t\tget traverser() {\n\t\t\treturn traverser\n\t\t},\n\t\tisDone() {\n\t\t\treturn !traverser.hasMoreWork() && !state.isAwaiting()\n\t\t},\n\t\treset() {\n\t\t\tinitialize()\n\t\t},\n\t\tasync prev() {\n\t\t\tconst previousStateJson = history.pop()\n\t\t\tif (!previousStateJson) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst previousStateData = runtime.serializer.deserialize(previousStateJson) as Partial<TContext>\n\n\t\t\tstate = new WorkflowState(previousStateData)\n\t\t\ttraverser = GraphTraverser.fromState(_initialBlueprint, state)\n\n\t\t\treturn state.toResult(runtime.serializer)\n\t\t},\n\t\tasync next(options: { signal?: AbortSignal; concurrency?: number } = {}) {\n\t\t\tif (stepper.isDone()) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst serializedContext = (await state.toResult(runtime.serializer)).serializedContext\n\t\t\thistory.push(serializedContext)\n\n\t\t\tconst executionContext = new ExecutionContext(\n\t\t\t\t_initialBlueprint,\n\t\t\t\tstate,\n\t\t\t\tnodeRegistry,\n\t\t\t\texecutionId,\n\t\t\t\truntime,\n\t\t\t\t{\n\t\t\t\t\tlogger: runtime.logger,\n\t\t\t\t\teventBus: runtime.eventBus,\n\t\t\t\t\tserializer: runtime.serializer,\n\t\t\t\t\tevaluator: runtime.evaluator,\n\t\t\t\t\tmiddleware: runtime.middleware,\n\t\t\t\t\tdependencies: runtime.dependencies,\n\t\t\t\t},\n\t\t\t\toptions.signal,\n\t\t\t\toptions.concurrency,\n\t\t\t)\n\t\t\treturn orchestrator.run(executionContext, traverser)\n\t\t},\n\t}\n\n\treturn stepper\n}\n"]}
1
+ {"version":3,"sources":["../src/testing/stepper.ts"],"names":[],"mappings":";;;;;;AAkFA,eAAsB,cACrB,OAAA,EACA,SAAA,EACA,gBAAA,EACA,YAAA,GAAkC,EAAC,EACG;AACtC,EAAA,MAAM,iBAAA,GAAoB,gBAAgB,SAAS,CAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,gBAAgB,YAAY,CAAA;AAElD,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,YAAA,GAAe,IAAI,sBAAA,EAAuB;AAChD,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAW;AAClD,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,CAAC,GAAG,OAAA,CAAQ,QAAA,EAAU,GAAG,gBAAgB,CAAC,CAAA;AAEvE,EAAA,MAAM,aAAa,MAAM;AACxB,IAAA,KAAA,GAAQ,IAAI,cAAwB,aAAa,CAAA;AACjD,IAAA,SAAA,GAAY,IAAI,eAAe,iBAAiB,CAAA;AAChD,IAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,UAAA,EAAW;AAEX,EAAA,MAAM,OAAA,GAAsC;AAAA,IAC3C,IAAI,KAAA,GAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACR,CAAA;AAAA,IACA,IAAI,SAAA,GAAY;AACf,MAAA,OAAO,SAAA;AAAA,IACR,CAAA;AAAA,IACA,MAAA,GAAS;AACR,MAAA,OAAO,CAAC,SAAA,CAAU,WAAA,EAAY,IAAK,CAAC,MAAM,UAAA,EAAW;AAAA,IACtD,CAAA;AAAA,IACA,KAAA,GAAQ;AACP,MAAA,UAAA,EAAW;AAAA,IACZ,CAAA;AAAA,IACA,MAAM,IAAA,GAAO;AACZ,MAAA,MAAM,iBAAA,GAAoB,QAAQ,GAAA,EAAI;AACtC,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACvB,QAAA,OAAO,IAAA;AAAA,MACR;AAEA,MAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,UAAA,CAAW,WAAA,CAAY,iBAAiB,CAAA;AAE1E,MAAA,KAAA,GAAQ,IAAI,cAAc,iBAAiB,CAAA;AAC3C,MAAA,SAAA,GAAY,cAAA,CAAe,SAAA,CAAU,iBAAA,EAAmB,KAAK,CAAA;AAE7D,MAAA,OAAO,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,MAAM,IAAA,CAAK,OAAA,GAA0D,EAAC,EAAG;AACxE,MAAA,IAAI,OAAA,CAAQ,QAAO,EAAG;AACrB,QAAA,OAAO,IAAA;AAAA,MACR;AAEA,MAAA,MAAM,qBAAqB,MAAM,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA,EAAG,iBAAA;AACrE,MAAA,OAAA,CAAQ,KAAK,iBAAiB,CAAA;AAE9B,MAAA,MAAM,mBAAmB,IAAI,gBAAA;AAAA,QAC5B,iBAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,UACC,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,YAAY,OAAA,CAAQ,UAAA;AAAA,UACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,UACpB,cAAc,OAAA,CAAQ;AAAA,SACvB;AAAA,QACA,OAAA,CAAQ,MAAA;AAAA,QACR,OAAA,CAAQ;AAAA,OACT;AACA,MAAA,OAAO,YAAA,CAAa,GAAA,CAAI,gBAAA,EAAkB,SAAS,CAAA;AAAA,IACpD;AAAA,GACD;AAEA,EAAA,OAAO,OAAA;AACR","file":"chunk-JLDHCI2O.js","sourcesContent":["import type { FlowRuntime } from '../runtime'\nimport { ExecutionContext } from '../runtime/execution-context'\nimport { StepByStepOrchestrator } from '../runtime/orchestrators/step-by-step'\nimport { WorkflowState } from '../runtime/state'\nimport { GraphTraverser } from '../runtime/traverser'\nimport type { NodeClass, NodeFunction, WorkflowBlueprint, WorkflowResult } from '../types'\n\n/**\n * Represents the controlled, step-by-step execution of a workflow.\n * Returned by the `createStepper` utility.\n */\nexport interface IWorkflowStepper<TContext extends Record<string, any>> {\n\t/** The current state of the workflow. Can be inspected after each step. */\n\treadonly state: WorkflowState<TContext>\n\n\t/** The graph traverser instance. Can be used to inspect the frontier or completed nodes. */\n\treadonly traverser: GraphTraverser\n\n\t/**\n\t * Executes the next \"turn\" or batch of ready nodes in the workflow.\n\t * @param options Optional configuration for this specific step, like a cancellation signal.\n\t * @returns A `WorkflowResult` representing the state after the step, or `null` if the workflow has already completed.\n\t */\n\tnext(options?: { signal?: AbortSignal; concurrency?: number }): Promise<WorkflowResult<TContext> | null>\n\n\t/**\n\t * Reverts the workflow to its previous state.\n\t * @returns The `WorkflowResult` of the previous state, or `null` if there is no history to revert to.\n\t */\n\tprev(): Promise<WorkflowResult<TContext> | null>\n\n\t/**\n\t * Resets the stepper to its initial state, clearing all progress and history.\n\t */\n\treset(): void\n\n\t/**\n\t * A convenience method to check if the workflow has any more steps to run.\n\t * @returns `true` if the workflow is complete or stalled, `false` otherwise.\n\t */\n\tisDone(): boolean\n}\n\n/**\n * A test utility that creates a stepper to execute a workflow one \"turn\" at a time.\n * This is invaluable for debugging and writing fine-grained tests where you need to\n * assert the state of the workflow after each logical step.\n *\n * @example\n * // In your test file\n * it('should correctly execute step-by-step', async () => {\n * const runtime = new FlowRuntime({ ... });\n * const flow = createFlow('test')\n * .node('a', async () => ({ output: 10 }))\n * .node('b', async ({ input }) => ({ output: input * 2 }))\n * .edge('a', 'b');\n *\n * const stepper = await createStepper(runtime, flow.toBlueprint(), flow.getFunctionRegistry());\n *\n * // First step (executes node 'a')\n * const result1 = await stepper.next();\n * expect(stepper.isDone()).toBe(false);\n * expect(result1.status).toBe('stalled');\n * expect(result1.context._outputs.a).toBe(10);\n *\n * // Second step (executes node 'b')\n * const result2 = await stepper.next();\n * expect(stepper.isDone()).toBe(true);\n * expect(result2.status).toBe('completed');\n * expect(result2.context._outputs.b).toBe(20);\n *\n * // Final step (no more work)\n * const result3 = await stepper.next();\n * expect(result3).toBeNull();\n * });\n *\n * @param runtime The `FlowRuntime` instance, used for its configuration.\n * @param blueprint The `WorkflowBlueprint` to execute.\n * @param functionRegistry The function registry from createFlow, containing the node implementations.\n * @param initialState The initial state for the workflow run.\n * @returns A Promise that resolves to an `IWorkflowStepper` instance.\n */\nexport async function createStepper<TContext extends Record<string, any>, TDependencies extends Record<string, any>>(\n\truntime: FlowRuntime<TContext, TDependencies>,\n\tblueprint: WorkflowBlueprint,\n\tfunctionRegistry: Map<string, NodeFunction | NodeClass>,\n\tinitialState: Partial<TContext> = {},\n): Promise<IWorkflowStepper<TContext>> {\n\tconst _initialBlueprint = structuredClone(blueprint)\n\tconst _initialState = structuredClone(initialState)\n\n\tlet state: WorkflowState<TContext>\n\tlet traverser: GraphTraverser\n\tconst history: string[] = []\n\n\tconst orchestrator = new StepByStepOrchestrator()\n\tconst executionId = globalThis.crypto?.randomUUID()\n\tconst nodeRegistry = new Map([...runtime.registry, ...functionRegistry])\n\n\tconst initialize = () => {\n\t\tstate = new WorkflowState<TContext>(_initialState)\n\t\ttraverser = new GraphTraverser(_initialBlueprint)\n\t\thistory.length = 0\n\t}\n\n\tinitialize()\n\n\tconst stepper: IWorkflowStepper<TContext> = {\n\t\tget state() {\n\t\t\treturn state\n\t\t},\n\t\tget traverser() {\n\t\t\treturn traverser\n\t\t},\n\t\tisDone() {\n\t\t\treturn !traverser.hasMoreWork() && !state.isAwaiting()\n\t\t},\n\t\treset() {\n\t\t\tinitialize()\n\t\t},\n\t\tasync prev() {\n\t\t\tconst previousStateJson = history.pop()\n\t\t\tif (!previousStateJson) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst previousStateData = runtime.serializer.deserialize(previousStateJson) as Partial<TContext>\n\n\t\t\tstate = new WorkflowState(previousStateData)\n\t\t\ttraverser = GraphTraverser.fromState(_initialBlueprint, state)\n\n\t\t\treturn state.toResult(runtime.serializer)\n\t\t},\n\t\tasync next(options: { signal?: AbortSignal; concurrency?: number } = {}) {\n\t\t\tif (stepper.isDone()) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tconst serializedContext = (await state.toResult(runtime.serializer)).serializedContext\n\t\t\thistory.push(serializedContext)\n\n\t\t\tconst executionContext = new ExecutionContext(\n\t\t\t\t_initialBlueprint,\n\t\t\t\tstate,\n\t\t\t\tnodeRegistry,\n\t\t\t\texecutionId,\n\t\t\t\truntime,\n\t\t\t\t{\n\t\t\t\t\tlogger: runtime.logger,\n\t\t\t\t\teventBus: runtime.eventBus,\n\t\t\t\t\tserializer: runtime.serializer,\n\t\t\t\t\tevaluator: runtime.evaluator,\n\t\t\t\t\tmiddleware: runtime.middleware,\n\t\t\t\t\tdependencies: runtime.dependencies,\n\t\t\t\t},\n\t\t\t\toptions.signal,\n\t\t\t\toptions.concurrency,\n\t\t\t)\n\t\t\treturn orchestrator.run(executionContext, traverser)\n\t\t},\n\t}\n\n\treturn stepper\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { WorkflowState } from './chunk-OO3FF3DF.js';
1
+ import { WorkflowState } from './chunk-5BOUGXZO.js';
2
2
 
3
3
  // src/runtime/execution-context.ts
4
4
  var ExecutionContext = class _ExecutionContext {
@@ -28,5 +28,5 @@ var ExecutionContext = class _ExecutionContext {
28
28
  };
29
29
 
30
30
  export { ExecutionContext };
31
- //# sourceMappingURL=chunk-KXXEA5VE.js.map
32
- //# sourceMappingURL=chunk-KXXEA5VE.js.map
31
+ //# sourceMappingURL=chunk-N4NLAIEN.js.map
32
+ //# sourceMappingURL=chunk-N4NLAIEN.js.map
@@ -1 +1 @@
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;AAAA,EACd;AAAA,EAEI,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-KXXEA5VE.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\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
+ {"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;AAAA,EACd;AAAA,EAEI,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-N4NLAIEN.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\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,17 +1,18 @@
1
+ import { WorkflowLogicHandler } from './chunk-SEI4Z3MO.js';
1
2
  import { NodeExecutorFactory } from './chunk-DL7KVYZF.js';
2
3
  import { WorkflowScheduler } from './chunk-LM4ACVHL.js';
3
- import { WorkflowLogicHandler } from './chunk-MCGK3FXQ.js';
4
- import { SleepNode } from './chunk-LJ4COM7S.js';
5
- import { SubflowNode } from './chunk-K6LPGUPR.js';
6
- import { GraphTraverser } from './chunk-G5BGBPFP.js';
7
- import { WaitNode } from './chunk-GVF7GQXQ.js';
8
- import { sanitizeBlueprint } from './chunk-DSYAC4WB.js';
9
4
  import { BatchGatherNode } from './chunk-BC4G7OM6.js';
10
5
  import { BatchScatterNode } from './chunk-RM677CNU.js';
11
- import { analyzeBlueprint } from './chunk-233SESC2.js';
12
- import { DefaultOrchestrator } from './chunk-NDWVLU7J.js';
13
- import { ExecutionContext } from './chunk-KXXEA5VE.js';
14
- import { WorkflowState } from './chunk-OO3FF3DF.js';
6
+ import { SleepNode } from './chunk-HNHM3FDK.js';
7
+ import { SubflowNode } from './chunk-UXIASXSG.js';
8
+ import { GraphTraverser } from './chunk-FBPY44WL.js';
9
+ import { WaitNode } from './chunk-IDTYHLDQ.js';
10
+ import { WebhookNode } from './chunk-I53JB2KW.js';
11
+ import { sanitizeBlueprint } from './chunk-DSYAC4WB.js';
12
+ import { analyzeBlueprint } from './chunk-ZLW4QOTS.js';
13
+ import { DefaultOrchestrator } from './chunk-XTW36KQZ.js';
14
+ import { ExecutionContext } from './chunk-N4NLAIEN.js';
15
+ import { WorkflowState } from './chunk-5BOUGXZO.js';
15
16
  import { NullLogger } from './chunk-4PELJWF7.js';
16
17
  import { JsonSerializer } from './chunk-CYHZ2YVH.js';
17
18
  import { DIContainer, ServiceTokens } from './chunk-WWGFIYKW.js';
@@ -74,6 +75,7 @@ var FlowRuntime = class {
74
75
  const builtInNodes = {
75
76
  wait: WaitNode,
76
77
  sleep: SleepNode,
78
+ webhook: WebhookNode,
77
79
  subflow: SubflowNode,
78
80
  "batch-scatter": BatchScatterNode,
79
81
  "batch-gather": BatchGatherNode,
@@ -472,5 +474,5 @@ var FlowRuntime = class {
472
474
  };
473
475
 
474
476
  export { FlowRuntime };
475
- //# sourceMappingURL=chunk-CHG6O6JX.js.map
476
- //# sourceMappingURL=chunk-CHG6O6JX.js.map
477
+ //# sourceMappingURL=chunk-OPRR4TAO.js.map
478
+ //# sourceMappingURL=chunk-OPRR4TAO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/runtime.ts"],"names":[],"mappings":"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","file":"chunk-OPRR4TAO.js","sourcesContent":["import type { BlueprintAnalysis } from '../analysis'\nimport { analyzeBlueprint } from '../analysis'\nimport { DIContainer, ServiceTokens } from '../container'\nimport { FlowcraftError } from '../errors'\nimport { PropertyEvaluator } from '../evaluator'\nimport { NullLogger } from '../logger'\nimport { BatchGatherNode } from '../nodes/batch-gather'\nimport { BatchScatterNode } from '../nodes/batch-scatter'\nimport { SleepNode } from '../nodes/sleep'\nimport { SubflowNode } from '../nodes/subflow'\nimport { WaitNode } from '../nodes/wait'\nimport { WebhookNode } from '../nodes/webhook'\nimport { sanitizeBlueprint } from '../sanitizer'\nimport { JsonSerializer } from '../serializer'\nimport type {\n\tContextImplementation,\n\tEdgeDefinition,\n\tIEvaluator,\n\tIEventBus,\n\tILogger,\n\tISerializer,\n\tMiddleware,\n\tNodeClass,\n\tNodeDefinition,\n\tNodeFunction,\n\tNodeResult,\n\tRuntimeOptions,\n\tWorkflowBlueprint,\n\tWorkflowError,\n\tWorkflowResult,\n} from '../types'\nimport { ExecutionContext } from './execution-context'\nimport { NodeExecutorFactory } from './node-executor-factory'\nimport { DefaultOrchestrator } from './orchestrator'\nimport { WorkflowScheduler } from './scheduler'\nimport { WorkflowState } from './state'\nimport { GraphTraverser } from './traverser'\nimport type { IOrchestrator, IRuntime } from './types'\nimport { WorkflowLogicHandler } from './workflow-logic-handler'\n\nexport class FlowRuntime<TContext extends Record<string, any>, TDependencies extends Record<string, any>>\n\timplements IRuntime<TContext, TDependencies>\n{\n\tprivate container: DIContainer\n\tpublic registry: Map<string, NodeFunction | NodeClass>\n\tprivate blueprints: Record<string, WorkflowBlueprint>\n\tpublic dependencies: TDependencies\n\tpublic logger: ILogger\n\tpublic eventBus: IEventBus\n\tpublic serializer: ISerializer\n\tpublic middleware: Middleware[]\n\tpublic evaluator: IEvaluator\n\tprivate analysisCache: WeakMap<WorkflowBlueprint, BlueprintAnalysis>\n\tpublic orchestrator: IOrchestrator\n\tpublic options: RuntimeOptions<TDependencies>\n\tprivate readonly logicHandler: WorkflowLogicHandler\n\tprivate readonly executorFactory: NodeExecutorFactory\n\tpublic scheduler: WorkflowScheduler\n\n\tgetBlueprint(id: string): WorkflowBlueprint | undefined {\n\t\treturn this.blueprints[id]\n\t}\n\n\tconstructor(container: DIContainer, options?: RuntimeOptions<TDependencies>)\n\tconstructor(options: RuntimeOptions<TDependencies>)\n\tconstructor(\n\t\tcontainerOrOptions: DIContainer | RuntimeOptions<TDependencies>,\n\t\tlegacyOptions?: RuntimeOptions<TDependencies>,\n\t) {\n\t\tif (containerOrOptions instanceof DIContainer) {\n\t\t\tthis.container = containerOrOptions\n\t\t\tthis.logger = this.container.resolve<ILogger>(ServiceTokens.Logger)\n\t\t\tthis.serializer = this.container.resolve<ISerializer>(ServiceTokens.Serializer)\n\t\t\tthis.evaluator = this.container.resolve<IEvaluator>(ServiceTokens.Evaluator)\n\t\t\tthis.eventBus = this.container.resolve<IEventBus>(ServiceTokens.EventBus) || { emit: async () => {} }\n\t\t\tthis.middleware = this.container.resolve<Middleware[]>(ServiceTokens.Middleware) || []\n\t\t\tthis.registry = this.container.resolve<Map<string, NodeFunction | NodeClass>>(ServiceTokens.NodeRegistry)\n\t\t\tthis.blueprints = this.container.resolve<Record<string, WorkflowBlueprint>>(ServiceTokens.BlueprintRegistry)\n\t\t\tthis.dependencies = this.container.resolve<TDependencies>(ServiceTokens.Dependencies)\n\t\t\tthis.options = legacyOptions || ({} as RuntimeOptions<TDependencies>)\n\t\t\tthis.orchestrator = this.container.resolve<IOrchestrator>(ServiceTokens.Orchestrator)\n\t\t\tthis.scheduler = new WorkflowScheduler(this)\n\t\t} else {\n\t\t\tconst options = containerOrOptions\n\t\t\tthis.logger = options.logger || new NullLogger()\n\t\t\tthis.serializer = options.serializer || new JsonSerializer()\n\t\t\tthis.evaluator = options.evaluator || new PropertyEvaluator()\n\t\t\tthis.eventBus = options.eventBus || { emit: async () => {} }\n\t\t\tthis.middleware = options.middleware || []\n\t\t\tconst loopControllerFunction: NodeFunction = async (context) => {\n\t\t\t\tconst condition = context.params.condition\n\t\t\t\tconst contextData = await context.context.toJSON()\n\t\t\t\tconst result = this.evaluator.evaluate(condition, contextData)\n\t\t\t\tif (result) {\n\t\t\t\t\treturn { action: 'continue' }\n\t\t\t\t} else {\n\t\t\t\t\treturn { action: 'break', output: null }\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst builtInNodes = {\n\t\t\t\twait: WaitNode,\n\t\t\t\tsleep: SleepNode,\n\t\t\t\twebhook: WebhookNode,\n\t\t\t\tsubflow: SubflowNode,\n\t\t\t\t'batch-scatter': BatchScatterNode,\n\t\t\t\t'batch-gather': BatchGatherNode,\n\t\t\t\t'loop-controller': loopControllerFunction,\n\t\t\t}\n\t\t\tthis.registry = new Map(Object.entries({ ...builtInNodes, ...(options.registry || {}) }))\n\t\t\tthis.blueprints = options.blueprints || {}\n\t\t\tthis.scheduler = new WorkflowScheduler(this)\n\t\t\tthis.dependencies = options.dependencies || ({} as TDependencies)\n\t\t\tthis.options = options\n\t\t\tthis.container = null as any\n\t\t}\n\t\tthis.orchestrator = this.container?.has(ServiceTokens.Orchestrator)\n\t\t\t? this.container.resolve<IOrchestrator>(ServiceTokens.Orchestrator)\n\t\t\t: new DefaultOrchestrator()\n\t\tthis.analysisCache = new WeakMap()\n\t\tthis.logicHandler = new WorkflowLogicHandler(this.evaluator, this.eventBus)\n\t\tthis.executorFactory = new NodeExecutorFactory(this.eventBus)\n\t}\n\n\tprivate _setupExecutionContext(\n\t\tblueprint: WorkflowBlueprint,\n\t\tinitialState: Partial<TContext> | string,\n\t\toptions?: {\n\t\t\tfunctionRegistry?: Map<string, any>\n\t\t\tstrict?: boolean\n\t\t\tsignal?: AbortSignal\n\t\t\tconcurrency?: number\n\t\t},\n\t): ExecutionContext<TContext, TDependencies> {\n\t\tconst executionId = globalThis.crypto?.randomUUID()\n\t\tconst contextData =\n\t\t\ttypeof initialState === 'string' ? (this.serializer.deserialize(initialState) as Partial<TContext>) : initialState\n\t\tblueprint = sanitizeBlueprint(blueprint)\n\t\tconst state = new WorkflowState<TContext>(contextData)\n\t\tconst nodeRegistry = this._createExecutionRegistry(options?.functionRegistry)\n\t\treturn new ExecutionContext(\n\t\t\tblueprint,\n\t\t\tstate,\n\t\t\tnodeRegistry,\n\t\t\texecutionId,\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tlogger: this.logger,\n\t\t\t\teventBus: this.eventBus,\n\t\t\t\tserializer: this.serializer,\n\t\t\t\tevaluator: this.evaluator,\n\t\t\t\tmiddleware: this.middleware,\n\t\t\t\tdependencies: this.dependencies,\n\t\t\t},\n\t\t\toptions?.signal,\n\t\t\toptions?.concurrency,\n\t\t)\n\t}\n\n\tasync run(\n\t\tblueprint: WorkflowBlueprint,\n\t\tinitialState: Partial<TContext> | string = {},\n\t\toptions?: {\n\t\t\tfunctionRegistry?: Map<string, any>\n\t\t\tstrict?: boolean\n\t\t\tsignal?: AbortSignal\n\t\t\tconcurrency?: number\n\t\t},\n\t): Promise<WorkflowResult<TContext>> {\n\t\tconst startTime = Date.now()\n\t\tconst executionContext = this._setupExecutionContext(blueprint, initialState, options)\n\n\t\tthis.logger.info(`Starting workflow execution`, {\n\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\texecutionId: executionContext.executionId,\n\t\t})\n\n\t\ttry {\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'workflow:start',\n\t\t\t\tpayload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId },\n\t\t\t})\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'workflow:resume',\n\t\t\t\tpayload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId },\n\t\t\t})\n\t\t\tconst analysis =\n\t\t\t\tthis.analysisCache.get(executionContext.blueprint) ??\n\t\t\t\t(() => {\n\t\t\t\t\tconst computed = analyzeBlueprint(executionContext.blueprint)\n\t\t\t\t\tthis.analysisCache.set(executionContext.blueprint, computed)\n\t\t\t\t\treturn computed\n\t\t\t\t})()\n\t\t\tif (options?.strict && !analysis.isDag) {\n\t\t\t\tthrow new Error(`Workflow '${executionContext.blueprint.id}' failed strictness check: Cycles are not allowed.`)\n\t\t\t}\n\t\t\tif (!analysis.isDag) {\n\t\t\t\tthis.logger.warn(`Workflow contains cycles`, {\n\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst traverser = new GraphTraverser(executionContext.blueprint, options?.strict === true)\n\t\t\tconst result = await this.orchestrator.run(executionContext, traverser)\n\n\t\t\tconst duration = Date.now() - startTime\n\t\t\tif (result.status === 'stalled') {\n\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\ttype: 'workflow:stall',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\t\tremainingNodes: traverser.getAllNodeIds().size - executionContext.state.getCompletedNodes().size,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\ttype: 'workflow:pause',\n\t\t\t\t\tpayload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId },\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.logger.info(`Workflow execution completed`, {\n\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\tstatus: result.status,\n\t\t\t\tduration,\n\t\t\t\terrors: result.errors?.length || 0,\n\t\t\t})\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'workflow:finish',\n\t\t\t\tpayload: {\n\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\tstatus: result.status,\n\t\t\t\t\terrors: result.errors,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (result.status === 'awaiting') {\n\t\t\t\tconst awaitingNodeIds = executionContext.state.getAwaitingNodeIds()\n\t\t\t\tfor (const nodeId of awaitingNodeIds) {\n\t\t\t\t\tconst details = executionContext.state.getAwaitingDetails(nodeId)\n\t\t\t\t\tif (details?.reason === 'timer') {\n\t\t\t\t\t\tthis.scheduler.registerAwaitingWorkflow(\n\t\t\t\t\t\t\texecutionContext.executionId,\n\t\t\t\t\t\t\texecutionContext.blueprint.id,\n\t\t\t\t\t\t\tresult.serializedContext,\n\t\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\t\tdetails.wakeUpAt,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result\n\t\t} catch (error) {\n\t\t\tconst duration = Date.now() - startTime\n\t\t\tconst workflowError: WorkflowError = {\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tisFatal: false,\n\t\t\t\tname: 'WorkflowError',\n\t\t\t}\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'workflow:finish',\n\t\t\t\tpayload: {\n\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\tstatus: 'cancelled',\n\t\t\t\t\terrors: [workflowError],\n\t\t\t\t},\n\t\t\t})\n\t\t\tif (\n\t\t\t\terror instanceof DOMException\n\t\t\t\t\t? error.name === 'AbortError'\n\t\t\t\t\t: error instanceof FlowcraftError && error.message.includes('cancelled')\n\t\t\t) {\n\t\t\t\tthis.logger.info(`Workflow execution cancelled`, {\n\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\tduration,\n\t\t\t\t})\n\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\ttype: 'workflow:pause',\n\t\t\t\t\tpayload: { blueprintId: executionContext.blueprint.id, executionId: executionContext.executionId },\n\t\t\t\t})\n\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\ttype: 'workflow:finish',\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\t\t\tstatus: 'cancelled',\n\t\t\t\t\t\terrors: [workflowError],\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\treturn {\n\t\t\t\t\tcontext: {} as TContext,\n\t\t\t\t\tserializedContext: '{}',\n\t\t\t\t\tstatus: 'cancelled',\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.logger.error(`Workflow execution failed`, {\n\t\t\t\tblueprintId: executionContext.blueprint.id,\n\t\t\t\texecutionId: executionContext.executionId,\n\t\t\t\tduration,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t})\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tstartScheduler(): void {\n\t\tthis.scheduler.start()\n\t}\n\n\tstopScheduler(): void {\n\t\tthis.scheduler.stop()\n\t}\n\n\tprivate _setupResumedExecutionContext(\n\t\tblueprint: WorkflowBlueprint,\n\t\tworkflowState: WorkflowState<TContext>,\n\t\toptions?: {\n\t\t\tfunctionRegistry?: Map<string, any>\n\t\t\tstrict?: boolean\n\t\t\tsignal?: AbortSignal\n\t\t\tconcurrency?: number\n\t\t},\n\t): ExecutionContext<TContext, TDependencies> {\n\t\tconst executionId = globalThis.crypto?.randomUUID()\n\t\tconst nodeRegistry = this._createExecutionRegistry(options?.functionRegistry)\n\t\treturn new ExecutionContext(\n\t\t\tblueprint,\n\t\t\tworkflowState,\n\t\t\tnodeRegistry,\n\t\t\texecutionId,\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tlogger: this.logger,\n\t\t\t\teventBus: this.eventBus,\n\t\t\t\tserializer: this.serializer,\n\t\t\t\tevaluator: this.evaluator,\n\t\t\t\tmiddleware: this.middleware,\n\t\t\t\tdependencies: this.dependencies,\n\t\t\t},\n\t\t\toptions?.signal,\n\t\t)\n\t}\n\n\tasync resume(\n\t\tblueprint: WorkflowBlueprint,\n\t\tserializedContext: string,\n\t\tresumeData: { output?: any; action?: string },\n\t\tnodeId?: string,\n\t\toptions?: {\n\t\t\tfunctionRegistry?: Map<string, any>\n\t\t\tstrict?: boolean\n\t\t\tsignal?: AbortSignal\n\t\t\tconcurrency?: number\n\t\t},\n\t): Promise<WorkflowResult<TContext>> {\n\t\tconst executionId = globalThis.crypto?.randomUUID()\n\t\tconst workflowState = new WorkflowState<TContext>(\n\t\t\tthis.serializer.deserialize(serializedContext) as Partial<TContext>,\n\t\t)\n\n\t\tconst awaitingNodeIds = workflowState.getAwaitingNodeIds()\n\t\tif (awaitingNodeIds.length === 0) {\n\t\t\tthrow new FlowcraftError('Cannot resume: The provided context is not in an awaiting state.', {\n\t\t\t\tisFatal: true,\n\t\t\t})\n\t\t}\n\n\t\tconst awaitingNodeId = nodeId || awaitingNodeIds[0]\n\t\tif (!awaitingNodeIds.includes(awaitingNodeId)) {\n\t\t\tthrow new FlowcraftError(`Cannot resume: Node '${awaitingNodeId}' is not in an awaiting state.`, {\n\t\t\t\tisFatal: true,\n\t\t\t})\n\t\t}\n\n\t\tconst awaitingNodeDef = blueprint.nodes.find((n) => n.id === awaitingNodeId)\n\t\tif (!awaitingNodeDef) {\n\t\t\tthrow new FlowcraftError(`Awaiting node '${awaitingNodeId}' not found in blueprint.`, {\n\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\tisFatal: true,\n\t\t\t})\n\t\t}\n\n\t\tconst contextImpl = workflowState.getContext()\n\n\t\tif (awaitingNodeDef.uses === 'SubflowNode') {\n\t\t\tconst subflowStateKey = `_subflowState.${awaitingNodeId}`\n\t\t\tconst asyncContext = contextImpl\n\t\t\tconst subflowContext = (await asyncContext.get(subflowStateKey as any)) as string\n\n\t\t\tif (!subflowContext) {\n\t\t\t\tthrow new FlowcraftError(`Cannot resume: Subflow state for node '${awaitingNodeId}' not found.`, {\n\t\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\tisFatal: true,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst blueprintId = awaitingNodeDef.params?.blueprintId\n\t\t\tif (!blueprintId) {\n\t\t\t\tthrow new FlowcraftError(`Subflow node '${awaitingNodeId}' is missing the 'blueprintId' parameter.`, {\n\t\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\tisFatal: true,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst subBlueprint = this.blueprints[blueprintId]\n\t\t\tif (!subBlueprint) {\n\t\t\t\tthrow new FlowcraftError(`Sub-blueprint with ID '${blueprintId}' not found in runtime registry.`, {\n\t\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\tisFatal: true,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst subflowResumeResult = await this.resume(subBlueprint, subflowContext, resumeData, undefined, options)\n\n\t\t\tif (subflowResumeResult.status !== 'completed') {\n\t\t\t\tthrow new FlowcraftError(\n\t\t\t\t\t`Resumed subflow '${subBlueprint.id}' did not complete. Status: ${subflowResumeResult.status}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tnodeId: awaitingNodeId,\n\t\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\t\tisFatal: false,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// mirror the output extraction logic from SubflowNode.exec\n\t\t\tconst subflowFinalContext = subflowResumeResult.context as Record<string, any>\n\t\t\tlet finalSubflowOutput: any\n\t\t\tconst subAnalysis = analyzeBlueprint(subBlueprint)\n\n\t\t\tif (awaitingNodeDef.params?.outputs) {\n\t\t\t\tfinalSubflowOutput = subflowFinalContext\n\t\t\t} else if (subAnalysis.terminalNodeIds.length === 1) {\n\t\t\t\tconst terminalId = subAnalysis.terminalNodeIds[0]\n\t\t\t\tfinalSubflowOutput = subflowFinalContext[`_outputs.${terminalId}`]\n\t\t\t} else {\n\t\t\t\tconst terminalOutputs: Record<string, any> = {}\n\t\t\t\tfor (const terminalId of subAnalysis.terminalNodeIds) {\n\t\t\t\t\tterminalOutputs[terminalId] = subflowFinalContext[`_outputs.${terminalId}`]\n\t\t\t\t}\n\t\t\t\tfinalSubflowOutput = terminalOutputs\n\t\t\t}\n\n\t\t\tresumeData = { output: finalSubflowOutput }\n\n\t\t\tawait contextImpl.delete(subflowStateKey as any)\n\t\t}\n\n\t\tworkflowState.addCompletedNode(awaitingNodeId, resumeData.output)\n\n\t\tconst nextSteps = await this.determineNextNodes(blueprint, awaitingNodeId, resumeData, contextImpl, executionId)\n\n\t\tif (nextSteps.length === 0) {\n\t\t\tworkflowState.clearAwaiting(awaitingNodeId)\n\t\t\tconst result = await workflowState.toResult(this.serializer)\n\t\t\tresult.status = 'completed'\n\t\t\treturn result\n\t\t}\n\n\t\tconst traverserForResume = new GraphTraverser(blueprint)\n\t\tconst allPredecessors = traverserForResume.getAllPredecessors()\n\n\t\tfor (const { node, edge } of nextSteps) {\n\t\t\tawait this.applyEdgeTransform(edge, resumeData, node, contextImpl, allPredecessors)\n\t\t}\n\n\t\tconst traverser = GraphTraverser.fromState(blueprint, workflowState)\n\n\t\tconst nextNodeDefs = nextSteps.map((s) => s.node)\n\t\tfor (const nodeDef of nextNodeDefs) {\n\t\t\ttraverser.addToFrontier(nodeDef.id)\n\t\t}\n\n\t\tworkflowState.clearAwaiting(awaitingNodeId)\n\n\t\tconst executionContext = this._setupResumedExecutionContext(blueprint, workflowState, options)\n\n\t\treturn await this.orchestrator.run(executionContext, traverser)\n\t}\n\n\tpublic _createExecutionRegistry(dynamicRegistry?: Map<string, any>): Map<string, NodeFunction | NodeClass> {\n\t\tconst executionRegistry = new Map(this.registry)\n\t\tif (dynamicRegistry) {\n\t\t\tfor (const [key, func] of dynamicRegistry.entries()) {\n\t\t\t\texecutionRegistry.set(key, func)\n\t\t\t}\n\t\t}\n\t\treturn executionRegistry\n\t}\n\n\tasync executeNode(\n\t\tblueprint: WorkflowBlueprint,\n\t\tnodeId: string,\n\t\tstate: WorkflowState<TContext>,\n\t\t_allPredecessors?: Map<string, Set<string>>,\n\t\tfunctionRegistry?: Map<string, any>,\n\t\texecutionId?: string,\n\t\tsignal?: AbortSignal,\n\t): Promise<NodeResult<any, any>> {\n\t\tconst nodeDef = blueprint.nodes.find((n) => n.id === nodeId)\n\t\tif (!nodeDef) {\n\t\t\tthrow new FlowcraftError(`Node '${nodeId}' not found in blueprint.`, {\n\t\t\t\tnodeId,\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\texecutionId,\n\t\t\t\tisFatal: false,\n\t\t\t})\n\t\t}\n\n\t\tconst contextImpl = state.getContext()\n\t\tconst asyncContext = contextImpl\n\n\t\tconst input = await this.resolveNodeInput(nodeDef.id, blueprint, asyncContext)\n\t\tconst nodeRegistry = new Map([...this.registry, ...(functionRegistry || new Map())])\n\n\t\tconst services = {\n\t\t\tlogger: this.logger,\n\t\t\teventBus: this.eventBus,\n\t\t\tserializer: this.serializer,\n\t\t\tevaluator: this.evaluator,\n\t\t\tmiddleware: this.middleware,\n\t\t\tdependencies: this.dependencies,\n\t\t}\n\t\tconst context = new ExecutionContext(blueprint, state, nodeRegistry, executionId || '', this, services, signal)\n\n\t\tconst executor = this.executorFactory.createExecutorForNode(nodeId, context)\n\n\t\tconst executionResult = await executor.execute(input)\n\n\t\tif (executionResult.status === 'success') {\n\t\t\treturn executionResult.result\n\t\t}\n\n\t\tif (executionResult.status === 'failed_with_fallback') {\n\t\t\tconst fallbackNode = blueprint.nodes.find((n: NodeDefinition) => n.id === executionResult.fallbackNodeId)\n\t\t\tif (!fallbackNode) {\n\t\t\t\tthrow new FlowcraftError(`Fallback node '${executionResult.fallbackNodeId}' not found in blueprint.`, {\n\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\texecutionId,\n\t\t\t\t\tisFatal: false,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst fallbackInput = await this.resolveNodeInput(fallbackNode.id, blueprint, asyncContext)\n\t\t\tconst fallbackExecutor = this.executorFactory.createExecutorForNode(fallbackNode.id, context)\n\n\t\t\tconst fallbackResult = await fallbackExecutor.execute(fallbackInput)\n\t\t\tif (fallbackResult.status === 'success') {\n\t\t\t\tstate.markFallbackExecuted()\n\t\t\t\tstate.addCompletedNode(executionResult.fallbackNodeId, fallbackResult.result.output)\n\t\t\t\tthis.logger.info(`Fallback execution completed`, {\n\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\tfallbackNodeId: executionResult.fallbackNodeId,\n\t\t\t\t\texecutionId,\n\t\t\t\t})\n\t\t\t\treturn { ...fallbackResult.result, _fallbackExecuted: true }\n\t\t\t}\n\n\t\t\tthrow fallbackResult.error\n\t\t}\n\n\t\tthrow executionResult.error\n\t}\n\n\tpublic getExecutorForNode(nodeId: string, context: ExecutionContext<TContext, TDependencies>): any {\n\t\treturn this.executorFactory.createExecutorForNode(nodeId, context)\n\t}\n\n\tpublic createForSubflow(\n\t\tsubBlueprint: WorkflowBlueprint,\n\t\tinitialSubState: Partial<TContext>,\n\t\texecutionId: string,\n\t\tsignal?: AbortSignal,\n\t): ExecutionContext<TContext, TDependencies> {\n\t\tconst subState = new WorkflowState<TContext>(initialSubState)\n\t\treturn new ExecutionContext(\n\t\t\tsubBlueprint,\n\t\t\tsubState,\n\t\t\tthis.registry,\n\t\t\texecutionId,\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tlogger: this.logger,\n\t\t\t\teventBus: this.eventBus,\n\t\t\t\tserializer: this.serializer,\n\t\t\t\tevaluator: this.evaluator,\n\t\t\t\tmiddleware: this.middleware,\n\t\t\t\tdependencies: this.dependencies,\n\t\t\t},\n\t\t\tsignal,\n\t\t)\n\t}\n\n\tasync determineNextNodes(\n\t\tblueprint: WorkflowBlueprint,\n\t\tnodeId: string,\n\t\tresult: NodeResult<any, any>,\n\t\tcontext: ContextImplementation<TContext>,\n\t\texecutionId?: string,\n\t): Promise<{ node: NodeDefinition; edge: EdgeDefinition }[]> {\n\t\treturn this.logicHandler.determineNextNodes(blueprint, nodeId, result, context, executionId)\n\t}\n\n\tpublic async applyEdgeTransform(\n\t\tedge: EdgeDefinition,\n\t\tsourceResult: NodeResult<any, any>,\n\t\ttargetNode: NodeDefinition,\n\t\tcontext: ContextImplementation<TContext>,\n\t\tallPredecessors?: Map<string, Set<string>>,\n\t): Promise<void> {\n\t\treturn this.logicHandler.applyEdgeTransform(edge, sourceResult, targetNode, context, allPredecessors)\n\t}\n\n\tpublic async resolveNodeInput(\n\t\tnodeId: string,\n\t\tblueprint: WorkflowBlueprint,\n\t\tcontext: ContextImplementation<TContext>,\n\t): Promise<any> {\n\t\treturn this.logicHandler.resolveNodeInput(nodeId, blueprint, context)\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { AsyncContextView } from './chunk-R3HQXIEL.js';
1
+ import { AsyncContextView } from './chunk-XDI4TJHA.js';
2
2
  import { FlowcraftError } from './chunk-BCRWXTWX.js';
3
3
 
4
4
  // src/runtime/workflow-logic-handler.ts
@@ -139,5 +139,5 @@ var WorkflowLogicHandler = class {
139
139
  };
140
140
 
141
141
  export { WorkflowLogicHandler };
142
- //# sourceMappingURL=chunk-MCGK3FXQ.js.map
143
- //# sourceMappingURL=chunk-MCGK3FXQ.js.map
142
+ //# sourceMappingURL=chunk-SEI4Z3MO.js.map
143
+ //# sourceMappingURL=chunk-SEI4Z3MO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/workflow-logic-handler.ts"],"names":[],"mappings":"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","file":"chunk-MCGK3FXQ.js","sourcesContent":["import { AsyncContextView } from '../context'\nimport { FlowcraftError } from '../errors'\nimport type {\n\tContextImplementation,\n\tEdgeDefinition,\n\tIEvaluator,\n\tIEventBus,\n\tNodeDefinition,\n\tNodeResult,\n\tWorkflowBlueprint,\n} from '../types'\n\nexport class WorkflowLogicHandler {\n\tconstructor(\n\t\tprivate readonly evaluator: IEvaluator,\n\t\tprivate readonly eventBus: IEventBus,\n\t) {}\n\n\tpublic async determineNextNodes(\n\t\tblueprint: WorkflowBlueprint,\n\t\tcompletedNodeId: string,\n\t\tresult: NodeResult<any, any>,\n\t\tcontext: ContextImplementation<any>,\n\t\texecutionId?: string,\n\t): Promise<{ node: NodeDefinition; edge: EdgeDefinition }[]> {\n\t\tlet effectiveSourceNodeId = completedNodeId\n\t\tconst completedNodeDef = blueprint.nodes.find((n) => n.id === completedNodeId)\n\t\tif (completedNodeDef?.uses === 'loop-controller' && result.action !== 'continue')\n\t\t\t// act as if the loop's end node just finished\n\t\t\teffectiveSourceNodeId = completedNodeDef.params?.endNodeId\n\n\t\tlet directOutgoingEdges = blueprint.edges.filter((edge) => edge.source === effectiveSourceNodeId)\n\t\tif (effectiveSourceNodeId !== completedNodeId)\n\t\t\t// breaking from a loop, ignore the edge that leads back to the controller\n\t\t\tdirectOutgoingEdges = directOutgoingEdges.filter((edge) => edge.target !== completedNodeId)\n\n\t\tconst nodesThisIsAFallbackFor = blueprint.nodes.filter((n) => n.config?.fallback === completedNodeId)\n\t\tconst inheritedOutgoingEdges = nodesThisIsAFallbackFor.flatMap((originalNode) =>\n\t\t\tblueprint.edges.filter((edge) => edge.source === originalNode.id),\n\t\t)\n\t\tconst allPossibleEdges = [...directOutgoingEdges, ...inheritedOutgoingEdges]\n\t\tconst outgoingEdges = [\n\t\t\t...new Map(\n\t\t\t\tallPossibleEdges.map((edge) => [\n\t\t\t\t\t`${edge.source}-${edge.target}-${edge.action || ''}-${edge.condition || ''}`,\n\t\t\t\t\tedge,\n\t\t\t\t]),\n\t\t\t).values(),\n\t\t]\n\n\t\tconst matched: { node: NodeDefinition; edge: EdgeDefinition }[] = []\n\t\tconst evaluateEdge = async (edge: EdgeDefinition): Promise<boolean> => {\n\t\t\tif (!edge.condition) return true\n\t\t\tconst contextData = context.type === 'sync' ? context.toJSON() : await context.toJSON()\n\t\t\tconst evaluationResult = !!this.evaluator.evaluate(edge.condition, {\n\t\t\t\t...contextData,\n\t\t\t\tresult,\n\t\t\t})\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'edge:evaluate',\n\t\t\t\tpayload: { source: edge.source, target: edge.target, condition: edge.condition, result: evaluationResult },\n\t\t\t})\n\t\t\treturn evaluationResult\n\t\t}\n\n\t\tif (result.action) {\n\t\t\tconst actionEdges = outgoingEdges.filter((edge) => edge.action === result.action)\n\t\t\tfor (const edge of actionEdges) {\n\t\t\t\tif (await evaluateEdge(edge)) {\n\t\t\t\t\tconst targetNode = blueprint.nodes.find((n) => n.id === edge.target)\n\t\t\t\t\tif (targetNode) matched.push({ node: targetNode, edge })\n\t\t\t\t} else {\n\t\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\t\ttype: 'node:skipped',\n\t\t\t\t\t\tpayload: { nodeId: completedNodeId, edge, executionId: executionId || '', blueprintId: blueprint.id },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (matched.length === 0) {\n\t\t\tconst defaultEdges = outgoingEdges.filter((edge) => !edge.action)\n\t\t\tfor (const edge of defaultEdges) {\n\t\t\t\tif (await evaluateEdge(edge)) {\n\t\t\t\t\tconst targetNode = blueprint.nodes.find((n) => n.id === edge.target)\n\t\t\t\t\tif (targetNode) matched.push({ node: targetNode, edge })\n\t\t\t\t} else {\n\t\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\t\ttype: 'node:skipped',\n\t\t\t\t\t\tpayload: { nodeId: completedNodeId, edge, executionId: executionId || '', blueprintId: blueprint.id },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn matched\n\t}\n\n\tpublic async applyEdgeTransform(\n\t\tedge: EdgeDefinition,\n\t\tsourceResult: NodeResult<any, any>,\n\t\ttargetNode: NodeDefinition,\n\t\tcontext: ContextImplementation<any>,\n\t\tallPredecessors?: Map<string, Set<string>>,\n\t): Promise<void> {\n\t\tconst asyncContext = context.type === 'sync' ? new AsyncContextView(context) : context\n\t\tconst predecessors = allPredecessors?.get(targetNode.id)\n\t\tconst hasSinglePredecessor = predecessors && predecessors.size === 1\n\t\tconst hasExplicitInputs = targetNode.inputs !== undefined\n\t\tconst hasEdgeTransform = edge.transform !== undefined\n\n\t\tif (!hasExplicitInputs && !hasSinglePredecessor && !hasEdgeTransform) {\n\t\t\treturn\n\t\t}\n\n\t\tconst finalInput = edge.transform\n\t\t\t? this.evaluator.evaluate(edge.transform, {\n\t\t\t\t\tinput: sourceResult.output,\n\t\t\t\t\tcontext: await asyncContext.toJSON(),\n\t\t\t\t})\n\t\t\t: sourceResult.output\n\t\tconst inputKey = `_inputs.${targetNode.id}`\n\t\tawait asyncContext.set(inputKey as any, finalInput)\n\t\tawait this.eventBus.emit({\n\t\t\ttype: 'context:change',\n\t\t\tpayload: { sourceNode: edge.source, key: inputKey, value: finalInput },\n\t\t})\n\t\tif (!hasExplicitInputs) {\n\t\t\ttargetNode.inputs = inputKey\n\t\t}\n\t}\n\n\tpublic async resolveNodeInput(\n\t\tnodeId: string,\n\t\tblueprint: WorkflowBlueprint,\n\t\tcontext: ContextImplementation<any>,\n\t): Promise<any> {\n\t\tconst nodeDef = blueprint.nodes.find((n) => n.id === nodeId)\n\t\tif (!nodeDef) {\n\t\t\tthrow new FlowcraftError(`Node '${nodeId}' not found in blueprint.`, {\n\t\t\t\tnodeId,\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\tisFatal: false,\n\t\t\t})\n\t\t}\n\t\tconst asyncContext = context.type === 'sync' ? new AsyncContextView(context) : context\n\t\tif (nodeDef.inputs) {\n\t\t\tif (typeof nodeDef.inputs === 'string') {\n\t\t\t\tconst key = nodeDef.inputs\n\t\t\t\tif (key.startsWith('_')) return await asyncContext.get(key as any)\n\t\t\t\tconst outputKey = `_outputs.${key}`\n\t\t\t\tif (await asyncContext.has(outputKey as any)) {\n\t\t\t\t\treturn await asyncContext.get(outputKey as any)\n\t\t\t\t}\n\t\t\t\treturn await asyncContext.get(key as any)\n\t\t\t}\n\t\t\tif (typeof nodeDef.inputs === 'object') {\n\t\t\t\tconst input: Record<string, any> = {}\n\t\t\t\tfor (const key in nodeDef.inputs) {\n\t\t\t\t\tconst contextKey = nodeDef.inputs[key]\n\t\t\t\t\tif (contextKey.startsWith('_')) {\n\t\t\t\t\t\tinput[key] = await asyncContext.get(contextKey as any)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst outputKey = `_outputs.${contextKey}`\n\t\t\t\t\t\tif (await asyncContext.has(outputKey as any)) {\n\t\t\t\t\t\t\tinput[key] = await asyncContext.get(outputKey as any)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinput[key] = await asyncContext.get(contextKey as any)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn input\n\t\t\t}\n\t\t}\n\t\t// Default to standardized input key\n\t\tconst inputKey = `_inputs.${nodeDef.id}`\n\t\treturn await asyncContext.get(inputKey as any)\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../src/runtime/workflow-logic-handler.ts"],"names":[],"mappings":"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","file":"chunk-SEI4Z3MO.js","sourcesContent":["import { AsyncContextView } from '../context'\nimport { FlowcraftError } from '../errors'\nimport type {\n\tContextImplementation,\n\tEdgeDefinition,\n\tIEvaluator,\n\tIEventBus,\n\tNodeDefinition,\n\tNodeResult,\n\tWorkflowBlueprint,\n} from '../types'\n\nexport class WorkflowLogicHandler {\n\tconstructor(\n\t\tprivate readonly evaluator: IEvaluator,\n\t\tprivate readonly eventBus: IEventBus,\n\t) {}\n\n\tpublic async determineNextNodes(\n\t\tblueprint: WorkflowBlueprint,\n\t\tcompletedNodeId: string,\n\t\tresult: NodeResult<any, any>,\n\t\tcontext: ContextImplementation<any>,\n\t\texecutionId?: string,\n\t): Promise<{ node: NodeDefinition; edge: EdgeDefinition }[]> {\n\t\tlet effectiveSourceNodeId = completedNodeId\n\t\tconst completedNodeDef = blueprint.nodes.find((n) => n.id === completedNodeId)\n\t\tif (completedNodeDef?.uses === 'loop-controller' && result.action !== 'continue')\n\t\t\t// act as if the loop's end node just finished\n\t\t\teffectiveSourceNodeId = completedNodeDef.params?.endNodeId\n\n\t\tlet directOutgoingEdges = blueprint.edges.filter((edge) => edge.source === effectiveSourceNodeId)\n\t\tif (effectiveSourceNodeId !== completedNodeId)\n\t\t\t// breaking from a loop, ignore the edge that leads back to the controller\n\t\t\tdirectOutgoingEdges = directOutgoingEdges.filter((edge) => edge.target !== completedNodeId)\n\n\t\tconst nodesThisIsAFallbackFor = blueprint.nodes.filter((n) => n.config?.fallback === completedNodeId)\n\t\tconst inheritedOutgoingEdges = nodesThisIsAFallbackFor.flatMap((originalNode) =>\n\t\t\tblueprint.edges.filter((edge) => edge.source === originalNode.id),\n\t\t)\n\t\tconst allPossibleEdges = [...directOutgoingEdges, ...inheritedOutgoingEdges]\n\t\tconst outgoingEdges = [\n\t\t\t...new Map(\n\t\t\t\tallPossibleEdges.map((edge) => [\n\t\t\t\t\t`${edge.source}-${edge.target}-${edge.action || ''}-${edge.condition || ''}`,\n\t\t\t\t\tedge,\n\t\t\t\t]),\n\t\t\t).values(),\n\t\t]\n\n\t\tconst matched: { node: NodeDefinition; edge: EdgeDefinition }[] = []\n\t\tconst evaluateEdge = async (edge: EdgeDefinition): Promise<boolean> => {\n\t\t\tif (!edge.condition) return true\n\t\t\tconst contextData = context.type === 'sync' ? context.toJSON() : await context.toJSON()\n\t\t\tconst evaluationResult = !!this.evaluator.evaluate(edge.condition, {\n\t\t\t\t...contextData,\n\t\t\t\tresult,\n\t\t\t})\n\t\t\tawait this.eventBus.emit({\n\t\t\t\ttype: 'edge:evaluate',\n\t\t\t\tpayload: { source: edge.source, target: edge.target, condition: edge.condition, result: evaluationResult },\n\t\t\t})\n\t\t\treturn evaluationResult\n\t\t}\n\n\t\tif (result.action) {\n\t\t\tconst actionEdges = outgoingEdges.filter((edge) => edge.action === result.action)\n\t\t\tfor (const edge of actionEdges) {\n\t\t\t\tif (await evaluateEdge(edge)) {\n\t\t\t\t\tconst targetNode = blueprint.nodes.find((n) => n.id === edge.target)\n\t\t\t\t\tif (targetNode) matched.push({ node: targetNode, edge })\n\t\t\t\t} else {\n\t\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\t\ttype: 'node:skipped',\n\t\t\t\t\t\tpayload: { nodeId: completedNodeId, edge, executionId: executionId || '', blueprintId: blueprint.id },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (matched.length === 0) {\n\t\t\tconst defaultEdges = outgoingEdges.filter((edge) => !edge.action)\n\t\t\tfor (const edge of defaultEdges) {\n\t\t\t\tif (await evaluateEdge(edge)) {\n\t\t\t\t\tconst targetNode = blueprint.nodes.find((n) => n.id === edge.target)\n\t\t\t\t\tif (targetNode) matched.push({ node: targetNode, edge })\n\t\t\t\t} else {\n\t\t\t\t\tawait this.eventBus.emit({\n\t\t\t\t\t\ttype: 'node:skipped',\n\t\t\t\t\t\tpayload: { nodeId: completedNodeId, edge, executionId: executionId || '', blueprintId: blueprint.id },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn matched\n\t}\n\n\tpublic async applyEdgeTransform(\n\t\tedge: EdgeDefinition,\n\t\tsourceResult: NodeResult<any, any>,\n\t\ttargetNode: NodeDefinition,\n\t\tcontext: ContextImplementation<any>,\n\t\tallPredecessors?: Map<string, Set<string>>,\n\t): Promise<void> {\n\t\tconst asyncContext = context.type === 'sync' ? new AsyncContextView(context) : context\n\t\tconst predecessors = allPredecessors?.get(targetNode.id)\n\t\tconst hasSinglePredecessor = predecessors && predecessors.size === 1\n\t\tconst hasExplicitInputs = targetNode.inputs !== undefined\n\t\tconst hasEdgeTransform = edge.transform !== undefined\n\n\t\tif (!hasExplicitInputs && !hasSinglePredecessor && !hasEdgeTransform) {\n\t\t\treturn\n\t\t}\n\n\t\tconst finalInput = edge.transform\n\t\t\t? this.evaluator.evaluate(edge.transform, {\n\t\t\t\t\tinput: sourceResult.output,\n\t\t\t\t\tcontext: await asyncContext.toJSON(),\n\t\t\t\t})\n\t\t\t: sourceResult.output\n\t\tconst inputKey = `_inputs.${targetNode.id}`\n\t\tawait asyncContext.set(inputKey as any, finalInput)\n\t\tawait this.eventBus.emit({\n\t\t\ttype: 'context:change',\n\t\t\tpayload: { sourceNode: edge.source, key: inputKey, value: finalInput },\n\t\t})\n\t\tif (!hasExplicitInputs) {\n\t\t\ttargetNode.inputs = inputKey\n\t\t}\n\t}\n\n\tpublic async resolveNodeInput(\n\t\tnodeId: string,\n\t\tblueprint: WorkflowBlueprint,\n\t\tcontext: ContextImplementation<any>,\n\t): Promise<any> {\n\t\tconst nodeDef = blueprint.nodes.find((n) => n.id === nodeId)\n\t\tif (!nodeDef) {\n\t\t\tthrow new FlowcraftError(`Node '${nodeId}' not found in blueprint.`, {\n\t\t\t\tnodeId,\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\tisFatal: false,\n\t\t\t})\n\t\t}\n\t\tconst asyncContext = context.type === 'sync' ? new AsyncContextView(context) : context\n\t\tif (nodeDef.inputs) {\n\t\t\tif (typeof nodeDef.inputs === 'string') {\n\t\t\t\tconst key = nodeDef.inputs\n\t\t\t\tif (key.startsWith('_')) return await asyncContext.get(key as any)\n\t\t\t\tconst outputKey = `_outputs.${key}`\n\t\t\t\tif (await asyncContext.has(outputKey as any)) {\n\t\t\t\t\treturn await asyncContext.get(outputKey as any)\n\t\t\t\t}\n\t\t\t\treturn await asyncContext.get(key as any)\n\t\t\t}\n\t\t\tif (typeof nodeDef.inputs === 'object') {\n\t\t\t\tconst input: Record<string, any> = {}\n\t\t\t\tfor (const key in nodeDef.inputs) {\n\t\t\t\t\tconst contextKey = nodeDef.inputs[key]\n\t\t\t\t\tif (contextKey.startsWith('_')) {\n\t\t\t\t\t\tinput[key] = await asyncContext.get(contextKey as any)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst outputKey = `_outputs.${contextKey}`\n\t\t\t\t\t\tif (await asyncContext.has(outputKey as any)) {\n\t\t\t\t\t\t\tinput[key] = await asyncContext.get(outputKey as any)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinput[key] = await asyncContext.get(contextKey as any)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn input\n\t\t\t}\n\t\t}\n\t\t// Default to standardized input key\n\t\tconst inputKey = `_inputs.${nodeDef.id}`\n\t\treturn await asyncContext.get(inputKey as any)\n\t}\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { GraphTraverser } from './chunk-G5BGBPFP.js';
2
- import { analyzeBlueprint } from './chunk-233SESC2.js';
3
- import { ExecutionContext } from './chunk-KXXEA5VE.js';
4
- import { WorkflowState } from './chunk-OO3FF3DF.js';
1
+ import { GraphTraverser } from './chunk-FBPY44WL.js';
2
+ import { analyzeBlueprint } from './chunk-ZLW4QOTS.js';
3
+ import { ExecutionContext } from './chunk-N4NLAIEN.js';
4
+ import { WorkflowState } from './chunk-5BOUGXZO.js';
5
5
  import { FlowcraftError } from './chunk-BCRWXTWX.js';
6
6
  import { BaseNode } from './chunk-LNK7LZER.js';
7
7
 
@@ -47,7 +47,7 @@ var SubflowNode = class extends BaseNode {
47
47
  const subflowTraverser = new GraphTraverser(subBlueprint);
48
48
  const subflowResult = await runtime.runtime.orchestrator.run(subflowExecContext, subflowTraverser);
49
49
  if (subflowResult.status === "awaiting") {
50
- workflowState.markAsAwaiting(this.nodeId ?? "");
50
+ await workflowState.markAsAwaiting(this.nodeId ?? "");
51
51
  const subflowStateKey = `_subflowState.${this.nodeId}`;
52
52
  await context.context.set(subflowStateKey, subflowResult.serializedContext);
53
53
  return { output: void 0 };
@@ -86,5 +86,5 @@ var SubflowNode = class extends BaseNode {
86
86
  };
87
87
 
88
88
  export { SubflowNode };
89
- //# sourceMappingURL=chunk-K6LPGUPR.js.map
90
- //# sourceMappingURL=chunk-K6LPGUPR.js.map
89
+ //# sourceMappingURL=chunk-UXIASXSG.js.map
90
+ //# sourceMappingURL=chunk-UXIASXSG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nodes/subflow.ts"],"names":["subAnalysis"],"mappings":"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","file":"chunk-UXIASXSG.js","sourcesContent":["import { analyzeBlueprint } from '../analysis'\nimport { FlowcraftError } from '../errors'\nimport { BaseNode } from '../node'\nimport { ExecutionContext } from '../runtime/execution-context'\nimport { WorkflowState } from '../runtime/state'\nimport { GraphTraverser } from '../runtime/traverser'\nimport type { NodeContext, NodeResult } from '../types'\n\nexport class SubflowNode 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 { blueprintId, inputs, outputs } = this.params ?? {}\n\t\tconst { runtime, workflowState } = context.dependencies\n\n\t\tif (!blueprintId) {\n\t\t\tthrow new FlowcraftError(`Subflow node '${this.nodeId}' is missing 'blueprintId' parameter.`, { isFatal: true })\n\t\t}\n\n\t\tconst subBlueprint =\n\t\t\t(runtime as any).blueprints?.[blueprintId] || (runtime as any).runtime?.blueprints?.[blueprintId]\n\t\tif (!subBlueprint) {\n\t\t\tthrow new FlowcraftError(`Sub-blueprint '${blueprintId}' not found in runtime registry.`, { isFatal: true })\n\t\t}\n\n\t\tconst subflowInitialContext: Record<string, any> = {}\n\n\t\tif (inputs) {\n\t\t\t// explicit inputs\n\t\t\tfor (const [targetKey, sourceKey] of Object.entries(inputs as Record<string, string>)) {\n\t\t\t\tlet value = await context.context.get(sourceKey as any)\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tvalue = await context.context.get(`_outputs.${sourceKey}` as any)\n\t\t\t\t}\n\t\t\t\tsubflowInitialContext[targetKey] = value\n\t\t\t}\n\t\t} else if (context.input !== undefined) {\n\t\t\t// pass the parent node's input to the subflow's start nodes\n\t\t\tconst subAnalysis = analyzeBlueprint(subBlueprint)\n\t\t\tfor (const startNodeId of subAnalysis.startNodeIds) {\n\t\t\t\tconst inputKey = `_inputs.${startNodeId}`\n\t\t\t\tsubflowInitialContext[inputKey] = context.input\n\t\t\t}\n\t\t}\n\n\t\tconst subflowState = new WorkflowState(subflowInitialContext)\n\t\tconst subflowExecContext = new ExecutionContext(\n\t\t\tsubBlueprint,\n\t\t\tsubflowState,\n\t\t\truntime.nodeRegistry,\n\t\t\truntime.executionId,\n\t\t\truntime.runtime,\n\t\t\truntime.services,\n\t\t\truntime.signal,\n\t\t\truntime.concurrency,\n\t\t)\n\t\tconst subflowTraverser = new GraphTraverser(subBlueprint)\n\n\t\tconst subflowResult = await runtime.runtime.orchestrator.run(subflowExecContext, subflowTraverser)\n\n\t\tif (subflowResult.status === 'awaiting') {\n\t\t\tawait workflowState.markAsAwaiting(this.nodeId ?? '')\n\t\t\tconst subflowStateKey = `_subflowState.${this.nodeId}`\n\t\t\tawait context.context.set(subflowStateKey as any, subflowResult.serializedContext)\n\t\t\treturn { output: undefined }\n\t\t}\n\n\t\tif (subflowResult.status !== 'completed') {\n\t\t\tconst firstError = subflowResult.errors?.[0]\n\t\t\tconst errorMessage = firstError?.message || 'Unknown error'\n\t\t\tthrow new FlowcraftError(\n\t\t\t\t`Sub-workflow '${blueprintId}' did not complete successfully. Status: ${subflowResult.status}. Error: ${errorMessage}`,\n\t\t\t\t{\n\t\t\t\t\tcause: firstError,\n\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\tblueprintId,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\n\t\tconst subflowFinalContext = subflowResult.context as Record<string, any>\n\n\t\tif (outputs) {\n\t\t\tfor (const [parentKey, subKey] of Object.entries(outputs as Record<string, string>)) {\n\t\t\t\tconst value = subflowFinalContext[`_outputs.${subKey}`] ?? subflowFinalContext[subKey]\n\t\t\t\tawait context.context.set(parentKey as any, value)\n\t\t\t}\n\t\t\treturn { output: subflowFinalContext }\n\t\t}\n\n\t\tconst subAnalysis = analyzeBlueprint(subBlueprint)\n\t\tif (subAnalysis.terminalNodeIds.length === 1) {\n\t\t\tconst terminalId = subAnalysis.terminalNodeIds[0]\n\t\t\treturn { output: subflowFinalContext[`_outputs.${terminalId}`] }\n\t\t}\n\n\t\tconst terminalOutputs: Record<string, any> = {}\n\t\tfor (const terminalId of subAnalysis.terminalNodeIds) {\n\t\t\tterminalOutputs[terminalId] = subflowFinalContext[`_outputs.${terminalId}`]\n\t\t}\n\t\treturn { output: terminalOutputs }\n\t}\n}\n"]}