footprintjs 0.1.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 (251) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +658 -0
  3. package/dist/advanced.js +84 -0
  4. package/dist/esm/advanced.js +26 -0
  5. package/dist/esm/index.js +30 -0
  6. package/dist/esm/lib/builder/FlowChartBuilder.js +809 -0
  7. package/dist/esm/lib/builder/index.js +12 -0
  8. package/dist/esm/lib/builder/types.js +9 -0
  9. package/dist/esm/lib/engine/graph/StageNode.js +38 -0
  10. package/dist/esm/lib/engine/graph/index.js +2 -0
  11. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +116 -0
  12. package/dist/esm/lib/engine/handlers/ContinuationResolver.js +121 -0
  13. package/dist/esm/lib/engine/handlers/DeciderHandler.js +78 -0
  14. package/dist/esm/lib/engine/handlers/ExtractorRunner.js +117 -0
  15. package/dist/esm/lib/engine/handlers/NodeResolver.js +72 -0
  16. package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +154 -0
  17. package/dist/esm/lib/engine/handlers/SelectorHandler.js +79 -0
  18. package/dist/esm/lib/engine/handlers/StageRunner.js +86 -0
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +322 -0
  20. package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +113 -0
  21. package/dist/esm/lib/engine/handlers/index.js +23 -0
  22. package/dist/esm/lib/engine/index.js +18 -0
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeBuilder.js +158 -0
  24. package/dist/esm/lib/engine/narrative/ControlFlowNarrativeGenerator.js +90 -0
  25. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +24 -0
  26. package/dist/esm/lib/engine/narrative/index.js +4 -0
  27. package/dist/esm/lib/engine/narrative/types.js +11 -0
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +419 -0
  29. package/dist/esm/lib/engine/traversal/index.js +2 -0
  30. package/dist/esm/lib/engine/types.js +16 -0
  31. package/dist/esm/lib/memory/DiagnosticCollector.js +44 -0
  32. package/dist/esm/lib/memory/EventLog.js +44 -0
  33. package/dist/esm/lib/memory/SharedMemory.js +53 -0
  34. package/dist/esm/lib/memory/StageContext.js +221 -0
  35. package/dist/esm/lib/memory/TransactionBuffer.js +66 -0
  36. package/dist/esm/lib/memory/index.js +16 -0
  37. package/dist/esm/lib/memory/types.js +7 -0
  38. package/dist/esm/lib/memory/utils.js +155 -0
  39. package/dist/esm/lib/runner/ExecutionRuntime.js +64 -0
  40. package/dist/esm/lib/runner/FlowChartExecutor.js +108 -0
  41. package/dist/esm/lib/runner/index.js +3 -0
  42. package/dist/esm/lib/scope/ScopeFacade.js +175 -0
  43. package/dist/esm/lib/scope/index.js +19 -0
  44. package/dist/esm/lib/scope/protection/createProtectedScope.js +59 -0
  45. package/dist/esm/lib/scope/protection/index.js +3 -0
  46. package/dist/esm/lib/scope/protection/types.js +8 -0
  47. package/dist/esm/lib/scope/providers/baseStateCompatible.js +29 -0
  48. package/dist/esm/lib/scope/providers/guards.js +43 -0
  49. package/dist/esm/lib/scope/providers/index.js +7 -0
  50. package/dist/esm/lib/scope/providers/providers.js +18 -0
  51. package/dist/esm/lib/scope/providers/registry.js +36 -0
  52. package/dist/esm/lib/scope/providers/resolve.js +11 -0
  53. package/dist/esm/lib/scope/providers/types.js +8 -0
  54. package/dist/esm/lib/scope/recorders/DebugRecorder.js +81 -0
  55. package/dist/esm/lib/scope/recorders/MetricRecorder.js +81 -0
  56. package/dist/esm/lib/scope/recorders/NarrativeRecorder.js +167 -0
  57. package/dist/esm/lib/scope/recorders/index.js +4 -0
  58. package/dist/esm/lib/scope/state/installResolvers.js +15 -0
  59. package/dist/esm/lib/scope/state/zod/defineScopeFromZod.js +14 -0
  60. package/dist/esm/lib/scope/state/zod/index.js +5 -0
  61. package/dist/esm/lib/scope/state/zod/resolver.js +28 -0
  62. package/dist/esm/lib/scope/state/zod/schema/builder.js +16 -0
  63. package/dist/esm/lib/scope/state/zod/scopeFactory.js +156 -0
  64. package/dist/esm/lib/scope/state/zod/utils/validateHelper.js +97 -0
  65. package/dist/esm/lib/scope/types.js +9 -0
  66. package/dist/esm/types/advanced.d.ts +35 -0
  67. package/dist/esm/types/index.d.ts +22 -0
  68. package/dist/esm/types/lib/builder/FlowChartBuilder.d.ts +121 -0
  69. package/dist/esm/types/lib/builder/index.d.ts +9 -0
  70. package/dist/esm/types/lib/builder/types.d.ts +152 -0
  71. package/dist/esm/types/lib/engine/graph/StageNode.d.ts +78 -0
  72. package/dist/esm/types/lib/engine/graph/index.d.ts +2 -0
  73. package/dist/esm/types/lib/engine/handlers/ChildrenExecutor.d.ts +33 -0
  74. package/dist/esm/types/lib/engine/handlers/ContinuationResolver.d.ts +57 -0
  75. package/dist/esm/types/lib/engine/handlers/DeciderHandler.d.ts +34 -0
  76. package/dist/esm/types/lib/engine/handlers/ExtractorRunner.d.ts +41 -0
  77. package/dist/esm/types/lib/engine/handlers/NodeResolver.d.ts +26 -0
  78. package/dist/esm/types/lib/engine/handlers/RuntimeStructureManager.d.ts +36 -0
  79. package/dist/esm/types/lib/engine/handlers/SelectorHandler.d.ts +26 -0
  80. package/dist/esm/types/lib/engine/handlers/StageRunner.d.ts +17 -0
  81. package/dist/esm/types/lib/engine/handlers/SubflowExecutor.d.ts +57 -0
  82. package/dist/esm/types/lib/engine/handlers/SubflowInputMapper.d.ts +40 -0
  83. package/dist/esm/types/lib/engine/handlers/index.d.ts +15 -0
  84. package/dist/esm/types/lib/engine/index.d.ts +16 -0
  85. package/dist/esm/types/lib/engine/narrative/CombinedNarrativeBuilder.d.ts +33 -0
  86. package/dist/esm/types/lib/engine/narrative/ControlFlowNarrativeGenerator.d.ts +29 -0
  87. package/dist/esm/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +21 -0
  88. package/dist/esm/types/lib/engine/narrative/index.d.ts +5 -0
  89. package/dist/esm/types/lib/engine/narrative/types.d.ts +33 -0
  90. package/dist/esm/types/lib/engine/traversal/FlowchartTraverser.d.ts +87 -0
  91. package/dist/esm/types/lib/engine/traversal/index.d.ts +2 -0
  92. package/dist/esm/types/lib/engine/types.d.ts +208 -0
  93. package/dist/esm/types/lib/memory/DiagnosticCollector.d.ts +33 -0
  94. package/dist/esm/types/lib/memory/EventLog.d.ts +27 -0
  95. package/dist/esm/types/lib/memory/SharedMemory.d.ts +34 -0
  96. package/dist/esm/types/lib/memory/StageContext.d.ts +74 -0
  97. package/dist/esm/types/lib/memory/TransactionBuffer.d.ts +38 -0
  98. package/dist/esm/types/lib/memory/index.d.ts +13 -0
  99. package/dist/esm/types/lib/memory/types.d.ts +60 -0
  100. package/dist/esm/types/lib/memory/utils.d.ts +67 -0
  101. package/dist/esm/types/lib/runner/ExecutionRuntime.d.ts +39 -0
  102. package/dist/esm/types/lib/runner/FlowChartExecutor.d.ts +34 -0
  103. package/dist/esm/types/lib/runner/index.d.ts +3 -0
  104. package/dist/esm/types/lib/scope/ScopeFacade.d.ts +47 -0
  105. package/dist/esm/types/lib/scope/index.d.ts +23 -0
  106. package/dist/esm/types/lib/scope/protection/createProtectedScope.d.ts +9 -0
  107. package/dist/esm/types/lib/scope/protection/index.d.ts +2 -0
  108. package/dist/esm/types/lib/scope/protection/types.d.ts +13 -0
  109. package/dist/esm/types/lib/scope/providers/baseStateCompatible.d.ts +26 -0
  110. package/dist/esm/types/lib/scope/providers/guards.d.ts +14 -0
  111. package/dist/esm/types/lib/scope/providers/index.d.ts +6 -0
  112. package/dist/esm/types/lib/scope/providers/providers.d.ts +8 -0
  113. package/dist/esm/types/lib/scope/providers/registry.d.ts +11 -0
  114. package/dist/esm/types/lib/scope/providers/resolve.d.ts +8 -0
  115. package/dist/esm/types/lib/scope/providers/types.d.ts +40 -0
  116. package/dist/esm/types/lib/scope/recorders/DebugRecorder.d.ts +35 -0
  117. package/dist/esm/types/lib/scope/recorders/MetricRecorder.d.ts +36 -0
  118. package/dist/esm/types/lib/scope/recorders/NarrativeRecorder.d.ts +45 -0
  119. package/dist/esm/types/lib/scope/recorders/index.d.ts +7 -0
  120. package/dist/esm/types/lib/scope/state/installResolvers.d.ts +4 -0
  121. package/dist/esm/types/lib/scope/state/zod/defineScopeFromZod.d.ts +9 -0
  122. package/dist/esm/types/lib/scope/state/zod/index.d.ts +5 -0
  123. package/dist/esm/types/lib/scope/state/zod/resolver.d.ts +5 -0
  124. package/dist/esm/types/lib/scope/state/zod/schema/builder.d.ts +12 -0
  125. package/dist/esm/types/lib/scope/state/zod/scopeFactory.d.ts +9 -0
  126. package/dist/esm/types/lib/scope/state/zod/utils/validateHelper.d.ts +10 -0
  127. package/dist/esm/types/lib/scope/types.d.ts +53 -0
  128. package/dist/index.js +42 -0
  129. package/dist/lib/builder/FlowChartBuilder.js +817 -0
  130. package/dist/lib/builder/index.js +20 -0
  131. package/dist/lib/builder/types.js +10 -0
  132. package/dist/lib/engine/graph/StageNode.js +42 -0
  133. package/dist/lib/engine/graph/index.js +6 -0
  134. package/dist/lib/engine/handlers/ChildrenExecutor.js +120 -0
  135. package/dist/lib/engine/handlers/ContinuationResolver.js +125 -0
  136. package/dist/lib/engine/handlers/DeciderHandler.js +82 -0
  137. package/dist/lib/engine/handlers/ExtractorRunner.js +121 -0
  138. package/dist/lib/engine/handlers/NodeResolver.js +76 -0
  139. package/dist/lib/engine/handlers/RuntimeStructureManager.js +159 -0
  140. package/dist/lib/engine/handlers/SelectorHandler.js +83 -0
  141. package/dist/lib/engine/handlers/StageRunner.js +90 -0
  142. package/dist/lib/engine/handlers/SubflowExecutor.js +326 -0
  143. package/dist/lib/engine/handlers/SubflowInputMapper.js +121 -0
  144. package/dist/lib/engine/handlers/index.js +42 -0
  145. package/dist/lib/engine/index.js +40 -0
  146. package/dist/lib/engine/narrative/CombinedNarrativeBuilder.js +162 -0
  147. package/dist/lib/engine/narrative/ControlFlowNarrativeGenerator.js +94 -0
  148. package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +28 -0
  149. package/dist/lib/engine/narrative/index.js +10 -0
  150. package/dist/lib/engine/narrative/types.js +12 -0
  151. package/dist/lib/engine/traversal/FlowchartTraverser.js +423 -0
  152. package/dist/lib/engine/traversal/index.js +6 -0
  153. package/dist/lib/engine/types.js +19 -0
  154. package/dist/lib/memory/DiagnosticCollector.js +48 -0
  155. package/dist/lib/memory/EventLog.js +48 -0
  156. package/dist/lib/memory/SharedMemory.js +60 -0
  157. package/dist/lib/memory/StageContext.js +225 -0
  158. package/dist/lib/memory/TransactionBuffer.js +73 -0
  159. package/dist/lib/memory/index.js +34 -0
  160. package/dist/lib/memory/types.js +8 -0
  161. package/dist/lib/memory/utils.js +170 -0
  162. package/dist/lib/runner/ExecutionRuntime.js +68 -0
  163. package/dist/lib/runner/FlowChartExecutor.js +112 -0
  164. package/dist/lib/runner/index.js +8 -0
  165. package/dist/lib/scope/ScopeFacade.js +179 -0
  166. package/dist/lib/scope/index.js +44 -0
  167. package/dist/lib/scope/protection/createProtectedScope.js +64 -0
  168. package/dist/lib/scope/protection/index.js +8 -0
  169. package/dist/lib/scope/protection/types.js +9 -0
  170. package/dist/lib/scope/providers/baseStateCompatible.js +33 -0
  171. package/dist/lib/scope/providers/guards.js +49 -0
  172. package/dist/lib/scope/providers/index.js +21 -0
  173. package/dist/lib/scope/providers/providers.js +23 -0
  174. package/dist/lib/scope/providers/registry.js +42 -0
  175. package/dist/lib/scope/providers/resolve.js +16 -0
  176. package/dist/lib/scope/providers/types.js +9 -0
  177. package/dist/lib/scope/recorders/DebugRecorder.js +85 -0
  178. package/dist/lib/scope/recorders/MetricRecorder.js +85 -0
  179. package/dist/lib/scope/recorders/NarrativeRecorder.js +171 -0
  180. package/dist/lib/scope/recorders/index.js +10 -0
  181. package/dist/lib/scope/state/installResolvers.js +19 -0
  182. package/dist/lib/scope/state/zod/defineScopeFromZod.js +18 -0
  183. package/dist/lib/scope/state/zod/index.js +13 -0
  184. package/dist/lib/scope/state/zod/resolver.js +31 -0
  185. package/dist/lib/scope/state/zod/schema/builder.js +21 -0
  186. package/dist/lib/scope/state/zod/scopeFactory.js +160 -0
  187. package/dist/lib/scope/state/zod/utils/validateHelper.js +104 -0
  188. package/dist/lib/scope/types.js +10 -0
  189. package/dist/types/advanced.d.ts +35 -0
  190. package/dist/types/index.d.ts +22 -0
  191. package/dist/types/lib/builder/FlowChartBuilder.d.ts +121 -0
  192. package/dist/types/lib/builder/index.d.ts +9 -0
  193. package/dist/types/lib/builder/types.d.ts +152 -0
  194. package/dist/types/lib/engine/graph/StageNode.d.ts +78 -0
  195. package/dist/types/lib/engine/graph/index.d.ts +2 -0
  196. package/dist/types/lib/engine/handlers/ChildrenExecutor.d.ts +33 -0
  197. package/dist/types/lib/engine/handlers/ContinuationResolver.d.ts +57 -0
  198. package/dist/types/lib/engine/handlers/DeciderHandler.d.ts +34 -0
  199. package/dist/types/lib/engine/handlers/ExtractorRunner.d.ts +41 -0
  200. package/dist/types/lib/engine/handlers/NodeResolver.d.ts +26 -0
  201. package/dist/types/lib/engine/handlers/RuntimeStructureManager.d.ts +36 -0
  202. package/dist/types/lib/engine/handlers/SelectorHandler.d.ts +26 -0
  203. package/dist/types/lib/engine/handlers/StageRunner.d.ts +17 -0
  204. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +57 -0
  205. package/dist/types/lib/engine/handlers/SubflowInputMapper.d.ts +40 -0
  206. package/dist/types/lib/engine/handlers/index.d.ts +15 -0
  207. package/dist/types/lib/engine/index.d.ts +16 -0
  208. package/dist/types/lib/engine/narrative/CombinedNarrativeBuilder.d.ts +33 -0
  209. package/dist/types/lib/engine/narrative/ControlFlowNarrativeGenerator.d.ts +29 -0
  210. package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +21 -0
  211. package/dist/types/lib/engine/narrative/index.d.ts +5 -0
  212. package/dist/types/lib/engine/narrative/types.d.ts +33 -0
  213. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +87 -0
  214. package/dist/types/lib/engine/traversal/index.d.ts +2 -0
  215. package/dist/types/lib/engine/types.d.ts +208 -0
  216. package/dist/types/lib/memory/DiagnosticCollector.d.ts +33 -0
  217. package/dist/types/lib/memory/EventLog.d.ts +27 -0
  218. package/dist/types/lib/memory/SharedMemory.d.ts +34 -0
  219. package/dist/types/lib/memory/StageContext.d.ts +74 -0
  220. package/dist/types/lib/memory/TransactionBuffer.d.ts +38 -0
  221. package/dist/types/lib/memory/index.d.ts +13 -0
  222. package/dist/types/lib/memory/types.d.ts +60 -0
  223. package/dist/types/lib/memory/utils.d.ts +67 -0
  224. package/dist/types/lib/runner/ExecutionRuntime.d.ts +39 -0
  225. package/dist/types/lib/runner/FlowChartExecutor.d.ts +34 -0
  226. package/dist/types/lib/runner/index.d.ts +3 -0
  227. package/dist/types/lib/scope/ScopeFacade.d.ts +47 -0
  228. package/dist/types/lib/scope/index.d.ts +23 -0
  229. package/dist/types/lib/scope/protection/createProtectedScope.d.ts +9 -0
  230. package/dist/types/lib/scope/protection/index.d.ts +2 -0
  231. package/dist/types/lib/scope/protection/types.d.ts +13 -0
  232. package/dist/types/lib/scope/providers/baseStateCompatible.d.ts +26 -0
  233. package/dist/types/lib/scope/providers/guards.d.ts +14 -0
  234. package/dist/types/lib/scope/providers/index.d.ts +6 -0
  235. package/dist/types/lib/scope/providers/providers.d.ts +8 -0
  236. package/dist/types/lib/scope/providers/registry.d.ts +11 -0
  237. package/dist/types/lib/scope/providers/resolve.d.ts +8 -0
  238. package/dist/types/lib/scope/providers/types.d.ts +40 -0
  239. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +35 -0
  240. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +36 -0
  241. package/dist/types/lib/scope/recorders/NarrativeRecorder.d.ts +45 -0
  242. package/dist/types/lib/scope/recorders/index.d.ts +7 -0
  243. package/dist/types/lib/scope/state/installResolvers.d.ts +4 -0
  244. package/dist/types/lib/scope/state/zod/defineScopeFromZod.d.ts +9 -0
  245. package/dist/types/lib/scope/state/zod/index.d.ts +5 -0
  246. package/dist/types/lib/scope/state/zod/resolver.d.ts +5 -0
  247. package/dist/types/lib/scope/state/zod/schema/builder.d.ts +12 -0
  248. package/dist/types/lib/scope/state/zod/scopeFactory.d.ts +9 -0
  249. package/dist/types/lib/scope/state/zod/utils/validateHelper.d.ts +10 -0
  250. package/dist/types/lib/scope/types.d.ts +53 -0
  251. package/package.json +148 -0
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ /**
3
+ * SubflowExecutor — Isolated recursive execution with I/O mapping.
4
+ *
5
+ * Responsibilities:
6
+ * - Execute subflows with isolated ExecutionRuntime contexts
7
+ * - Apply input/output mapping via SubflowInputMapper
8
+ * - Handle nested subflow detection and delegation
9
+ * - Track subflow results for debugging/visualization
10
+ *
11
+ * Each subflow gets its own GlobalStore for isolation.
12
+ * The subflow's `next` chain after children is NOT executed inside —
13
+ * the parent's executeNode continues with node.next after return.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.SubflowExecutor = void 0;
17
+ const StageNode_1 = require("../graph/StageNode");
18
+ const StageRunner_1 = require("./StageRunner");
19
+ const SubflowInputMapper_1 = require("./SubflowInputMapper");
20
+ class SubflowExecutor {
21
+ constructor(deps, nodeResolver, executeStage, callExtractor, getStageFn) {
22
+ this.deps = deps;
23
+ this.nodeResolver = nodeResolver;
24
+ this.executeStage = executeStage;
25
+ this.callExtractor = callExtractor;
26
+ this.getStageFn = getStageFn;
27
+ }
28
+ /**
29
+ * Execute a subflow with isolated context.
30
+ *
31
+ * 1. Creates a fresh ExecutionRuntime for the subflow
32
+ * 2. Applies input mapping to seed the subflow's GlobalStore
33
+ * 3. Executes the subflow's internal structure
34
+ * 4. Applies output mapping to write results back to parent scope
35
+ * 5. Stores execution data for debugging/visualization
36
+ */
37
+ async executeSubflow(node, parentContext, breakFlag, branchPath, subflowResultsMap) {
38
+ var _a, _b;
39
+ const subflowId = node.subflowId;
40
+ const subflowName = (_a = node.subflowName) !== null && _a !== void 0 ? _a : node.name;
41
+ parentContext.addFlowDebugMessage('subflow', `Entering ${subflowName} subflow`, {
42
+ targetStage: subflowId,
43
+ });
44
+ this.deps.narrativeGenerator.onSubflowEntry(subflowName);
45
+ parentContext.addLog('isSubflowContainer', true);
46
+ parentContext.addLog('subflowId', subflowId);
47
+ parentContext.addLog('subflowName', subflowName);
48
+ // ─── Input Mapping ───
49
+ const mountOptions = node.subflowMountOptions;
50
+ let mappedInput = {};
51
+ if (mountOptions) {
52
+ try {
53
+ const parentScope = parentContext.getScope();
54
+ mappedInput = (0, SubflowInputMapper_1.getInitialScopeValues)(parentScope, mountOptions);
55
+ if (Object.keys(mappedInput).length > 0) {
56
+ parentContext.addLog('mappedInput', mappedInput);
57
+ }
58
+ }
59
+ catch (error) {
60
+ parentContext.addError('inputMapperError', error.toString());
61
+ this.deps.logger.error(`Error in inputMapper for subflow (${subflowId}):`, { error });
62
+ throw error;
63
+ }
64
+ }
65
+ // Create isolated runtime via dynamic construction (avoids circular import)
66
+ const ExecutionRuntimeClass = this.deps.executionRuntime.constructor;
67
+ const nestedRuntime = new ExecutionRuntimeClass(node.name);
68
+ let nestedRootContext = nestedRuntime.rootStageContext;
69
+ // Seed GlobalStore with input
70
+ if (Object.keys(mappedInput).length > 0) {
71
+ (0, SubflowInputMapper_1.seedSubflowGlobalStore)(nestedRuntime, mappedInput);
72
+ // Refresh rootStageContext so WriteBuffer sees committed data
73
+ const StageContextClass = nestedRootContext.constructor;
74
+ nestedRootContext = new StageContextClass('', nestedRootContext.stageName, nestedRuntime.globalStore, '', nestedRuntime.executionHistory);
75
+ nestedRuntime.rootStageContext = nestedRootContext;
76
+ }
77
+ // Create subflow HandlerDeps
78
+ const subflowDeps = (0, SubflowInputMapper_1.createSubflowHandlerDeps)(this.deps, nestedRuntime, mappedInput);
79
+ parentContext.addLog('subflowReadOnlyContext', mappedInput);
80
+ const subflowBreakFlag = { shouldBreak: false };
81
+ const hasChildren = Boolean(node.children && node.children.length > 0);
82
+ const subflowNode = {
83
+ ...node,
84
+ isSubflowRoot: false,
85
+ next: hasChildren ? undefined : node.next,
86
+ };
87
+ let subflowOutput;
88
+ let subflowError;
89
+ try {
90
+ this.subflowResultsMap = subflowResultsMap;
91
+ this.currentSubflowRoot = subflowNode;
92
+ this.currentSubflowDeps = subflowDeps;
93
+ subflowOutput = await this.executeSubflowInternal(subflowNode, nestedRootContext, subflowBreakFlag, subflowId);
94
+ }
95
+ catch (error) {
96
+ subflowError = error;
97
+ parentContext.addError('subflowError', error.toString());
98
+ this.deps.logger.error(`Error in subflow (${subflowId}):`, { error });
99
+ }
100
+ finally {
101
+ this.currentSubflowRoot = undefined;
102
+ this.currentSubflowDeps = undefined;
103
+ }
104
+ const subflowTreeContext = nestedRuntime.getSnapshot();
105
+ // ─── Output Mapping ───
106
+ if (!subflowError && (mountOptions === null || mountOptions === void 0 ? void 0 : mountOptions.outputMapper)) {
107
+ try {
108
+ let outputContext = parentContext;
109
+ if (parentContext.branchId && parentContext.branchId !== '' && parentContext.parent) {
110
+ outputContext = parentContext.parent;
111
+ }
112
+ const parentScope = outputContext.getScope();
113
+ const mappedOutput = (0, SubflowInputMapper_1.applyOutputMapping)(subflowOutput, parentScope, outputContext, mountOptions);
114
+ if (mappedOutput && Object.keys(mappedOutput).length > 0) {
115
+ parentContext.addLog('mappedOutput', mappedOutput);
116
+ parentContext.addLog('outputMappingTarget', outputContext.branchId || '(root)');
117
+ }
118
+ outputContext.commit();
119
+ }
120
+ catch (error) {
121
+ parentContext.addError('outputMapperError', error.toString());
122
+ this.deps.logger.error(`Error in outputMapper for subflow (${subflowId}):`, { error });
123
+ }
124
+ }
125
+ const subflowResult = {
126
+ subflowId,
127
+ subflowName,
128
+ treeContext: {
129
+ globalContext: subflowTreeContext.sharedState,
130
+ stageContexts: subflowTreeContext.executionTree,
131
+ history: subflowTreeContext.commitLog,
132
+ },
133
+ parentStageId: parentContext.getStageId(),
134
+ };
135
+ const subflowDef = (_b = this.deps.subflows) === null || _b === void 0 ? void 0 : _b[subflowId];
136
+ if (subflowDef && subflowDef.buildTimeStructure) {
137
+ subflowResult.pipelineStructure = subflowDef.buildTimeStructure;
138
+ }
139
+ parentContext.addLog('subflowResult', subflowResult);
140
+ parentContext.addLog('hasSubflowData', true);
141
+ subflowResultsMap.set(subflowId, subflowResult);
142
+ parentContext.addFlowDebugMessage('subflow', `Exiting ${subflowName} subflow`, {
143
+ targetStage: subflowId,
144
+ });
145
+ this.deps.narrativeGenerator.onSubflowExit(subflowName);
146
+ parentContext.commit();
147
+ if (subflowError) {
148
+ throw subflowError;
149
+ }
150
+ return subflowOutput;
151
+ }
152
+ /**
153
+ * Internal execution within subflow context.
154
+ * Mirrors the traverser's executeNode but within the subflow's isolated runtime.
155
+ */
156
+ async executeSubflowInternal(node, context, breakFlag, branchPath) {
157
+ var _a;
158
+ // Detect nested subflows
159
+ if (node.isSubflowRoot && node.subflowId) {
160
+ const resolvedNode = this.nodeResolver.resolveSubflowReference(node);
161
+ return await this.executeSubflow(resolvedNode, context, breakFlag, branchPath, this.subflowResultsMap);
162
+ }
163
+ const stageFunc = this.getStageFn(node);
164
+ const breakFn = () => (breakFlag.shouldBreak = true);
165
+ let stageOutput;
166
+ if (stageFunc) {
167
+ try {
168
+ if (this.currentSubflowDeps) {
169
+ const subflowStageRunner = new StageRunner_1.StageRunner(this.currentSubflowDeps);
170
+ stageOutput = await subflowStageRunner.run(node, stageFunc, context, breakFn);
171
+ }
172
+ else {
173
+ stageOutput = await this.executeStage(node, stageFunc, context, breakFn);
174
+ }
175
+ }
176
+ catch (error) {
177
+ context.commit();
178
+ this.callExtractor(node, context, this.getStagePath(node, branchPath, context.stageName), undefined, {
179
+ type: 'stageExecutionError',
180
+ message: error.toString(),
181
+ });
182
+ context.addError('stageExecutionError', error.toString());
183
+ throw error;
184
+ }
185
+ context.commit();
186
+ this.callExtractor(node, context, this.getStagePath(node, branchPath, context.stageName), stageOutput);
187
+ if (breakFlag.shouldBreak) {
188
+ return stageOutput;
189
+ }
190
+ // Handle dynamic StageNode return
191
+ if (stageOutput && typeof stageOutput === 'object' && (0, StageNode_1.isStageNodeReturn)(stageOutput)) {
192
+ const dynamicNode = stageOutput;
193
+ context.addLog('isDynamic', true);
194
+ context.addLog('dynamicPattern', 'StageNodeReturn');
195
+ if (dynamicNode.children && dynamicNode.children.length > 0) {
196
+ node.children = dynamicNode.children;
197
+ context.addLog('dynamicChildCount', dynamicNode.children.length);
198
+ context.addLog('dynamicChildIds', dynamicNode.children.map((c) => c.id || c.name));
199
+ if (typeof dynamicNode.nextNodeSelector === 'function') {
200
+ node.nextNodeSelector = dynamicNode.nextNodeSelector;
201
+ context.addLog('hasSelector', true);
202
+ }
203
+ }
204
+ if (dynamicNode.next) {
205
+ node.next = dynamicNode.next;
206
+ context.addLog('hasDynamicNext', true);
207
+ const loopTargetId = dynamicNode.next.id || dynamicNode.next.name;
208
+ if (loopTargetId) {
209
+ context.addLog('loopTarget', loopTargetId);
210
+ }
211
+ }
212
+ stageOutput = undefined;
213
+ }
214
+ }
215
+ // ─── Children dispatch ───
216
+ const hasChildrenAfterStage = Boolean((_a = node.children) === null || _a === void 0 ? void 0 : _a.length);
217
+ const hasNextAfterStage = Boolean(node.next);
218
+ if (hasChildrenAfterStage) {
219
+ if (node.nextNodeSelector) {
220
+ const results = await this.executeSelectedChildrenInternal(node.nextNodeSelector, node.children, stageOutput, context, branchPath, breakFlag);
221
+ if (!hasNextAfterStage)
222
+ return results;
223
+ }
224
+ else {
225
+ const results = await this.executeNodeChildrenInternal(node, context, branchPath, breakFlag);
226
+ if (!hasNextAfterStage)
227
+ return results;
228
+ }
229
+ }
230
+ // ─── Linear next ───
231
+ if (hasNextAfterStage) {
232
+ let nextNode = node.next;
233
+ // Resolve reference nodes (has id but no fn)
234
+ if (nextNode.id && !nextNode.fn) {
235
+ let resolvedNode;
236
+ if (this.currentSubflowRoot) {
237
+ resolvedNode = this.nodeResolver.findNodeById(nextNode.id, this.currentSubflowRoot);
238
+ if (resolvedNode)
239
+ context.addLog('dynamicNextResolvedFrom', 'subflow');
240
+ }
241
+ if (!resolvedNode) {
242
+ resolvedNode = this.nodeResolver.findNodeById(nextNode.id);
243
+ if (resolvedNode)
244
+ context.addLog('dynamicNextResolvedFrom', 'mainPipeline');
245
+ }
246
+ if (resolvedNode) {
247
+ nextNode = resolvedNode;
248
+ context.addLog('dynamicNextResolved', true);
249
+ context.addLog('dynamicNextTarget', nextNode.id);
250
+ }
251
+ else {
252
+ this.deps.logger.info(`Dynamic next node '${nextNode.id}' not found in subflow or main pipeline`);
253
+ context.addLog('dynamicNextResolved', false);
254
+ context.addLog('dynamicNextNotFound', nextNode.id);
255
+ }
256
+ }
257
+ const nextCtx = context.createNext('', nextNode.name);
258
+ return await this.executeSubflowInternal(nextNode, nextCtx, breakFlag, branchPath);
259
+ }
260
+ return stageOutput;
261
+ }
262
+ getStagePath(node, branchPath, contextStageName) {
263
+ var _a;
264
+ const baseName = (_a = node.id) !== null && _a !== void 0 ? _a : node.name;
265
+ const nodeId = contextStageName && contextStageName !== node.name ? contextStageName : baseName;
266
+ if (!branchPath)
267
+ return nodeId;
268
+ return `${branchPath}.${nodeId}`;
269
+ }
270
+ async executeNodeChildrenInternal(node, context, branchPath, breakFlag) {
271
+ var _a;
272
+ const childPromises = ((_a = node.children) !== null && _a !== void 0 ? _a : []).map((child) => {
273
+ const childContext = context.createChild('', child.id, child.name);
274
+ const childBreakFlag = { shouldBreak: false };
275
+ return this.executeSubflowInternal(child, childContext, childBreakFlag, branchPath)
276
+ .then((result) => {
277
+ childContext.commit();
278
+ return { id: child.id, result, isError: false };
279
+ })
280
+ .catch((error) => {
281
+ childContext.commit();
282
+ this.deps.logger.info(`TREE PIPELINE: executeNodeChildrenInternal - Error for id: ${child === null || child === void 0 ? void 0 : child.id}`, { error });
283
+ return { id: child.id, result: error, isError: true };
284
+ });
285
+ });
286
+ const settled = await Promise.allSettled(childPromises);
287
+ const childrenResults = {};
288
+ settled.forEach((s) => {
289
+ if (s.status === 'fulfilled') {
290
+ const { id, result, isError } = s.value;
291
+ childrenResults[id] = { id, result, isError };
292
+ }
293
+ else {
294
+ this.deps.logger.error(`Execution failed: ${s.reason}`);
295
+ }
296
+ });
297
+ return childrenResults;
298
+ }
299
+ async executeSelectedChildrenInternal(selector, children, input, context, branchPath, breakFlag) {
300
+ const selectorResult = await selector(input);
301
+ const selectedIds = Array.isArray(selectorResult) ? selectorResult : [selectorResult];
302
+ context.addLog('selectedChildIds', selectedIds);
303
+ context.addLog('selectorPattern', 'multi-choice');
304
+ if (selectedIds.length === 0) {
305
+ context.addLog('skippedAllChildren', true);
306
+ return {};
307
+ }
308
+ const selectedChildren = children.filter((c) => selectedIds.includes(c.id));
309
+ if (selectedChildren.length !== selectedIds.length) {
310
+ const childIds = children.map((c) => c.id);
311
+ const missing = selectedIds.filter((id) => !childIds.includes(id));
312
+ const errorMessage = `Selector returned unknown child IDs: ${missing.join(', ')}. Available: ${childIds.join(', ')}`;
313
+ this.deps.logger.error(`Error in subflow (${branchPath}):`, { error: errorMessage });
314
+ context.addError('selectorError', errorMessage);
315
+ throw new Error(errorMessage);
316
+ }
317
+ const skippedIds = children.filter((c) => !selectedIds.includes(c.id)).map((c) => c.id);
318
+ if (skippedIds.length > 0) {
319
+ context.addLog('skippedChildIds', skippedIds);
320
+ }
321
+ const tempNode = { name: 'selector-temp', children: selectedChildren };
322
+ return await this.executeNodeChildrenInternal(tempNode, context, branchPath, breakFlag);
323
+ }
324
+ }
325
+ exports.SubflowExecutor = SubflowExecutor;
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUlILGtEQUF1RDtBQUd2RCwrQ0FBNEM7QUFDNUMsNkRBSzhCO0FBd0I5QixNQUFhLGVBQWU7SUFLMUIsWUFDVSxJQUErQixFQUMvQixZQUF3QyxFQUN4QyxZQUEwQyxFQUMxQyxhQUE0QyxFQUM1QyxVQUFzQztRQUp0QyxTQUFJLEdBQUosSUFBSSxDQUEyQjtRQUMvQixpQkFBWSxHQUFaLFlBQVksQ0FBNEI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQThCO1FBQzFDLGtCQUFhLEdBQWIsYUFBYSxDQUErQjtRQUM1QyxlQUFVLEdBQVYsVUFBVSxDQUE0QjtJQUM3QyxDQUFDO0lBRUo7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUNsQixJQUE2QixFQUM3QixhQUEyQixFQUMzQixTQUFtQyxFQUNuQyxVQUE4QixFQUM5QixpQkFBNkM7O1FBRTdDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFVLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsTUFBQSxJQUFJLENBQUMsV0FBVyxtQ0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWxELGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxXQUFXLFVBQVUsRUFBRTtZQUM5RSxXQUFXLEVBQUUsU0FBUztTQUN2QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV6RCxhQUFhLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pELGFBQWEsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFNBQVMs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IFN1YmZsb3dFeGVjdXRvciDigJQgSXNvbGF0ZWQgcmVjdXJzaXZlIGV4ZWN1dGlvbiB3aXRoIEkvTyBtYXBwaW5nLlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIEV4ZWN1dGUgc3ViZmxvd3Mgd2l0aCBpc29sYXRlZCBFeGVjdXRpb25SdW50aW1lIGNvbnRleHRzXG4gKiAtIEFwcGx5IGlucHV0L291dHB1dCBtYXBwaW5nIHZpYSBTdWJmbG93SW5wdXRNYXBwZXJcbiAqIC0gSGFuZGxlIG5lc3RlZCBzdWJmbG93IGRldGVjdGlvbiBhbmQgZGVsZWdhdGlvblxuICogLSBUcmFjayBzdWJmbG93IHJlc3VsdHMgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gKlxuICogRWFjaCBzdWJmbG93IGdldHMgaXRzIG93biBHbG9iYWxTdG9yZSBmb3IgaXNvbGF0aW9uLlxuICogVGhlIHN1YmZsb3cncyBgbmV4dGAgY2hhaW4gYWZ0ZXIgY2hpbGRyZW4gaXMgTk9UIGV4ZWN1dGVkIGluc2lkZSDigJRcbiAqIHRoZSBwYXJlbnQncyBleGVjdXRlTm9kZSBjb250aW51ZXMgd2l0aCBub2RlLm5leHQgYWZ0ZXIgcmV0dXJuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFNlbGVjdG9yLCBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUnO1xuaW1wb3J0IHsgaXNTdGFnZU5vZGVSZXR1cm4gfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgSUV4ZWN1dGlvblJ1bnRpbWUsIE5vZGVSZXN1bHRUeXBlLCBTdGFnZUZ1bmN0aW9uLCBTdWJmbG93UmVzdWx0IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuL05vZGVSZXNvbHZlcic7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4vU3RhZ2VSdW5uZXInO1xuaW1wb3J0IHtcbiAgYXBwbHlPdXRwdXRNYXBwaW5nLFxuICBjcmVhdGVTdWJmbG93SGFuZGxlckRlcHMsXG4gIGdldEluaXRpYWxTY29wZVZhbHVlcyxcbiAgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZSxcbn0gZnJvbSAnLi9TdWJmbG93SW5wdXRNYXBwZXInO1xuXG4vKiogQ2FsbGJhY2sgZm9yIHJ1bm5pbmcgYSBzdGFnZSBmdW5jdGlvbi4gQXZvaWRzIGNpcmN1bGFyIGRlcCB3aXRoIHRyYXZlcnNlci4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGVTdGFnZUZuPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4gPSAoXG4gIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICBicmVha0ZuOiAoKSA9PiB2b2lkLFxuKSA9PiBQcm9taXNlPFRPdXQ+O1xuXG4vKiogQ2FsbGJhY2sgZm9yIGNhbGxpbmcgdGhlIHRyYXZlcnNhbCBleHRyYWN0b3IuICovXG5leHBvcnQgdHlwZSBDYWxsRXh0cmFjdG9yRm48VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiA9IChcbiAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgc3RhZ2VQYXRoOiBzdHJpbmcsXG4gIHN0YWdlT3V0cHV0PzogdW5rbm93bixcbiAgZXJyb3JJbmZvPzogeyB0eXBlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9LFxuKSA9PiB2b2lkO1xuXG4vKiogQ2FsbGJhY2sgZm9yIGdldHRpbmcgYSBzdGFnZSBmdW5jdGlvbiBmcm9tIHRoZSBzdGFnZSBtYXAuICovXG5leHBvcnQgdHlwZSBHZXRTdGFnZUZuRm48VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiA9IChcbiAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4pID0+IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGNsYXNzIFN1YmZsb3dFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSBjdXJyZW50U3ViZmxvd0RlcHM/OiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIGN1cnJlbnRTdWJmbG93Um9vdD86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHN1YmZsb3dSZXN1bHRzTWFwPzogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPixcbiAgICBwcml2YXRlIGV4ZWN1dGVTdGFnZTogRXhlY3V0ZVN0YWdlRm48VE91dCwgVFNjb3BlPixcbiAgICBwcml2YXRlIGNhbGxFeHRyYWN0b3I6IENhbGxFeHRyYWN0b3JGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgZ2V0U3RhZ2VGbjogR2V0U3RhZ2VGbkZuPFRPdXQsIFRTY29wZT4sXG4gICkge31cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHN1YmZsb3cgd2l0aCBpc29sYXRlZCBjb250ZXh0LlxuICAgKlxuICAgKiAxLiBDcmVhdGVzIGEgZnJlc2ggRXhlY3V0aW9uUnVudGltZSBmb3IgdGhlIHN1YmZsb3dcbiAgICogMi4gQXBwbGllcyBpbnB1dCBtYXBwaW5nIHRvIHNlZWQgdGhlIHN1YmZsb3cncyBHbG9iYWxTdG9yZVxuICAgKiAzLiBFeGVjdXRlcyB0aGUgc3ViZmxvdydzIGludGVybmFsIHN0cnVjdHVyZVxuICAgKiA0LiBBcHBsaWVzIG91dHB1dCBtYXBwaW5nIHRvIHdyaXRlIHJlc3VsdHMgYmFjayB0byBwYXJlbnQgc2NvcGVcbiAgICogNS4gU3RvcmVzIGV4ZWN1dGlvbiBkYXRhIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YmZsb3coXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgcGFyZW50Q29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdWJmbG93UmVzdWx0c01hcDogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4sXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc3ViZmxvd0lkID0gbm9kZS5zdWJmbG93SWQhO1xuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbm9kZS5zdWJmbG93TmFtZSA/PyBub2RlLm5hbWU7XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRW50ZXJpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFbnRyeShzdWJmbG93TmFtZSk7XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZExvZygnaXNTdWJmbG93Q29udGFpbmVyJywgdHJ1ZSk7XG4gICAgcGFyZW50Q29udGV4dC5hZGRMb2coJ3N1YmZsb3dJZCcsIHN1YmZsb3dJZCk7XG4gICAgcGFyZW50Q29udGV4dC5hZGRMb2coJ3N1YmZsb3dOYW1lJywgc3ViZmxvd05hbWUpO1xuXG4gICAgLy8g4pSA4pSA4pSAIElucHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGlmIChtb3VudE9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gcGFyZW50Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICBtYXBwZWRJbnB1dCA9IGdldEluaXRpYWxTY29wZVZhbHVlcyhwYXJlbnRTY29wZSwgbW91bnRPcHRpb25zKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcHBlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcGFyZW50Q29udGV4dC5hZGRMb2coJ21hcHBlZElucHV0JywgbWFwcGVkSW5wdXQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ2lucHV0TWFwcGVyRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaW5wdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvciB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGlzb2xhdGVkIHJ1bnRpbWUgdmlhIGR5bmFtaWMgY29uc3RydWN0aW9uIChhdm9pZHMgY2lyY3VsYXIgaW1wb3J0KVxuICAgIGNvbnN0IEV4ZWN1dGlvblJ1bnRpbWVDbGFzcyA9IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLmNvbnN0cnVjdG9yIGFzIG5ldyAobmFtZTogc3RyaW5nKSA9PiBJRXhlY3V0aW9uUnVudGltZTtcbiAgICBjb25zdCBuZXN0ZWRSdW50aW1lID0gbmV3IEV4ZWN1dGlvblJ1bnRpbWVDbGFzcyhub2RlLm5hbWUpO1xuICAgIGxldCBuZXN0ZWRSb290Q29udGV4dCA9IG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcblxuICAgIC8vIFNlZWQgR2xvYmFsU3RvcmUgd2l0aCBpbnB1dFxuICAgIGlmIChPYmplY3Qua2V5cyhtYXBwZWRJbnB1dCkubGVuZ3RoID4gMCkge1xuICAgICAgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZShuZXN0ZWRSdW50aW1lLCBtYXBwZWRJbnB1dCk7XG4gICAgICAvLyBSZWZyZXNoIHJvb3RTdGFnZUNvbnRleHQgc28gV3JpdGVCdWZmZXIgc2VlcyBjb21taXR0ZWQgZGF0YVxuICAgICAgY29uc3QgU3RhZ2VDb250ZXh0Q2xhc3MgPSBuZXN0ZWRSb290Q29udGV4dC5jb25zdHJ1Y3RvciBhcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBTdGFnZUNvbnRleHQ7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dCA9IG5ldyBTdGFnZUNvbnRleHRDbGFzcyhcbiAgICAgICAgJycsXG4gICAgICAgIG5lc3RlZFJvb3RDb250ZXh0LnN0YWdlTmFtZSxcbiAgICAgICAgbmVzdGVkUnVudGltZS5nbG9iYWxTdG9yZSxcbiAgICAgICAgJycsXG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuZXhlY3V0aW9uSGlzdG9yeSxcbiAgICAgICk7XG4gICAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBuZXN0ZWRSb290Q29udGV4dDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3ViZmxvdyBIYW5kbGVyRGVwc1xuICAgIGNvbnN0IHN1YmZsb3dEZXBzID0gY3JlYXRlU3ViZmxvd0hhbmRsZXJEZXBzKHRoaXMuZGVwcywgbmVzdGVkUnVudGltZSwgbWFwcGVkSW5wdXQpO1xuICAgIHBhcmVudENvbnRleHQuYWRkTG9nKCdzdWJmbG93UmVhZE9ubHlDb250ZXh0JywgbWFwcGVkSW5wdXQpO1xuXG4gICAgY29uc3Qgc3ViZmxvd0JyZWFrRmxhZyA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG5cbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IEJvb2xlYW4obm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IHN1YmZsb3dOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIC4uLm5vZGUsXG4gICAgICBpc1N1YmZsb3dSb290OiBmYWxzZSxcbiAgICAgIG5leHQ6IGhhc0NoaWxkcmVuID8gdW5kZWZpbmVkIDogbm9kZS5uZXh0LFxuICAgIH07XG5cbiAgICBsZXQgc3ViZmxvd091dHB1dDogYW55O1xuICAgIGxldCBzdWJmbG93RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHNNYXAgPSBzdWJmbG93UmVzdWx0c01hcDtcbiAgICAgIHRoaXMuY3VycmVudFN1YmZsb3dSb290ID0gc3ViZmxvd05vZGU7XG4gICAgICB0aGlzLmN1cnJlbnRTdWJmbG93RGVwcyA9IHN1YmZsb3dEZXBzO1xuXG4gICAgICBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3ViZmxvd0ludGVybmFsKHN1YmZsb3dOb2RlLCBuZXN0ZWRSb290Q29udGV4dCwgc3ViZmxvd0JyZWFrRmxhZywgc3ViZmxvd0lkKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBzdWJmbG93RXJyb3IgPSBlcnJvcjtcbiAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ3N1YmZsb3dFcnJvcicsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7IGVycm9yIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdWJmbG93Um9vdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY3VycmVudFN1YmZsb3dEZXBzID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dUcmVlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUuZ2V0U25hcHNob3QoKTtcblxuICAgIC8vIOKUgOKUgOKUgCBPdXRwdXQgTWFwcGluZyDilIDilIDilIBcbiAgICBpZiAoIXN1YmZsb3dFcnJvciAmJiBtb3VudE9wdGlvbnM/Lm91dHB1dE1hcHBlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LmJyYW5jaElkICE9PSAnJyAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkge1xuICAgICAgICAgIG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0LnBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gb3V0cHV0Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICBjb25zdCBtYXBwZWRPdXRwdXQgPSBhcHBseU91dHB1dE1hcHBpbmcoc3ViZmxvd091dHB1dCwgcGFyZW50U2NvcGUsIG91dHB1dENvbnRleHQsIG1vdW50T3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG1hcHBlZE91dHB1dCAmJiBPYmplY3Qua2V5cyhtYXBwZWRPdXRwdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwYXJlbnRDb250ZXh0LmFkZExvZygnbWFwcGVkT3V0cHV0JywgbWFwcGVkT3V0cHV0KTtcbiAgICAgICAgICBwYXJlbnRDb250ZXh0LmFkZExvZygnb3V0cHV0TWFwcGluZ1RhcmdldCcsIG91dHB1dENvbnRleHQuYnJhbmNoSWQgfHwgJyhyb290KScpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0Q29udGV4dC5jb21taXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignb3V0cHV0TWFwcGVyRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gb3V0cHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1Jlc3VsdDogU3ViZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDogc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlLFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBzdWJmbG93VHJlZUNvbnRleHQuZXhlY3V0aW9uVHJlZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBzdWJmbG93VHJlZUNvbnRleHQuY29tbWl0TG9nLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQ6IHBhcmVudENvbnRleHQuZ2V0U3RhZ2VJZCgpLFxuICAgIH07XG5cbiAgICBjb25zdCBzdWJmbG93RGVmID0gdGhpcy5kZXBzLnN1YmZsb3dzPy5bc3ViZmxvd0lkXTtcbiAgICBpZiAoc3ViZmxvd0RlZiAmJiAoc3ViZmxvd0RlZiBhcyBhbnkpLmJ1aWxkVGltZVN0cnVjdHVyZSkge1xuICAgICAgc3ViZmxvd1Jlc3VsdC5waXBlbGluZVN0cnVjdHVyZSA9IChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlO1xuICAgIH1cblxuICAgIHBhcmVudENvbnRleHQuYWRkTG9nKCdzdWJmbG93UmVzdWx0Jywgc3ViZmxvd1Jlc3VsdCk7XG4gICAgcGFyZW50Q29udGV4dC5hZGRMb2coJ2hhc1N1YmZsb3dEYXRhJywgdHJ1ZSk7XG4gICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KHN1YmZsb3dJZCwgc3ViZmxvd1Jlc3VsdCk7XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRXhpdGluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0V4aXQoc3ViZmxvd05hbWUpO1xuXG4gICAgcGFyZW50Q29udGV4dC5jb21taXQoKTtcblxuICAgIGlmIChzdWJmbG93RXJyb3IpIHtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBleGVjdXRpb24gd2l0aGluIHN1YmZsb3cgY29udGV4dC5cbiAgICogTWlycm9ycyB0aGUgdHJhdmVyc2VyJ3MgZXhlY3V0ZU5vZGUgYnV0IHdpdGhpbiB0aGUgc3ViZmxvdydzIGlzb2xhdGVkIHJ1bnRpbWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdWJmbG93SW50ZXJuYWwoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBEZXRlY3QgbmVzdGVkIHN1YmZsb3dzXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dJZCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWROb2RlID0gdGhpcy5ub2RlUmVzb2x2ZXIucmVzb2x2ZVN1YmZsb3dSZWZlcmVuY2Uobm9kZSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlU3ViZmxvdyhyZXNvbHZlZE5vZGUsIGNvbnRleHQsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCwgdGhpcy5zdWJmbG93UmVzdWx0c01hcCEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWdlRnVuYyA9IHRoaXMuZ2V0U3RhZ2VGbihub2RlKTtcbiAgICBjb25zdCBicmVha0ZuID0gKCkgPT4gKGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWUpO1xuXG4gICAgbGV0IHN0YWdlT3V0cHV0OiBUT3V0IHwgdW5kZWZpbmVkO1xuICAgIGlmIChzdGFnZUZ1bmMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdWJmbG93RGVwcykge1xuICAgICAgICAgIGNvbnN0IHN1YmZsb3dTdGFnZVJ1bm5lciA9IG5ldyBTdGFnZVJ1bm5lcjxUT3V0LCBUU2NvcGU+KHRoaXMuY3VycmVudFN1YmZsb3dEZXBzKTtcbiAgICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHN1YmZsb3dTdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgdGhpcy5jYWxsRXh0cmFjdG9yKG5vZGUsIGNvbnRleHQsIHRoaXMuZ2V0U3RhZ2VQYXRoKG5vZGUsIGJyYW5jaFBhdGgsIGNvbnRleHQuc3RhZ2VOYW1lKSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgdHlwZTogJ3N0YWdlRXhlY3V0aW9uRXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLnRvU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZXh0LmFkZEVycm9yKCdzdGFnZUV4ZWN1dGlvbkVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgIHRoaXMuY2FsbEV4dHJhY3Rvcihub2RlLCBjb250ZXh0LCB0aGlzLmdldFN0YWdlUGF0aChub2RlLCBicmFuY2hQYXRoLCBjb250ZXh0LnN0YWdlTmFtZSksIHN0YWdlT3V0cHV0KTtcblxuICAgICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm5cbiAgICAgIGlmIChzdGFnZU91dHB1dCAmJiB0eXBlb2Ygc3RhZ2VPdXRwdXQgPT09ICdvYmplY3QnICYmIGlzU3RhZ2VOb2RlUmV0dXJuKHN0YWdlT3V0cHV0KSkge1xuICAgICAgICBjb25zdCBkeW5hbWljTm9kZSA9IHN0YWdlT3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgICBjb250ZXh0LmFkZExvZygnaXNEeW5hbWljJywgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdTdGFnZU5vZGVSZXR1cm4nKTtcblxuICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4gJiYgZHluYW1pY05vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBkeW5hbWljTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY0NoaWxkQ291bnQnLCBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKFxuICAgICAgICAgICAgJ2R5bmFtaWNDaGlsZElkcycsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQgfHwgYy5uYW1lKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBub2RlLm5leHROb2RlU2VsZWN0b3IgPSBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICAgICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc1NlbGVjdG9yJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLm5leHQpIHtcbiAgICAgICAgICBub2RlLm5leHQgPSBkeW5hbWljTm9kZS5uZXh0O1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdoYXNEeW5hbWljTmV4dCcsIHRydWUpO1xuICAgICAgICAgIGNvbnN0IGxvb3BUYXJnZXRJZCA9IGR5bmFtaWNOb2RlLm5leHQuaWQgfHwgZHluYW1pY05vZGUubmV4dC5uYW1lO1xuICAgICAgICAgIGlmIChsb29wVGFyZ2V0SWQpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdsb29wVGFyZ2V0JywgbG9vcFRhcmdldElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdGFnZU91dHB1dCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgQ2hpbGRyZW4gZGlzcGF0Y2gg4pSA4pSA4pSAXG4gICAgY29uc3QgaGFzQ2hpbGRyZW5BZnRlclN0YWdlID0gQm9vbGVhbihub2RlLmNoaWxkcmVuPy5sZW5ndGgpO1xuICAgIGNvbnN0IGhhc05leHRBZnRlclN0YWdlID0gQm9vbGVhbihub2RlLm5leHQpO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSkge1xuICAgICAgaWYgKG5vZGUubmV4dE5vZGVTZWxlY3Rvcikge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5leGVjdXRlU2VsZWN0ZWRDaGlsZHJlbkludGVybmFsKFxuICAgICAgICAgIG5vZGUubmV4dE5vZGVTZWxlY3RvcixcbiAgICAgICAgICBub2RlLmNoaWxkcmVuISxcbiAgICAgICAgICBzdGFnZU91dHB1dCxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWhhc05leHRBZnRlclN0YWdlKSByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlQ2hpbGRyZW5JbnRlcm5hbChub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCBicmVha0ZsYWcpO1xuICAgICAgICBpZiAoIWhhc05leHRBZnRlclN0YWdlKSByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgTGluZWFyIG5leHQg4pSA4pSA4pSAXG4gICAgaWYgKGhhc05leHRBZnRlclN0YWdlKSB7XG4gICAgICBsZXQgbmV4dE5vZGUgPSBub2RlLm5leHQhO1xuXG4gICAgICAvLyBSZXNvbHZlIHJlZmVyZW5jZSBub2RlcyAoaGFzIGlkIGJ1dCBubyBmbilcbiAgICAgIGlmIChuZXh0Tm9kZS5pZCAmJiAhbmV4dE5vZGUuZm4pIHtcbiAgICAgICAgbGV0IHJlc29sdmVkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdWJmbG93Um9vdCkge1xuICAgICAgICAgIHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLmZpbmROb2RlQnlJZChuZXh0Tm9kZS5pZCwgdGhpcy5jdXJyZW50U3ViZmxvd1Jvb3QpO1xuICAgICAgICAgIGlmIChyZXNvbHZlZE5vZGUpIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljTmV4dFJlc29sdmVkRnJvbScsICdzdWJmbG93Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXNvbHZlZE5vZGUpIHtcbiAgICAgICAgICByZXNvbHZlZE5vZGUgPSB0aGlzLm5vZGVSZXNvbHZlci5maW5kTm9kZUJ5SWQobmV4dE5vZGUuaWQpO1xuICAgICAgICAgIGlmIChyZXNvbHZlZE5vZGUpIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljTmV4dFJlc29sdmVkRnJvbScsICdtYWluUGlwZWxpbmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzb2x2ZWROb2RlKSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSByZXNvbHZlZE5vZGU7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0UmVzb2x2ZWQnLCB0cnVlKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY05leHRUYXJnZXQnLCBuZXh0Tm9kZS5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5pbmZvKGBEeW5hbWljIG5leHQgbm9kZSAnJHtuZXh0Tm9kZS5pZH0nIG5vdCBmb3VuZCBpbiBzdWJmbG93IG9yIG1haW4gcGlwZWxpbmVgKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY05leHRSZXNvbHZlZCcsIGZhbHNlKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY05leHROb3RGb3VuZCcsIG5leHROb2RlLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KCcnLCBuZXh0Tm9kZS5uYW1lKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJmbG93SW50ZXJuYWwobmV4dE5vZGUsIG5leHRDdHgsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWdlT3V0cHV0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFnZVBhdGgobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIGJyYW5jaFBhdGg/OiBzdHJpbmcsIGNvbnRleHRTdGFnZU5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VOYW1lID0gbm9kZS5pZCA/PyBub2RlLm5hbWU7XG4gICAgY29uc3Qgbm9kZUlkID0gY29udGV4dFN0YWdlTmFtZSAmJiBjb250ZXh0U3RhZ2VOYW1lICE9PSBub2RlLm5hbWUgPyBjb250ZXh0U3RhZ2VOYW1lIDogYmFzZU5hbWU7XG4gICAgaWYgKCFicmFuY2hQYXRoKSByZXR1cm4gbm9kZUlkO1xuICAgIHJldHVybiBgJHticmFuY2hQYXRofS4ke25vZGVJZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZUNoaWxkcmVuSW50ZXJuYWwoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyxcbiAgICBicmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT4+IHtcbiAgICBjb25zdCBjaGlsZFByb21pc2VzOiBQcm9taXNlPE5vZGVSZXN1bHRUeXBlPltdID0gKG5vZGUuY2hpbGRyZW4gPz8gW10pLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkQ29udGV4dCA9IGNvbnRleHQuY3JlYXRlQ2hpbGQoJycsIGNoaWxkLmlkIGFzIHN0cmluZywgY2hpbGQubmFtZSk7XG4gICAgICBjb25zdCBjaGlsZEJyZWFrRmxhZyA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG5cbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJmbG93SW50ZXJuYWwoY2hpbGQsIGNoaWxkQ29udGV4dCwgY2hpbGRCcmVha0ZsYWcsIGJyYW5jaFBhdGgpXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBjaGlsZENvbnRleHQuY29tbWl0KCk7XG4gICAgICAgICAgcmV0dXJuIHsgaWQ6IGNoaWxkLmlkISwgcmVzdWx0LCBpc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY2hpbGRDb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuaW5mbyhgVFJFRSBQSVBFTElORTogZXhlY3V0ZU5vZGVDaGlsZHJlbkludGVybmFsIC0gRXJyb3IgZm9yIGlkOiAke2NoaWxkPy5pZH1gLCB7IGVycm9yIH0pO1xuICAgICAgICAgIHJldHVybiB7IGlkOiBjaGlsZC5pZCEsIHJlc3VsdDogZXJyb3IsIGlzRXJyb3I6IHRydWUgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNoaWxkUHJvbWlzZXMpO1xuICAgIGNvbnN0IGNoaWxkcmVuUmVzdWx0czogUmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+ID0ge307XG4gICAgc2V0dGxlZC5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBpZiAocy5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgIGNvbnN0IHsgaWQsIHJlc3VsdCwgaXNFcnJvciB9ID0gcy52YWx1ZTtcbiAgICAgICAgY2hpbGRyZW5SZXN1bHRzW2lkXSA9IHsgaWQsIHJlc3VsdCwgaXNFcnJvciB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXhlY3V0aW9uIGZhaWxlZDogJHtzLnJlYXNvbn1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hpbGRyZW5SZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlU2VsZWN0ZWRDaGlsZHJlbkludGVybmFsKFxuICAgIHNlbGVjdG9yOiBTZWxlY3RvcixcbiAgICBjaGlsZHJlbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSxcbiAgICBpbnB1dDogYW55LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcsXG4gICAgYnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+PiB7XG4gICAgY29uc3Qgc2VsZWN0b3JSZXN1bHQgPSBhd2FpdCBzZWxlY3RvcihpbnB1dCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBBcnJheS5pc0FycmF5KHNlbGVjdG9yUmVzdWx0KSA/IHNlbGVjdG9yUmVzdWx0IDogW3NlbGVjdG9yUmVzdWx0XTtcblxuICAgIGNvbnRleHQuYWRkTG9nKCdzZWxlY3RlZENoaWxkSWRzJywgc2VsZWN0ZWRJZHMpO1xuICAgIGNvbnRleHQuYWRkTG9nKCdzZWxlY3RvclBhdHRlcm4nLCAnbXVsdGktY2hvaWNlJyk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250ZXh0LmFkZExvZygnc2tpcHBlZEFsbENoaWxkcmVuJywgdHJ1ZSk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRDaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcigoYykgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5pZCEpKTtcbiAgICBpZiAoc2VsZWN0ZWRDaGlsZHJlbi5sZW5ndGggIT09IHNlbGVjdGVkSWRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2hpbGRJZHMgPSBjaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQpO1xuICAgICAgY29uc3QgbWlzc2luZyA9IHNlbGVjdGVkSWRzLmZpbHRlcigoaWQpID0+ICFjaGlsZElkcy5pbmNsdWRlcyhpZCkpO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFNlbGVjdG9yIHJldHVybmVkIHVua25vd24gY2hpbGQgSURzOiAke21pc3Npbmcuam9pbignLCAnKX0uIEF2YWlsYWJsZTogJHtjaGlsZElkcy5qb2luKFxuICAgICAgICAnLCAnLFxuICAgICAgKX1gO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gc3ViZmxvdyAoJHticmFuY2hQYXRofSk6YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgY29udGV4dC5hZGRFcnJvcignc2VsZWN0b3JFcnJvcicsIGVycm9yTWVzc2FnZSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBza2lwcGVkSWRzID0gY2hpbGRyZW4uZmlsdGVyKChjKSA9PiAhc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5pZCEpKS5tYXAoKGMpID0+IGMuaWQpO1xuICAgIGlmIChza2lwcGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQ2hpbGRJZHMnLCBza2lwcGVkSWRzKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6ICdzZWxlY3Rvci10ZW1wJywgY2hpbGRyZW46IHNlbGVjdGVkQ2hpbGRyZW4gfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTm9kZUNoaWxkcmVuSW50ZXJuYWwodGVtcE5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIGJyZWFrRmxhZyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * SubflowInputMapper — Pure functions for subflow data contracts.
4
+ *
5
+ * Mental model: Subflow = Pure Function
6
+ * - Isolated scope (own GlobalStore)
7
+ * - Explicit inputs via inputMapper
8
+ * - Explicit outputs via outputMapper
9
+ *
10
+ * | Scenario | Behavior |
11
+ * |-----------------|-------------------------------------------|
12
+ * | No inputMapper | Subflow starts with empty scope |
13
+ * | No outputMapper | Subflow scope changes discarded |
14
+ * | Both present | Full data contract (args in, results out) |
15
+ * | Neither present | Complete isolation (side effects only) |
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.applyOutputMapping = exports.seedSubflowGlobalStore = exports.createSubflowHandlerDeps = exports.getInitialScopeValues = exports.extractParentScopeValues = void 0;
19
+ /** Extract values from parent scope using inputMapper. */
20
+ function extractParentScopeValues(parentScope, options) {
21
+ if (!(options === null || options === void 0 ? void 0 : options.inputMapper)) {
22
+ return {};
23
+ }
24
+ const result = options.inputMapper(parentScope);
25
+ if (result === null || result === undefined) {
26
+ return {};
27
+ }
28
+ return result;
29
+ }
30
+ exports.extractParentScopeValues = extractParentScopeValues;
31
+ /**
32
+ * Get the initial scope values for a subflow.
33
+ * Always isolated — only inputMapper values are included.
34
+ */
35
+ function getInitialScopeValues(parentScope, options) {
36
+ return extractParentScopeValues(parentScope, options);
37
+ }
38
+ exports.getInitialScopeValues = getInitialScopeValues;
39
+ /**
40
+ * Create a new HandlerDeps for subflow execution.
41
+ * Key: sets readOnlyContext to mapped input so StageRunner passes it to ScopeFactory.
42
+ */
43
+ function createSubflowHandlerDeps(parentDeps, subflowRuntime, mappedInput) {
44
+ return {
45
+ stageMap: parentDeps.stageMap,
46
+ root: parentDeps.root,
47
+ ScopeFactory: parentDeps.ScopeFactory,
48
+ subflows: parentDeps.subflows,
49
+ throttlingErrorChecker: parentDeps.throttlingErrorChecker,
50
+ streamHandlers: parentDeps.streamHandlers,
51
+ scopeProtectionMode: parentDeps.scopeProtectionMode,
52
+ executionRuntime: subflowRuntime,
53
+ readOnlyContext: mappedInput,
54
+ narrativeGenerator: parentDeps.narrativeGenerator,
55
+ logger: parentDeps.logger,
56
+ };
57
+ }
58
+ exports.createSubflowHandlerDeps = createSubflowHandlerDeps;
59
+ /**
60
+ * Seed the subflow's GlobalStore with initial values.
61
+ * Called before subflow execution to make inputMapper values available.
62
+ */
63
+ function seedSubflowGlobalStore(subflowRuntime, initialValues) {
64
+ const rootContext = subflowRuntime.rootStageContext;
65
+ for (const [key, value] of Object.entries(initialValues)) {
66
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
67
+ for (const [nestedKey, nestedValue] of Object.entries(value)) {
68
+ rootContext.setObject([key], nestedKey, nestedValue);
69
+ }
70
+ }
71
+ else {
72
+ rootContext.setGlobal(key, value);
73
+ }
74
+ }
75
+ rootContext.commit();
76
+ }
77
+ exports.seedSubflowGlobalStore = seedSubflowGlobalStore;
78
+ /**
79
+ * Apply output mapping after subflow completion.
80
+ * Writes mapped values back to parent scope using merge semantics:
81
+ * arrays are appended, objects are shallow-merged, scalars are replaced.
82
+ */
83
+ function applyOutputMapping(subflowOutput, parentScope, parentContext, options) {
84
+ if (!(options === null || options === void 0 ? void 0 : options.outputMapper)) {
85
+ return undefined;
86
+ }
87
+ const mappedOutput = options.outputMapper(subflowOutput, parentScope);
88
+ if (mappedOutput === null || mappedOutput === undefined) {
89
+ return undefined;
90
+ }
91
+ for (const [key, value] of Object.entries(mappedOutput)) {
92
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
93
+ for (const [nestedKey, nestedValue] of Object.entries(value)) {
94
+ if (Array.isArray(nestedValue)) {
95
+ parentContext.appendToArray([key], nestedKey, nestedValue);
96
+ }
97
+ else if (typeof nestedValue === 'object' && nestedValue !== null) {
98
+ parentContext.mergeObject([key], nestedKey, nestedValue);
99
+ }
100
+ else {
101
+ parentContext.setObject([key], nestedKey, nestedValue);
102
+ }
103
+ }
104
+ }
105
+ else if (Array.isArray(value)) {
106
+ const existing = parentContext.getGlobal(key);
107
+ if (Array.isArray(existing)) {
108
+ parentContext.setGlobal(key, [...existing, ...value]);
109
+ }
110
+ else {
111
+ parentContext.setGlobal(key, value);
112
+ }
113
+ }
114
+ else {
115
+ parentContext.setGlobal(key, value);
116
+ }
117
+ }
118
+ return mappedOutput;
119
+ }
120
+ exports.applyOutputMapping = applyOutputMapping;
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0lucHV0TWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0lucHV0TWFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBS0gsMERBQTBEO0FBQzFELFNBQWdCLHdCQUF3QixDQUN0QyxXQUF5QixFQUN6QixPQUEwRDtJQUUxRCxJQUFJLENBQUMsQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVyxDQUFBLEVBQUUsQ0FBQztRQUMxQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQWRELDREQWNDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLFdBQXlCLEVBQ3pCLE9BQTBEO0lBRTFELE9BQU8sd0JBQXdCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBNEIsQ0FBQztBQUNuRixDQUFDO0FBTEQsc0RBS0M7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FDdEMsVUFBcUMsRUFDckMsY0FBaUMsRUFDakMsV0FBb0M7SUFFcEMsT0FBTztRQUNMLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtRQUM3QixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFDckIsWUFBWSxFQUFFLFVBQVUsQ0FBQyxZQUFZO1FBQ3JDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtRQUM3QixzQkFBc0IsRUFBRSxVQUFVLENBQUMsc0JBQXNCO1FBQ3pELGNBQWMsRUFBRSxV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TSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM1QixhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBeENELGdEQXdDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3ViZmxvd0lucHV0TWFwcGVyIOKAlCBQdXJlIGZ1bmN0aW9ucyBmb3Igc3ViZmxvdyBkYXRhIGNvbnRyYWN0cy5cbiAqXG4gKiBNZW50YWwgbW9kZWw6IFN1YmZsb3cgPSBQdXJlIEZ1bmN0aW9uXG4gKiAtIElzb2xhdGVkIHNjb3BlIChvd24gR2xvYmFsU3RvcmUpXG4gKiAtIEV4cGxpY2l0IGlucHV0cyB2aWEgaW5wdXRNYXBwZXJcbiAqIC0gRXhwbGljaXQgb3V0cHV0cyB2aWEgb3V0cHV0TWFwcGVyXG4gKlxuICogfCBTY2VuYXJpbyAgICAgICAgfCBCZWhhdmlvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgTm8gaW5wdXRNYXBwZXIgIHwgU3ViZmxvdyBzdGFydHMgd2l0aCBlbXB0eSBzY29wZSAgICAgICAgICAgfFxuICogfCBObyBvdXRwdXRNYXBwZXIgfCBTdWJmbG93IHNjb3BlIGNoYW5nZXMgZGlzY2FyZGVkICAgICAgICAgICB8XG4gKiB8IEJvdGggcHJlc2VudCAgICB8IEZ1bGwgZGF0YSBjb250cmFjdCAoYXJncyBpbiwgcmVzdWx0cyBvdXQpIHxcbiAqIHwgTmVpdGhlciBwcmVzZW50IHwgQ29tcGxldGUgaXNvbGF0aW9uIChzaWRlIGVmZmVjdHMgb25seSkgICAgfFxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzLCBJRXhlY3V0aW9uUnVudGltZSwgU3ViZmxvd01vdW50T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqIEV4dHJhY3QgdmFsdWVzIGZyb20gcGFyZW50IHNjb3BlIHVzaW5nIGlucHV0TWFwcGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQYXJlbnRTY29wZVZhbHVlczxUUGFyZW50U2NvcGUsIFRTdWJmbG93SW5wdXQ+KFxuICBwYXJlbnRTY29wZTogVFBhcmVudFNjb3BlLFxuICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9uczxUUGFyZW50U2NvcGUsIFRTdWJmbG93SW5wdXQ+LFxuKTogVFN1YmZsb3dJbnB1dCB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCFvcHRpb25zPy5pbnB1dE1hcHBlcikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IG9wdGlvbnMuaW5wdXRNYXBwZXIocGFyZW50U2NvcGUpO1xuICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGluaXRpYWwgc2NvcGUgdmFsdWVzIGZvciBhIHN1YmZsb3cuXG4gKiBBbHdheXMgaXNvbGF0ZWQg4oCUIG9ubHkgaW5wdXRNYXBwZXIgdmFsdWVzIGFyZSBpbmNsdWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYWxTY29wZVZhbHVlczxUUGFyZW50U2NvcGUsIFRTdWJmbG93SW5wdXQ+KFxuICBwYXJlbnRTY29wZTogVFBhcmVudFNjb3BlLFxuICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9uczxUUGFyZW50U2NvcGUsIFRTdWJmbG93SW5wdXQ+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gZXh0cmFjdFBhcmVudFNjb3BlVmFsdWVzKHBhcmVudFNjb3BlLCBvcHRpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgSGFuZGxlckRlcHMgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICogS2V5OiBzZXRzIHJlYWRPbmx5Q29udGV4dCB0byBtYXBwZWQgaW5wdXQgc28gU3RhZ2VSdW5uZXIgcGFzc2VzIGl0IHRvIFNjb3BlRmFjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1YmZsb3dIYW5kbGVyRGVwczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBwYXJlbnREZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICBzdWJmbG93UnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIG1hcHBlZElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICByZXR1cm4ge1xuICAgIHN0YWdlTWFwOiBwYXJlbnREZXBzLnN0YWdlTWFwLFxuICAgIHJvb3Q6IHBhcmVudERlcHMucm9vdCxcbiAgICBTY29wZUZhY3Rvcnk6IHBhcmVudERlcHMuU2NvcGVGYWN0b3J5LFxuICAgIHN1YmZsb3dzOiBwYXJlbnREZXBzLnN1YmZsb3dzLFxuICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IHBhcmVudERlcHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICBzdHJlYW1IYW5kbGVyczogcGFyZW50RGVwcy5zdHJlYW1IYW5kbGVycyxcbiAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBwYXJlbnREZXBzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgZXhlY3V0aW9uUnVudGltZTogc3ViZmxvd1J1bnRpbWUsXG4gICAgcmVhZE9ubHlDb250ZXh0OiBtYXBwZWRJbnB1dCxcbiAgICBuYXJyYXRpdmVHZW5lcmF0b3I6IHBhcmVudERlcHMubmFycmF0aXZlR2VuZXJhdG9yLFxuICAgIGxvZ2dlcjogcGFyZW50RGVwcy5sb2dnZXIsXG4gIH07XG59XG5cbi8qKlxuICogU2VlZCB0aGUgc3ViZmxvdydzIEdsb2JhbFN0b3JlIHdpdGggaW5pdGlhbCB2YWx1ZXMuXG4gKiBDYWxsZWQgYmVmb3JlIHN1YmZsb3cgZXhlY3V0aW9uIHRvIG1ha2UgaW5wdXRNYXBwZXIgdmFsdWVzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUoXG4gIHN1YmZsb3dSdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZSxcbiAgaW5pdGlhbFZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgcm9vdENvbnRleHQgPSBzdWJmbG93UnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxWYWx1ZXMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtuZXN0ZWRLZXksIG5lc3RlZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgICAgcm9vdENvbnRleHQuc2V0T2JqZWN0KFtrZXldLCBuZXN0ZWRLZXksIG5lc3RlZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdENvbnRleHQuc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJvb3RDb250ZXh0LmNvbW1pdCgpO1xufVxuXG4vKipcbiAqIEFwcGx5IG91dHB1dCBtYXBwaW5nIGFmdGVyIHN1YmZsb3cgY29tcGxldGlvbi5cbiAqIFdyaXRlcyBtYXBwZWQgdmFsdWVzIGJhY2sgdG8gcGFyZW50IHNjb3BlIHVzaW5nIG1lcmdlIHNlbWFudGljczpcbiAqIGFycmF5cyBhcmUgYXBwZW5kZWQsIG9iamVjdHMgYXJlIHNoYWxsb3ctbWVyZ2VkLCBzY2FsYXJzIGFyZSByZXBsYWNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T3V0cHV0TWFwcGluZzxUUGFyZW50U2NvcGUsIFRTdWJmbG93T3V0cHV0PihcbiAgc3ViZmxvd091dHB1dDogVFN1YmZsb3dPdXRwdXQsXG4gIHBhcmVudFNjb3BlOiBUUGFyZW50U2NvcGUsXG4gIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnM8VFBhcmVudFNjb3BlLCBhbnksIFRTdWJmbG93T3V0cHV0Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvcHRpb25zPy5vdXRwdXRNYXBwZXIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgbWFwcGVkT3V0cHV0ID0gb3B0aW9ucy5vdXRwdXRNYXBwZXIoc3ViZmxvd091dHB1dCwgcGFyZW50U2NvcGUpO1xuXG4gIGlmIChtYXBwZWRPdXRwdXQgPT09IG51bGwgfHwgbWFwcGVkT3V0cHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWFwcGVkT3V0cHV0KSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBbbmVzdGVkS2V5LCBuZXN0ZWRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5lc3RlZFZhbHVlKSkge1xuICAgICAgICAgIHBhcmVudENvbnRleHQuYXBwZW5kVG9BcnJheShba2V5XSwgbmVzdGVkS2V5LCBuZXN0ZWRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5lc3RlZFZhbHVlID09PSAnb2JqZWN0JyAmJiBuZXN0ZWRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHBhcmVudENvbnRleHQubWVyZ2VPYmplY3QoW2tleV0sIG5lc3RlZEtleSwgbmVzdGVkVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudENvbnRleHQuc2V0T2JqZWN0KFtrZXldLCBuZXN0ZWRLZXksIG5lc3RlZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcGFyZW50Q29udGV4dC5nZXRHbG9iYWwoa2V5KTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LnNldEdsb2JhbChrZXksIFsuLi5leGlzdGluZywgLi4udmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudENvbnRleHQuc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRDb250ZXh0LnNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWFwcGVkT3V0cHV0O1xufVxuIl19
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /* istanbul ignore file */
3
+ /**
4
+ * Barrel export for all engine handler modules.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RuntimeStructureManager = exports.computeNodeType = exports.ExtractorRunner = exports.seedSubflowGlobalStore = exports.getInitialScopeValues = exports.extractParentScopeValues = exports.createSubflowHandlerDeps = exports.applyOutputMapping = exports.SubflowExecutor = exports.DEFAULT_MAX_ITERATIONS = exports.ContinuationResolver = exports.SelectorHandler = exports.DeciderHandler = exports.ChildrenExecutor = exports.NodeResolver = exports.StageRunner = void 0;
8
+ // Stage execution
9
+ var StageRunner_1 = require("./StageRunner");
10
+ Object.defineProperty(exports, "StageRunner", { enumerable: true, get: function () { return StageRunner_1.StageRunner; } });
11
+ // Node resolution and subflow reference handling
12
+ var NodeResolver_1 = require("./NodeResolver");
13
+ Object.defineProperty(exports, "NodeResolver", { enumerable: true, get: function () { return NodeResolver_1.NodeResolver; } });
14
+ var ChildrenExecutor_1 = require("./ChildrenExecutor");
15
+ Object.defineProperty(exports, "ChildrenExecutor", { enumerable: true, get: function () { return ChildrenExecutor_1.ChildrenExecutor; } });
16
+ var DeciderHandler_1 = require("./DeciderHandler");
17
+ Object.defineProperty(exports, "DeciderHandler", { enumerable: true, get: function () { return DeciderHandler_1.DeciderHandler; } });
18
+ // Multi-choice filtered fan-out
19
+ var SelectorHandler_1 = require("./SelectorHandler");
20
+ Object.defineProperty(exports, "SelectorHandler", { enumerable: true, get: function () { return SelectorHandler_1.SelectorHandler; } });
21
+ // Back-edge resolution + iteration counting (was LoopHandler)
22
+ var ContinuationResolver_1 = require("./ContinuationResolver");
23
+ Object.defineProperty(exports, "ContinuationResolver", { enumerable: true, get: function () { return ContinuationResolver_1.ContinuationResolver; } });
24
+ Object.defineProperty(exports, "DEFAULT_MAX_ITERATIONS", { enumerable: true, get: function () { return ContinuationResolver_1.DEFAULT_MAX_ITERATIONS; } });
25
+ // Subflow execution with isolated contexts
26
+ var SubflowExecutor_1 = require("./SubflowExecutor");
27
+ Object.defineProperty(exports, "SubflowExecutor", { enumerable: true, get: function () { return SubflowExecutor_1.SubflowExecutor; } });
28
+ // Subflow input/output mapping
29
+ var SubflowInputMapper_1 = require("./SubflowInputMapper");
30
+ Object.defineProperty(exports, "applyOutputMapping", { enumerable: true, get: function () { return SubflowInputMapper_1.applyOutputMapping; } });
31
+ Object.defineProperty(exports, "createSubflowHandlerDeps", { enumerable: true, get: function () { return SubflowInputMapper_1.createSubflowHandlerDeps; } });
32
+ Object.defineProperty(exports, "extractParentScopeValues", { enumerable: true, get: function () { return SubflowInputMapper_1.extractParentScopeValues; } });
33
+ Object.defineProperty(exports, "getInitialScopeValues", { enumerable: true, get: function () { return SubflowInputMapper_1.getInitialScopeValues; } });
34
+ Object.defineProperty(exports, "seedSubflowGlobalStore", { enumerable: true, get: function () { return SubflowInputMapper_1.seedSubflowGlobalStore; } });
35
+ // Traversal extractor coordination
36
+ var ExtractorRunner_1 = require("./ExtractorRunner");
37
+ Object.defineProperty(exports, "ExtractorRunner", { enumerable: true, get: function () { return ExtractorRunner_1.ExtractorRunner; } });
38
+ // Runtime structure management (dynamic pipeline structure tracking)
39
+ var RuntimeStructureManager_1 = require("./RuntimeStructureManager");
40
+ Object.defineProperty(exports, "computeNodeType", { enumerable: true, get: function () { return RuntimeStructureManager_1.computeNodeType; } });
41
+ Object.defineProperty(exports, "RuntimeStructureManager", { enumerable: true, get: function () { return RuntimeStructureManager_1.RuntimeStructureManager; } });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQTBCO0FBQzFCOztHQUVHOzs7QUFFSCxrQkFBa0I7QUFDbEIsNkNBQTRDO0FBQW5DLDBHQUFBLFdBQVcsT0FBQTtBQUVwQixpREFBaUQ7QUFDakQsK0NBQThDO0FBQXJDLDRHQUFBLFlBQVksT0FBQTtBQUlyQix1REFBc0Q7QUFBN0Msb0hBQUEsZ0JBQWdCLE9BQUE7QUFJekIsbURBQWtEO0FBQXpDLGdIQUFBLGNBQWMsT0FBQTtBQUV2QixnQ0FBZ0M7QUFDaEMscURBQW9EO0FBQTNDLGtIQUFBLGVBQWUsT0FBQTtBQUV4Qiw4REFBOEQ7QUFDOUQsK0RBQXNGO0FBQTdFLDRIQUFBLG9CQUFvQixPQUFBO0FBQUUsOEhBQUEsc0JBQXNCLE9BQUE7QUFFckQsMkNBQTJDO0FBQzNDLHFEQUFvRDtBQUEzQyxrSEFBQSxlQUFlLE9BQUE7QUFFeEIsK0JBQStCO0FBQy9CLDJEQU04QjtBQUw1Qix3SEFBQSxrQkFBa0IsT0FBQTtBQUNsQiw4SEFBQSx3QkFBd0IsT0FBQTtBQUN4Qiw4SEFBQSx3QkFBd0IsT0FBQTtBQUN4QiwySEFBQSxxQkFBcUIsT0FBQTtBQUNyQiw0SEFBQSxzQkFBc0IsT0FBQTtBQUd4QixtQ0FBbUM7QUFDbkMscURBQW9EO0FBQTNDLGtIQUFBLGVBQWUsT0FBQTtBQUV4QixxRUFBcUU7QUFDckUscUVBQXFGO0FBQTVFLDBIQUFBLGVBQWUsT0FBQTtBQUFFLGtJQUFBLHVCQUF1QixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbi8qKlxuICogQmFycmVsIGV4cG9ydCBmb3IgYWxsIGVuZ2luZSBoYW5kbGVyIG1vZHVsZXMuXG4gKi9cblxuLy8gU3RhZ2UgZXhlY3V0aW9uXG5leHBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4vU3RhZ2VSdW5uZXInO1xuXG4vLyBOb2RlIHJlc29sdXRpb24gYW5kIHN1YmZsb3cgcmVmZXJlbmNlIGhhbmRsaW5nXG5leHBvcnQgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuL05vZGVSZXNvbHZlcic7XG5cbi8vIFBhcmFsbGVsIGNoaWxkcmVuIGV4ZWN1dGlvblxuZXhwb3J0IHR5cGUgeyBFeGVjdXRlTm9kZUZuIH0gZnJvbSAnLi9DaGlsZHJlbkV4ZWN1dG9yJztcbmV4cG9ydCB7IENoaWxkcmVuRXhlY3V0b3IgfSBmcm9tICcuL0NoaWxkcmVuRXhlY3V0b3InO1xuXG4vLyBTaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaGluZ1xuZXhwb3J0IHR5cGUgeyBDYWxsRXh0cmFjdG9yRm4sIEdldFN0YWdlUGF0aEZuLCBSdW5TdGFnZUZuIH0gZnJvbSAnLi9EZWNpZGVySGFuZGxlcic7XG5leHBvcnQgeyBEZWNpZGVySGFuZGxlciB9IGZyb20gJy4vRGVjaWRlckhhbmRsZXInO1xuXG4vLyBNdWx0aS1jaG9pY2UgZmlsdGVyZWQgZmFuLW91dFxuZXhwb3J0IHsgU2VsZWN0b3JIYW5kbGVyIH0gZnJvbSAnLi9TZWxlY3RvckhhbmRsZXInO1xuXG4vLyBCYWNrLWVkZ2UgcmVzb2x1dGlvbiArIGl0ZXJhdGlvbiBjb3VudGluZyAod2FzIExvb3BIYW5kbGVyKVxuZXhwb3J0IHsgQ29udGludWF0aW9uUmVzb2x2ZXIsIERFRkFVTFRfTUFYX0lURVJBVElPTlMgfSBmcm9tICcuL0NvbnRpbnVhdGlvblJlc29sdmVyJztcblxuLy8gU3ViZmxvdyBleGVjdXRpb24gd2l0aCBpc29sYXRlZCBjb250ZXh0c1xuZXhwb3J0IHsgU3ViZmxvd0V4ZWN1dG9yIH0gZnJvbSAnLi9TdWJmbG93RXhlY3V0b3InO1xuXG4vLyBTdWJmbG93IGlucHV0L291dHB1dCBtYXBwaW5nXG5leHBvcnQge1xuICBhcHBseU91dHB1dE1hcHBpbmcsXG4gIGNyZWF0ZVN1YmZsb3dIYW5kbGVyRGVwcyxcbiAgZXh0cmFjdFBhcmVudFNjb3BlVmFsdWVzLFxuICBnZXRJbml0aWFsU2NvcGVWYWx1ZXMsXG4gIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUsXG59IGZyb20gJy4vU3ViZmxvd0lucHV0TWFwcGVyJztcblxuLy8gVHJhdmVyc2FsIGV4dHJhY3RvciBjb29yZGluYXRpb25cbmV4cG9ydCB7IEV4dHJhY3RvclJ1bm5lciB9IGZyb20gJy4vRXh0cmFjdG9yUnVubmVyJztcblxuLy8gUnVudGltZSBzdHJ1Y3R1cmUgbWFuYWdlbWVudCAoZHluYW1pYyBwaXBlbGluZSBzdHJ1Y3R1cmUgdHJhY2tpbmcpXG5leHBvcnQgeyBjb21wdXRlTm9kZVR5cGUsIFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIH0gZnJvbSAnLi9SdW50aW1lU3RydWN0dXJlTWFuYWdlcic7XG4iXX0=
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /* istanbul ignore file */
3
+ /**
4
+ * engine/ — Graph traversal engine library.
5
+ *
6
+ * Executes flowcharts built by FlowChartBuilder via pre-order DFS traversal.
7
+ * Handles linear, fork, decider, selector, loop, and subflow node shapes.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
21
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.NullControlFlowNarrativeGenerator = exports.ControlFlowNarrativeGenerator = exports.CombinedNarrativeBuilder = exports.isStageNodeReturn = exports.FlowchartTraverser = void 0;
25
+ var FlowchartTraverser_1 = require("./traversal/FlowchartTraverser");
26
+ Object.defineProperty(exports, "FlowchartTraverser", { enumerable: true, get: function () { return FlowchartTraverser_1.FlowchartTraverser; } });
27
+ // Graph node types (Decider, Selector, StageNode re-exported via ./types)
28
+ var StageNode_1 = require("./graph/StageNode");
29
+ Object.defineProperty(exports, "isStageNodeReturn", { enumerable: true, get: function () { return StageNode_1.isStageNodeReturn; } });
30
+ // Types
31
+ __exportStar(require("./types"), exports);
32
+ // Handlers (for advanced use cases and testing)
33
+ __exportStar(require("./handlers"), exports);
34
+ var CombinedNarrativeBuilder_1 = require("./narrative/CombinedNarrativeBuilder");
35
+ Object.defineProperty(exports, "CombinedNarrativeBuilder", { enumerable: true, get: function () { return CombinedNarrativeBuilder_1.CombinedNarrativeBuilder; } });
36
+ var ControlFlowNarrativeGenerator_1 = require("./narrative/ControlFlowNarrativeGenerator");
37
+ Object.defineProperty(exports, "ControlFlowNarrativeGenerator", { enumerable: true, get: function () { return ControlFlowNarrativeGenerator_1.ControlFlowNarrativeGenerator; } });
38
+ var NullControlFlowNarrativeGenerator_1 = require("./narrative/NullControlFlowNarrativeGenerator");
39
+ Object.defineProperty(exports, "NullControlFlowNarrativeGenerator", { enumerable: true, get: function () { return NullControlFlowNarrativeGenerator_1.NullControlFlowNarrativeGenerator; } });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQTBCO0FBQzFCOzs7OztHQUtHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUlILHFFQUFvRTtBQUEzRCx3SEFBQSxrQkFBa0IsT0FBQTtBQUUzQiwwRUFBMEU7QUFDMUUsK0NBQXNEO0FBQTdDLDhHQUFBLGlCQUFpQixPQUFBO0FBRTFCLFFBQVE7QUFDUiwwQ0FBd0I7QUFFeEIsZ0RBQWdEO0FBQ2hELDZDQUEyQjtBQUkzQixpRkFBZ0Y7QUFBdkUsb0lBQUEsd0JBQXdCLE9BQUE7QUFDakMsMkZBQTBGO0FBQWpGLDhJQUFBLDZCQUE2QixPQUFBO0FBQ3RDLG1HQUFrRztBQUF6RixzSkFBQSxpQ0FBaUMsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG4vKipcbiAqIGVuZ2luZS8g4oCUIEdyYXBoIHRyYXZlcnNhbCBlbmdpbmUgbGlicmFyeS5cbiAqXG4gKiBFeGVjdXRlcyBmbG93Y2hhcnRzIGJ1aWx0IGJ5IEZsb3dDaGFydEJ1aWxkZXIgdmlhIHByZS1vcmRlciBERlMgdHJhdmVyc2FsLlxuICogSGFuZGxlcyBsaW5lYXIsIGZvcmssIGRlY2lkZXIsIHNlbGVjdG9yLCBsb29wLCBhbmQgc3ViZmxvdyBub2RlIHNoYXBlcy5cbiAqL1xuXG4vLyBDb3JlIHRyYXZlcnNlclxuZXhwb3J0IHR5cGUgeyBUcmF2ZXJzZXJPcHRpb25zIH0gZnJvbSAnLi90cmF2ZXJzYWwvRmxvd2NoYXJ0VHJhdmVyc2VyJztcbmV4cG9ydCB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4vdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlcic7XG5cbi8vIEdyYXBoIG5vZGUgdHlwZXMgKERlY2lkZXIsIFNlbGVjdG9yLCBTdGFnZU5vZGUgcmUtZXhwb3J0ZWQgdmlhIC4vdHlwZXMpXG5leHBvcnQgeyBpc1N0YWdlTm9kZVJldHVybiB9IGZyb20gJy4vZ3JhcGgvU3RhZ2VOb2RlJztcblxuLy8gVHlwZXNcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuXG4vLyBIYW5kbGVycyAoZm9yIGFkdmFuY2VkIHVzZSBjYXNlcyBhbmQgdGVzdGluZylcbmV4cG9ydCAqIGZyb20gJy4vaGFuZGxlcnMnO1xuXG4vLyBOYXJyYXRpdmUgZ2VuZXJhdGlvblxuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5LCBDb21iaW5lZE5hcnJhdGl2ZU9wdGlvbnMgfSBmcm9tICcuL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXInO1xuZXhwb3J0IHsgQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyIH0gZnJvbSAnLi9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyJztcbmV4cG9ydCB7IENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yIH0gZnJvbSAnLi9uYXJyYXRpdmUvQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3InO1xuZXhwb3J0IHsgTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yIH0gZnJvbSAnLi9uYXJyYXRpdmUvTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yJztcbmV4cG9ydCB0eXBlIHsgSUNvbnRyb2xGbG93TmFycmF0aXZlIH0gZnJvbSAnLi9uYXJyYXRpdmUvdHlwZXMnO1xuIl19