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,117 @@
1
+ /**
2
+ * ExtractorRunner — Per-stage snapshot extraction.
3
+ *
4
+ * Coordinates traversal extractor invocations: step counting,
5
+ * snapshot enrichment, error collection, and result storage.
6
+ */
7
+ import { computeNodeType } from './RuntimeStructureManager';
8
+ export class ExtractorRunner {
9
+ constructor(extractor, enrichSnapshots, executionRuntime, logger) {
10
+ this.extractedResults = new Map();
11
+ this.extractorErrors = [];
12
+ this.stepCounter = 0;
13
+ this.extractor = extractor;
14
+ this.enrichSnapshots = enrichSnapshots;
15
+ this.executionRuntime = executionRuntime;
16
+ this.logger = logger;
17
+ }
18
+ /**
19
+ * Call the extractor for a stage and store the result.
20
+ * Increments stepCounter (1-based) before creating snapshot.
21
+ */
22
+ callExtractor(node, context, stagePath, stageOutput, errorInfo) {
23
+ var _a;
24
+ if (!this.extractor)
25
+ return;
26
+ this.stepCounter++;
27
+ try {
28
+ const snapshot = {
29
+ node,
30
+ context,
31
+ stepNumber: this.stepCounter,
32
+ structureMetadata: this.buildStructureMetadata(node),
33
+ };
34
+ if (this.enrichSnapshots) {
35
+ try {
36
+ snapshot.scopeState = { ...this.executionRuntime.globalStore.getState() };
37
+ snapshot.debugInfo = {
38
+ logs: { ...context.debug.logContext },
39
+ errors: { ...context.debug.errorContext },
40
+ metrics: { ...context.debug.metricContext },
41
+ evals: { ...context.debug.evalContext },
42
+ };
43
+ if (context.debug.flowMessages.length > 0) {
44
+ snapshot.debugInfo.flowMessages = [...context.debug.flowMessages];
45
+ }
46
+ snapshot.stageOutput = stageOutput;
47
+ if (errorInfo) {
48
+ snapshot.errorInfo = errorInfo;
49
+ }
50
+ snapshot.historyIndex = this.executionRuntime.executionHistory.list().length;
51
+ }
52
+ catch (enrichError) {
53
+ this.logger.warn(`Enrichment error at stage '${stagePath}':`, { error: enrichError });
54
+ }
55
+ }
56
+ const result = this.extractor(snapshot);
57
+ if (result !== undefined && result !== null) {
58
+ this.extractedResults.set(stagePath, result);
59
+ }
60
+ }
61
+ catch (error) {
62
+ this.logger.error(`Extractor error at stage '${stagePath}':`, { error });
63
+ this.extractorErrors.push({
64
+ stagePath,
65
+ message: (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : String(error),
66
+ error,
67
+ });
68
+ }
69
+ }
70
+ /**
71
+ * Generate the stage path for extractor results.
72
+ * Uses node.id (preferred) or node.name, combined with branchPath.
73
+ */
74
+ getStagePath(node, branchPath, contextStageName) {
75
+ var _a;
76
+ const baseName = (_a = node.id) !== null && _a !== void 0 ? _a : node.name;
77
+ const nodeId = contextStageName && contextStageName !== node.name ? contextStageName : baseName;
78
+ if (!branchPath)
79
+ return nodeId;
80
+ return `${branchPath}.${nodeId}`;
81
+ }
82
+ buildStructureMetadata(node) {
83
+ var _a;
84
+ const metadata = {
85
+ type: computeNodeType(node),
86
+ };
87
+ if (node.isSubflowRoot) {
88
+ metadata.isSubflowRoot = true;
89
+ metadata.subflowId = node.subflowId;
90
+ metadata.subflowName = node.subflowName;
91
+ }
92
+ else if (this.currentSubflowId) {
93
+ metadata.subflowId = this.currentSubflowId;
94
+ }
95
+ if (this.currentForkId) {
96
+ metadata.isParallelChild = true;
97
+ metadata.parallelGroupId = this.currentForkId;
98
+ }
99
+ if (node.isStreaming) {
100
+ metadata.streamId = node.streamId;
101
+ }
102
+ const hasDynamicChildren = Boolean(((_a = node.children) === null || _a === void 0 ? void 0 : _a.length) && !node.nextNodeSelector && node.fn);
103
+ if (hasDynamicChildren) {
104
+ metadata.isDynamic = true;
105
+ }
106
+ return metadata;
107
+ }
108
+ /** Returns extracted results collected during execution. */
109
+ getExtractedResults() {
110
+ return this.extractedResults;
111
+ }
112
+ /** Returns errors encountered during extraction. */
113
+ getExtractorErrors() {
114
+ return this.extractorErrors;
115
+ }
116
+ }
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXh0cmFjdG9yUnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvRXh0cmFjdG9yUnVubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBWUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVELE1BQU0sT0FBTyxlQUFlO0lBZ0IxQixZQUNFLFNBQXlDLEVBQ3pDLGVBQXdCLEVBQ3hCLGdCQUFtQyxFQUNuQyxNQUFlO1FBZFQscUJBQWdCLEdBQXlCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbkQsb0JBQWUsR0FBcUIsRUFBRSxDQUFDO1FBQ3ZDLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBY3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYSxDQUNYLElBQWUsRUFDZixPQUFxQixFQUNyQixTQUFpQixFQUNqQixXQUFxQixFQUNyQixTQUE2Qzs7UUFFN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUU1QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQWtCO2dCQUM5QixJQUFJO2dCQUNKLE9BQU87Z0JBQ1AsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM1QixpQkFBaUIsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDO2FBQ3JELENBQUM7WUFFRixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNILFFB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LENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUM5QixRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixRQUFRLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUNoQyxRQUFRLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxDQUFDO1FBRUQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsQ0FBQSxNQUFBLElBQUksQ0FBQyxRQUFRLDBDQUFFLE1BQU0sS0FBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0YsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZCLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsNERBQTREO0lBQzVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBd0MsQ0FBQztJQUN2RCxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeHRyYWN0b3JSdW5uZXIg4oCUIFBlci1zdGFnZSBzbmFwc2hvdCBleHRyYWN0aW9uLlxuICpcbiAqIENvb3JkaW5hdGVzIHRyYXZlcnNhbCBleHRyYWN0b3IgaW52b2NhdGlvbnM6IHN0ZXAgY291bnRpbmcsXG4gKiBzbmFwc2hvdCBlbnJpY2htZW50LCBlcnJvciBjb2xsZWN0aW9uLCBhbmQgcmVzdWx0IHN0b3JhZ2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0JztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlJztcbmltcG9ydCB0eXBlIHtcbiAgRXh0cmFjdG9yRXJyb3IsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBJTG9nZ2VyLFxuICBSdW50aW1lU3RydWN0dXJlTWV0YWRhdGEsXG4gIFN0YWdlU25hcHNob3QsXG4gIFRyYXZlcnNhbEV4dHJhY3Rvcixcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY29tcHV0ZU5vZGVUeXBlIH0gZnJvbSAnLi9SdW50aW1lU3RydWN0dXJlTWFuYWdlcic7XG5cbmV4cG9ydCBjbGFzcyBFeHRyYWN0b3JSdW5uZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXh0cmFjdG9yPzogVHJhdmVyc2FsRXh0cmFjdG9yO1xuICBwcml2YXRlIHJlYWRvbmx5IGVucmljaFNuYXBzaG90czogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IElMb2dnZXI7XG5cbiAgcHJpdmF0ZSBleHRyYWN0ZWRSZXN1bHRzOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBleHRyYWN0b3JFcnJvcnM6IEV4dHJhY3RvckVycm9yW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGVwQ291bnRlciA9IDA7XG5cbiAgLyoqIEN1cnJlbnQgc3ViZmxvdyBjb250ZXh0IGZvciBtZXRhZGF0YSBwcm9wYWdhdGlvbi4gU2V0L2NsZWFyZWQgZHVyaW5nIHN1YmZsb3cgZXhlY3V0aW9uLiAqL1xuICBjdXJyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuXG4gIC8qKiBDdXJyZW50IGZvcmsgY29udGV4dCBmb3IgbWV0YWRhdGEgcHJvcGFnYXRpb24uIFNldC9jbGVhcmVkIGR1cmluZyBwYXJhbGxlbCBjaGlsZHJlbiBleGVjdXRpb24uICovXG4gIGN1cnJlbnRGb3JrSWQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZXh0cmFjdG9yOiBUcmF2ZXJzYWxFeHRyYWN0b3IgfCB1bmRlZmluZWQsXG4gICAgZW5yaWNoU25hcHNob3RzOiBib29sZWFuLFxuICAgIGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lLFxuICAgIGxvZ2dlcjogSUxvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgdGhpcy5lbnJpY2hTbmFwc2hvdHMgPSBlbnJpY2hTbmFwc2hvdHM7XG4gICAgdGhpcy5leGVjdXRpb25SdW50aW1lID0gZXhlY3V0aW9uUnVudGltZTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoZSBleHRyYWN0b3IgZm9yIGEgc3RhZ2UgYW5kIHN0b3JlIHRoZSByZXN1bHQuXG4gICAqIEluY3JlbWVudHMgc3RlcENvdW50ZXIgKDEtYmFzZWQpIGJlZm9yZSBjcmVhdGluZyBzbmFwc2hvdC5cbiAgICovXG4gIGNhbGxFeHRyYWN0b3IoXG4gICAgbm9kZTogU3RhZ2VOb2RlLFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBzdGFnZVBhdGg6IHN0cmluZyxcbiAgICBzdGFnZU91dHB1dD86IHVua25vd24sXG4gICAgZXJyb3JJbmZvPzogeyB0eXBlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICB0aGlzLnN0ZXBDb3VudGVyKys7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc25hcHNob3Q6IFN0YWdlU25hcHNob3QgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHN0ZXBOdW1iZXI6IHRoaXMuc3RlcENvdW50ZXIsXG4gICAgICAgIHN0cnVjdHVyZU1ldGFkYXRhOiB0aGlzLmJ1aWxkU3RydWN0dXJlTWV0YWRhdGEobm9kZSksXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5lbnJpY2hTbmFwc2hvdHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzbmFwc2hvdC5zY29wZVN0YXRlID0geyAuLi50aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSB9O1xuXG4gICAgICAgICAgc25hcHNob3QuZGVidWdJbmZvID0ge1xuICAgICAgICAgICAgbG9nczogeyAuLi5jb250ZXh0LmRlYnVnLmxvZ0NvbnRleHQgfSxcbiAgICAgICAgICAgIGVycm9yczogeyAuLi5jb250ZXh0LmRlYnVnLmVycm9yQ29udGV4dCB9LFxuICAgICAgICAgICAgbWV0cmljczogeyAuLi5jb250ZXh0LmRlYnVnLm1ldHJpY0NvbnRleHQgfSxcbiAgICAgICAgICAgIGV2YWxzOiB7IC4uLmNvbnRleHQuZGVidWcuZXZhbENvbnRleHQgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChjb250ZXh0LmRlYnVnLmZsb3dNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzbmFwc2hvdC5kZWJ1Z0luZm8uZmxvd01lc3NhZ2VzID0gWy4uLmNvbnRleHQuZGVidWcuZmxvd01lc3NhZ2VzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzbmFwc2hvdC5zdGFnZU91dHB1dCA9IHN0YWdlT3V0cHV0O1xuXG4gICAgICAgICAgaWYgKGVycm9ySW5mbykge1xuICAgICAgICAgICAgc25hcHNob3QuZXJyb3JJbmZvID0gZXJyb3JJbmZvO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNuYXBzaG90Lmhpc3RvcnlJbmRleCA9IHRoaXMuZXhlY3V0aW9uUnVudGltZS5leGVjdXRpb25IaXN0b3J5Lmxpc3QoKS5sZW5ndGg7XG4gICAgICAgIH0gY2F0Y2ggKGVucmljaEVycm9yOiBhbnkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBFbnJpY2htZW50IGVycm9yIGF0IHN0YWdlICcke3N0YWdlUGF0aH0nOmAsIHsgZXJyb3I6IGVucmljaEVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZXh0cmFjdG9yKHNuYXBzaG90KTtcblxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmV4dHJhY3RlZFJlc3VsdHMuc2V0KHN0YWdlUGF0aCwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXh0cmFjdG9yIGVycm9yIGF0IHN0YWdlICcke3N0YWdlUGF0aH0nOmAsIHsgZXJyb3IgfSk7XG4gICAgICB0aGlzLmV4dHJhY3RvckVycm9ycy5wdXNoKHtcbiAgICAgICAgc3RhZ2VQYXRoLFxuICAgICAgICBtZXNzYWdlOiBlcnJvcj8ubWVzc2FnZSA/PyBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgc3RhZ2UgcGF0aCBmb3IgZXh0cmFjdG9yIHJlc3VsdHMuXG4gICAqIFVzZXMgbm9kZS5pZCAocHJlZmVycmVkKSBvciBub2RlLm5hbWUsIGNvbWJpbmVkIHdpdGggYnJhbmNoUGF0aC5cbiAgICovXG4gIGdldFN0YWdlUGF0aChub2RlOiBTdGFnZU5vZGUsIGJyYW5jaFBhdGg/OiBzdHJpbmcsIGNvbnRleHRTdGFnZU5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VOYW1lID0gbm9kZS5pZCA/PyBub2RlLm5hbWU7XG4gICAgY29uc3Qgbm9kZUlkID0gY29udGV4dFN0YWdlTmFtZSAmJiBjb250ZXh0U3RhZ2VOYW1lICE9PSBub2RlLm5hbWUgPyBjb250ZXh0U3RhZ2VOYW1lIDogYmFzZU5hbWU7XG4gICAgaWYgKCFicmFuY2hQYXRoKSByZXR1cm4gbm9kZUlkO1xuICAgIHJldHVybiBgJHticmFuY2hQYXRofS4ke25vZGVJZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFN0cnVjdHVyZU1ldGFkYXRhKG5vZGU6IFN0YWdlTm9kZSk6IFJ1bnRpbWVTdHJ1Y3R1cmVNZXRhZGF0YSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFJ1bnRpbWVTdHJ1Y3R1cmVNZXRhZGF0YSA9IHtcbiAgICAgIHR5cGU6IGNvbXB1dGVOb2RlVHlwZShub2RlKSxcbiAgICB9O1xuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCkge1xuICAgICAgbWV0YWRhdGEuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBtZXRhZGF0YS5zdWJmbG93SWQgPSBub2RlLnN1YmZsb3dJZDtcbiAgICAgIG1ldGFkYXRhLnN1YmZsb3dOYW1lID0gbm9kZS5zdWJmbG93TmFtZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFN1YmZsb3dJZCkge1xuICAgICAgbWV0YWRhdGEuc3ViZmxvd0lkID0gdGhpcy5jdXJyZW50U3ViZmxvd0lkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnRGb3JrSWQpIHtcbiAgICAgIG1ldGFkYXRhLmlzUGFyYWxsZWxDaGlsZCA9IHRydWU7XG4gICAgICBtZXRhZGF0YS5wYXJhbGxlbEdyb3VwSWQgPSB0aGlzLmN1cnJlbnRGb3JrSWQ7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHtcbiAgICAgIG1ldGFkYXRhLnN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZDtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEeW5hbWljQ2hpbGRyZW4gPSBCb29sZWFuKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCAmJiAhbm9kZS5uZXh0Tm9kZVNlbGVjdG9yICYmIG5vZGUuZm4pO1xuICAgIGlmIChoYXNEeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIG1ldGFkYXRhLmlzRHluYW1pYyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqIFJldHVybnMgZXh0cmFjdGVkIHJlc3VsdHMgY29sbGVjdGVkIGR1cmluZyBleGVjdXRpb24uICovXG4gIGdldEV4dHJhY3RlZFJlc3VsdHM8VFJlc3VsdCA9IHVua25vd24+KCk6IE1hcDxzdHJpbmcsIFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRyYWN0ZWRSZXN1bHRzIGFzIE1hcDxzdHJpbmcsIFRSZXN1bHQ+O1xuICB9XG5cbiAgLyoqIFJldHVybnMgZXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyBleHRyYWN0aW9uLiAqL1xuICBnZXRFeHRyYWN0b3JFcnJvcnMoKTogRXh0cmFjdG9yRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0cmFjdG9yRXJyb3JzO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,72 @@
1
+ /**
2
+ * NodeResolver — DFS node lookup + subflow reference resolution.
3
+ *
4
+ * Responsibilities:
5
+ * - Find nodes by ID via recursive depth-first search (for back-edge/loop support)
6
+ * - Resolve subflow reference nodes to actual subflow structures
7
+ * - Evaluate deciders to determine next node in branching scenarios
8
+ */
9
+ export class NodeResolver {
10
+ constructor(deps) {
11
+ this.deps = deps;
12
+ }
13
+ /**
14
+ * DFS search for a node by ID.
15
+ * Checks: current → children (depth-first) → next (linear continuation).
16
+ */
17
+ findNodeById(nodeId, startNode) {
18
+ const node = startNode !== null && startNode !== void 0 ? startNode : this.deps.root;
19
+ if (node.id === nodeId)
20
+ return node;
21
+ if (node.children) {
22
+ for (const child of node.children) {
23
+ const found = this.findNodeById(nodeId, child);
24
+ if (found)
25
+ return found;
26
+ }
27
+ }
28
+ if (node.next) {
29
+ const found = this.findNodeById(nodeId, node.next);
30
+ if (found)
31
+ return found;
32
+ }
33
+ return undefined;
34
+ }
35
+ /**
36
+ * Resolve a subflow reference node to its actual structure.
37
+ *
38
+ * Reference nodes are lightweight placeholders (isSubflowRoot but no fn/children).
39
+ * The actual structure lives in the subflows dictionary.
40
+ */
41
+ resolveSubflowReference(node) {
42
+ // Already has structure — not a reference
43
+ if (node.fn || (node.children && node.children.length > 0))
44
+ return node;
45
+ if (!this.deps.subflows)
46
+ return node;
47
+ // Try multiple keys in order of preference
48
+ const keysToTry = [node.subflowId, node.subflowName, node.name].filter(Boolean);
49
+ let subflowDef;
50
+ for (const key of keysToTry) {
51
+ if (this.deps.subflows[key]) {
52
+ subflowDef = this.deps.subflows[key];
53
+ break;
54
+ }
55
+ }
56
+ if (!subflowDef) {
57
+ this.deps.logger.info(`Subflow not found in dictionary for node '${node.name}' (tried keys: ${keysToTry.join(', ')})`);
58
+ return node;
59
+ }
60
+ // Merge reference metadata with actual structure
61
+ return {
62
+ ...subflowDef.root,
63
+ isSubflowRoot: node.isSubflowRoot,
64
+ subflowId: node.subflowId,
65
+ subflowName: node.subflowName,
66
+ displayName: node.displayName || subflowDef.root.displayName,
67
+ id: node.id || subflowDef.root.id,
68
+ subflowMountOptions: node.subflowMountOptions || subflowDef.root.subflowMountOptions,
69
+ };
70
+ }
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZVJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvTm9kZVJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFNSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixZQUFvQixJQUErQjtRQUEvQixTQUFJLEdBQUosSUFBSSxDQUEyQjtJQUFHLENBQUM7SUFFdkQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLE1BQWMsRUFBRSxTQUFtQztRQUM5RCxNQUFNLElBQUksR0FBRyxTQUFTLGFBQVQsU0FBUyxjQUFULFNBQVMsR0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUV6QyxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXBDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxLQUFLO29CQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkQsSUFBSSxLQUFLO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzFCLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCx1QkFBdUIsQ0FBQyxJQUE2QjtRQUNuRCwwQ0FBMEM7UUFDMUMsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV4RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFckMsMkNBQTJDO1FBQzNDLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFhLENBQUM7UUFDNUYsSUFBSSxVQUF5RCxDQUFDO1FBRTlELEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1QixVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ25CLDZDQUE2QyxJQUFJLENBQUMsSUFBSSxrQkFBa0IsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNoRyxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsaURBQWlEO1FBQ2pELE9BQU87WUFDTCxHQUFHLFVBQVUsQ0FBQyxJQUFJO1lBQ2xCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVztZQUM1RCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CO1NBQ3JGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE5vZGVSZXNvbHZlciDigJQgREZTIG5vZGUgbG9va3VwICsgc3ViZmxvdyByZWZlcmVuY2UgcmVzb2x1dGlvbi5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBGaW5kIG5vZGVzIGJ5IElEIHZpYSByZWN1cnNpdmUgZGVwdGgtZmlyc3Qgc2VhcmNoIChmb3IgYmFjay1lZGdlL2xvb3Agc3VwcG9ydClcbiAqIC0gUmVzb2x2ZSBzdWJmbG93IHJlZmVyZW5jZSBub2RlcyB0byBhY3R1YWwgc3ViZmxvdyBzdHJ1Y3R1cmVzXG4gKiAtIEV2YWx1YXRlIGRlY2lkZXJzIHRvIGRldGVybWluZSBuZXh0IG5vZGUgaW4gYnJhbmNoaW5nIHNjZW5hcmlvc1xuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZSc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgTm9kZVJlc29sdmVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4pIHt9XG5cbiAgLyoqXG4gICAqIERGUyBzZWFyY2ggZm9yIGEgbm9kZSBieSBJRC5cbiAgICogQ2hlY2tzOiBjdXJyZW50IOKGkiBjaGlsZHJlbiAoZGVwdGgtZmlyc3QpIOKGkiBuZXh0IChsaW5lYXIgY29udGludWF0aW9uKS5cbiAgICovXG4gIGZpbmROb2RlQnlJZChub2RlSWQ6IHN0cmluZywgc3RhcnROb2RlPzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgbm9kZSA9IHN0YXJ0Tm9kZSA/PyB0aGlzLmRlcHMucm9vdDtcblxuICAgIGlmIChub2RlLmlkID09PSBub2RlSWQpIHJldHVybiBub2RlO1xuXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZE5vZGVCeUlkKG5vZGVJZCwgY2hpbGQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZS5uZXh0KSB7XG4gICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZE5vZGVCeUlkKG5vZGVJZCwgbm9kZS5uZXh0KTtcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHN1YmZsb3cgcmVmZXJlbmNlIG5vZGUgdG8gaXRzIGFjdHVhbCBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIFJlZmVyZW5jZSBub2RlcyBhcmUgbGlnaHR3ZWlnaHQgcGxhY2Vob2xkZXJzIChpc1N1YmZsb3dSb290IGJ1dCBubyBmbi9jaGlsZHJlbikuXG4gICAqIFRoZSBhY3R1YWwgc3RydWN0dXJlIGxpdmVzIGluIHRoZSBzdWJmbG93cyBkaWN0aW9uYXJ5LlxuICAgKi9cbiAgcmVzb2x2ZVN1YmZsb3dSZWZlcmVuY2Uobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgLy8gQWxyZWFkeSBoYXMgc3RydWN0dXJlIOKAlCBub3QgYSByZWZlcmVuY2VcbiAgICBpZiAobm9kZS5mbiB8fCAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApKSByZXR1cm4gbm9kZTtcblxuICAgIGlmICghdGhpcy5kZXBzLnN1YmZsb3dzKSByZXR1cm4gbm9kZTtcblxuICAgIC8vIFRyeSBtdWx0aXBsZSBrZXlzIGluIG9yZGVyIG9mIHByZWZlcmVuY2VcbiAgICBjb25zdCBrZXlzVG9UcnkgPSBbbm9kZS5zdWJmbG93SWQsIG5vZGUuc3ViZmxvd05hbWUsIG5vZGUubmFtZV0uZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuICAgIGxldCBzdWJmbG93RGVmOiB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0gfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzVG9UcnkpIHtcbiAgICAgIGlmICh0aGlzLmRlcHMuc3ViZmxvd3Nba2V5XSkge1xuICAgICAgICBzdWJmbG93RGVmID0gdGhpcy5kZXBzLnN1YmZsb3dzW2tleV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghc3ViZmxvd0RlZikge1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU3ViZmxvdyBub3QgZm91bmQgaW4gZGljdGlvbmFyeSBmb3Igbm9kZSAnJHtub2RlLm5hbWV9JyAodHJpZWQga2V5czogJHtrZXlzVG9Ucnkuam9pbignLCAnKX0pYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSByZWZlcmVuY2UgbWV0YWRhdGEgd2l0aCBhY3R1YWwgc3RydWN0dXJlXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1YmZsb3dEZWYucm9vdCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IG5vZGUuaXNTdWJmbG93Um9vdCxcbiAgICAgIHN1YmZsb3dJZDogbm9kZS5zdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZTogbm9kZS5zdWJmbG93TmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBub2RlLmRpc3BsYXlOYW1lIHx8IHN1YmZsb3dEZWYucm9vdC5kaXNwbGF5TmFtZSxcbiAgICAgIGlkOiBub2RlLmlkIHx8IHN1YmZsb3dEZWYucm9vdC5pZCxcbiAgICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyB8fCBzdWJmbG93RGVmLnJvb3Quc3ViZmxvd01vdW50T3B0aW9ucyxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,154 @@
1
+ /**
2
+ * RuntimeStructureManager — Mutable structure tracking for visualization.
3
+ *
4
+ * During execution, dynamic events (new children, subflows, next chains,
5
+ * loop iterations) modify the pipeline. This manager keeps a serialized
6
+ * structure in sync so consumers get the complete picture.
7
+ *
8
+ * Deep-clones build-time structure at init, then maintains O(1) lookup map.
9
+ */
10
+ /**
11
+ * Compute the node type from node properties.
12
+ * Shared by RuntimeStructureManager (serialization) and ExtractorRunner (metadata).
13
+ */
14
+ export function computeNodeType(node) {
15
+ var _a;
16
+ if (node.nextNodeSelector || node.deciderFn || node.selectorFn)
17
+ return 'decider';
18
+ if (node.isStreaming)
19
+ return 'streaming';
20
+ const hasDynamicChildren = Boolean(((_a = node.children) === null || _a === void 0 ? void 0 : _a.length) && !node.nextNodeSelector && node.fn);
21
+ if (node.children && node.children.length > 0 && !hasDynamicChildren)
22
+ return 'fork';
23
+ return 'stage';
24
+ }
25
+ export class RuntimeStructureManager {
26
+ constructor() {
27
+ this.structureNodeMap = new Map();
28
+ }
29
+ /** Initialize from build-time structure. Deep-clones via JSON round-trip. */
30
+ init(buildTimeStructure) {
31
+ if (!buildTimeStructure)
32
+ return;
33
+ this.runtimePipelineStructure = JSON.parse(JSON.stringify(buildTimeStructure));
34
+ this.buildNodeMap(this.runtimePipelineStructure);
35
+ }
36
+ /** Returns the current runtime structure (mutated during execution). */
37
+ getStructure() {
38
+ return this.runtimePipelineStructure;
39
+ }
40
+ /** Recursively registers all nodes in the O(1) lookup map. */
41
+ buildNodeMap(node) {
42
+ var _a;
43
+ const key = (_a = node.id) !== null && _a !== void 0 ? _a : node.name;
44
+ this.structureNodeMap.set(key, node);
45
+ if (node.children) {
46
+ for (const child of node.children) {
47
+ this.buildNodeMap(child);
48
+ }
49
+ }
50
+ if (node.next) {
51
+ this.buildNodeMap(node.next);
52
+ }
53
+ if (node.subflowStructure) {
54
+ this.buildNodeMap(node.subflowStructure);
55
+ }
56
+ }
57
+ /** Convert a runtime StageNode into a SerializedPipelineStructure node. */
58
+ stageNodeToStructure(node) {
59
+ var _a, _b, _c, _d;
60
+ const structure = {
61
+ name: node.name,
62
+ id: node.id,
63
+ type: computeNodeType(node),
64
+ displayName: node.displayName,
65
+ description: node.description,
66
+ };
67
+ if (node.isStreaming) {
68
+ structure.isStreaming = true;
69
+ structure.streamId = node.streamId;
70
+ }
71
+ if (node.isSubflowRoot) {
72
+ structure.isSubflowRoot = true;
73
+ structure.subflowId = node.subflowId;
74
+ structure.subflowName = node.subflowName;
75
+ }
76
+ if (node.deciderFn) {
77
+ structure.hasDecider = true;
78
+ structure.branchIds = (_a = node.children) === null || _a === void 0 ? void 0 : _a.map((c) => { var _a; return (_a = c.id) !== null && _a !== void 0 ? _a : c.name; });
79
+ }
80
+ if (node.nextNodeSelector) {
81
+ structure.hasSelector = true;
82
+ structure.branchIds = (_b = node.children) === null || _b === void 0 ? void 0 : _b.map((c) => { var _a; return (_a = c.id) !== null && _a !== void 0 ? _a : c.name; });
83
+ }
84
+ if ((_c = node.children) === null || _c === void 0 ? void 0 : _c.length) {
85
+ structure.children = node.children.map((c) => this.stageNodeToStructure(c));
86
+ }
87
+ if (node.next) {
88
+ structure.next = this.stageNodeToStructure(node.next);
89
+ }
90
+ if ((_d = node.subflowDef) === null || _d === void 0 ? void 0 : _d.buildTimeStructure) {
91
+ structure.subflowStructure = node.subflowDef.buildTimeStructure;
92
+ }
93
+ return structure;
94
+ }
95
+ /** Update structure when dynamic children are discovered at runtime. */
96
+ updateDynamicChildren(parentNodeId, dynamicChildren, hasSelector, hasDecider) {
97
+ if (!this.runtimePipelineStructure)
98
+ return;
99
+ const parentStructure = this.structureNodeMap.get(parentNodeId);
100
+ if (!parentStructure)
101
+ return;
102
+ const childStructures = dynamicChildren.map((child) => this.stageNodeToStructure(child));
103
+ parentStructure.children = childStructures;
104
+ for (const childStructure of childStructures) {
105
+ this.buildNodeMap(childStructure);
106
+ }
107
+ if (hasSelector) {
108
+ parentStructure.hasSelector = true;
109
+ parentStructure.branchIds = childStructures.map((c) => { var _a; return (_a = c.id) !== null && _a !== void 0 ? _a : c.name; });
110
+ }
111
+ if (hasDecider) {
112
+ parentStructure.hasDecider = true;
113
+ parentStructure.branchIds = childStructures.map((c) => { var _a; return (_a = c.id) !== null && _a !== void 0 ? _a : c.name; });
114
+ }
115
+ }
116
+ /** Update structure when a dynamic subflow is registered at runtime. */
117
+ updateDynamicSubflow(mountNodeId, subflowId, subflowName, subflowBuildTimeStructure) {
118
+ if (!this.runtimePipelineStructure)
119
+ return;
120
+ const mountStructure = this.structureNodeMap.get(mountNodeId);
121
+ if (!mountStructure)
122
+ return;
123
+ mountStructure.isSubflowRoot = true;
124
+ mountStructure.subflowId = subflowId;
125
+ if (subflowName !== undefined) {
126
+ mountStructure.subflowName = subflowName;
127
+ }
128
+ if (subflowBuildTimeStructure) {
129
+ mountStructure.subflowStructure = subflowBuildTimeStructure;
130
+ this.buildNodeMap(mountStructure.subflowStructure);
131
+ }
132
+ }
133
+ /** Update structure when a dynamic next chain is discovered at runtime. */
134
+ updateDynamicNext(currentNodeId, dynamicNext) {
135
+ if (!this.runtimePipelineStructure)
136
+ return;
137
+ const currentStructure = this.structureNodeMap.get(currentNodeId);
138
+ if (!currentStructure)
139
+ return;
140
+ const nextStructure = this.stageNodeToStructure(dynamicNext);
141
+ currentStructure.next = nextStructure;
142
+ this.buildNodeMap(nextStructure);
143
+ }
144
+ /** Update the iteration count for a node (loop support). */
145
+ updateIterationCount(nodeId, count) {
146
+ if (!this.runtimePipelineStructure)
147
+ return;
148
+ const nodeStructure = this.structureNodeMap.get(nodeId);
149
+ if (!nodeStructure)
150
+ return;
151
+ nodeStructure.iterationCount = count;
152
+ }
153
+ }
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnVudGltZVN0cnVjdHVyZU1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9SdW50aW1lU3RydWN0dXJlTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUtIOzs7R0FHRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBZTs7SUFDN0MsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pGLElBQUksSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUV6QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxDQUFBLE1BQUEsSUFBSSxDQUFDLFFBQVEsMENBQUUsTUFBTSxLQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvRixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFFcEYsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELE1BQU0sT0FBTyx1QkFBdUI7SUFBcEM7UUFFVSxxQkFBZ0IsR0FBNkMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQXdKakYsQ0FBQztJQXRKQyw2RUFBNkU7SUFDN0UsSUFBSSxDQUFDLGtCQUFnRDtRQUNuRCxJQUFJLENBQUMsa0JBQWtCO1lBQUUsT0FBTztRQUNoQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx3QkFB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RyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBRTlCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3RCxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELDREQUE0RDtJQUM1RCxvQkFBb0IsQ0FBQyxNQUFjLEVBQUUsS0FBYTtRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QjtZQUFFLE9BQU87UUFDM0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU87UUFDM0IsYUFBYSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSdW50aW1lU3RydWN0dXJlTWFuYWdlciDigJQgTXV0YWJsZSBzdHJ1Y3R1cmUgdHJhY2tpbmcgZm9yIHZpc3VhbGl6YXRpb24uXG4gKlxuICogRHVyaW5nIGV4ZWN1dGlvbiwgZHluYW1pYyBldmVudHMgKG5ldyBjaGlsZHJlbiwgc3ViZmxvd3MsIG5leHQgY2hhaW5zLFxuICogbG9vcCBpdGVyYXRpb25zKSBtb2RpZnkgdGhlIHBpcGVsaW5lLiBUaGlzIG1hbmFnZXIga2VlcHMgYSBzZXJpYWxpemVkXG4gKiBzdHJ1Y3R1cmUgaW4gc3luYyBzbyBjb25zdW1lcnMgZ2V0IHRoZSBjb21wbGV0ZSBwaWN0dXJlLlxuICpcbiAqIERlZXAtY2xvbmVzIGJ1aWxkLXRpbWUgc3RydWN0dXJlIGF0IGluaXQsIHRoZW4gbWFpbnRhaW5zIE8oMSkgbG9va3VwIG1hcC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZSc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBub2RlIHR5cGUgZnJvbSBub2RlIHByb3BlcnRpZXMuXG4gKiBTaGFyZWQgYnkgUnVudGltZVN0cnVjdHVyZU1hbmFnZXIgKHNlcmlhbGl6YXRpb24pIGFuZCBFeHRyYWN0b3JSdW5uZXIgKG1ldGFkYXRhKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVOb2RlVHlwZShub2RlOiBTdGFnZU5vZGUpOiAnc3RhZ2UnIHwgJ2RlY2lkZXInIHwgJ2ZvcmsnIHwgJ3N0cmVhbWluZycge1xuICBpZiAobm9kZS5uZXh0Tm9kZVNlbGVjdG9yIHx8IG5vZGUuZGVjaWRlckZuIHx8IG5vZGUuc2VsZWN0b3JGbikgcmV0dXJuICdkZWNpZGVyJztcbiAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHJldHVybiAnc3RyZWFtaW5nJztcblxuICBjb25zdCBoYXNEeW5hbWljQ2hpbGRyZW4gPSBCb29sZWFuKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCAmJiAhbm9kZS5uZXh0Tm9kZVNlbGVjdG9yICYmIG5vZGUuZm4pO1xuICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgIWhhc0R5bmFtaWNDaGlsZHJlbikgcmV0dXJuICdmb3JrJztcblxuICByZXR1cm4gJ3N0YWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBydW50aW1lUGlwZWxpbmVTdHJ1Y3R1cmU/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIHByaXZhdGUgc3RydWN0dXJlTm9kZU1hcDogTWFwPHN0cmluZywgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlPiA9IG5ldyBNYXAoKTtcblxuICAvKiogSW5pdGlhbGl6ZSBmcm9tIGJ1aWxkLXRpbWUgc3RydWN0dXJlLiBEZWVwLWNsb25lcyB2aWEgSlNPTiByb3VuZC10cmlwLiAqL1xuICBpbml0KGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGlmICghYnVpbGRUaW1lU3RydWN0dXJlKSByZXR1cm47XG4gICAgdGhpcy5ydW50aW1lUGlwZWxpbmVTdHJ1Y3R1cmUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGJ1aWxkVGltZVN0cnVjdHVyZSkpO1xuICAgIHRoaXMuYnVpbGROb2RlTWFwKHRoaXMucnVudGltZVBpcGVsaW5lU3RydWN0dXJlISk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgY3VycmVudCBydW50aW1lIHN0cnVjdHVyZSAobXV0YXRlZCBkdXJpbmcgZXhlY3V0aW9uKS4gKi9cbiAgZ2V0U3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucnVudGltZVBpcGVsaW5lU3RydWN0dXJlO1xuICB9XG5cbiAgLyoqIFJlY3Vyc2l2ZWx5IHJlZ2lzdGVycyBhbGwgbm9kZXMgaW4gdGhlIE8oMSkgbG9va3VwIG1hcC4gKi9cbiAgcHJpdmF0ZSBidWlsZE5vZGVNYXAobm9kZTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9kZS5pZCA/PyBub2RlLm5hbWU7XG4gICAgdGhpcy5zdHJ1Y3R1cmVOb2RlTWFwLnNldChrZXksIG5vZGUpO1xuXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICB0aGlzLmJ1aWxkTm9kZU1hcChjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgIHRoaXMuYnVpbGROb2RlTWFwKG5vZGUubmV4dCk7XG4gICAgfVxuICAgIGlmIChub2RlLnN1YmZsb3dTdHJ1Y3R1cmUpIHtcbiAgICAgIHRoaXMuYnVpbGROb2RlTWFwKG5vZGUuc3ViZmxvd1N0cnVjdHVyZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENvbnZlcnQgYSBydW50aW1lIFN0YWdlTm9kZSBpbnRvIGEgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIG5vZGUuICovXG4gIHN0YWdlTm9kZVRvU3RydWN0dXJlKG5vZGU6IFN0YWdlTm9kZSk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB7XG4gICAgY29uc3Qgc3RydWN0dXJlOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBub2RlLm5hbWUsXG4gICAgICBpZDogbm9kZS5pZCxcbiAgICAgIHR5cGU6IGNvbXB1dGVOb2RlVHlwZShub2RlKSxcbiAgICAgIGRpc3BsYXlOYW1lOiBub2RlLmRpc3BsYXlOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG5vZGUuZGVzY3JpcHRpb24sXG4gICAgfTtcblxuICAgIGlmIChub2RlLmlzU3RyZWFtaW5nKSB7XG4gICAgICBzdHJ1Y3R1cmUuaXNTdHJlYW1pbmcgPSB0cnVlO1xuICAgICAgc3RydWN0dXJlLnN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5pc1N1YmZsb3dSb290KSB7XG4gICAgICBzdHJ1Y3R1cmUuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBzdHJ1Y3R1cmUuc3ViZmxvd0lkID0gbm9kZS5zdWJmbG93SWQ7XG4gICAgICBzdHJ1Y3R1cmUuc3ViZmxvd05hbWUgPSBub2RlLnN1YmZsb3dOYW1lO1xuICAgIH1cblxuICAgIGlmIChub2RlLmRlY2lkZXJGbikge1xuICAgICAgc3RydWN0dXJlLmhhc0RlY2lkZXIgPSB0cnVlO1xuICAgICAgc3RydWN0dXJlLmJyYW5jaElkcyA9IG5vZGUuY2hpbGRyZW4/Lm1hcCgoYykgPT4gYy5pZCA/PyBjLm5hbWUpO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5leHROb2RlU2VsZWN0b3IpIHtcbiAgICAgIHN0cnVjdHVyZS5oYXNTZWxlY3RvciA9IHRydWU7XG4gICAgICBzdHJ1Y3R1cmUuYnJhbmNoSWRzID0gbm9kZS5jaGlsZHJlbj8ubWFwKChjKSA9PiBjLmlkID8/IGMubmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgc3RydWN0dXJlLmNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi5tYXAoKGMpID0+IHRoaXMuc3RhZ2VOb2RlVG9TdHJ1Y3R1cmUoYykpO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgIHN0cnVjdHVyZS5uZXh0ID0gdGhpcy5zdGFnZU5vZGVUb1N0cnVjdHVyZShub2RlLm5leHQpO1xuICAgIH1cblxuICAgIGlmIChub2RlLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSkge1xuICAgICAgc3RydWN0dXJlLnN1YmZsb3dTdHJ1Y3R1cmUgPSBub2RlLnN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlIGFzIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RydWN0dXJlO1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBzdHJ1Y3R1cmUgd2hlbiBkeW5hbWljIGNoaWxkcmVuIGFyZSBkaXNjb3ZlcmVkIGF0IHJ1bnRpbWUuICovXG4gIHVwZGF0ZUR5bmFtaWNDaGlsZHJlbihcbiAgICBwYXJlbnROb2RlSWQ6IHN0cmluZyxcbiAgICBkeW5hbWljQ2hpbGRyZW46IFN0YWdlTm9kZVtdLFxuICAgIGhhc1NlbGVjdG9yPzogYm9vbGVhbixcbiAgICBoYXNEZWNpZGVyPzogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJ1bnRpbWVQaXBlbGluZVN0cnVjdHVyZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyZW50U3RydWN0dXJlID0gdGhpcy5zdHJ1Y3R1cmVOb2RlTWFwLmdldChwYXJlbnROb2RlSWQpO1xuICAgIGlmICghcGFyZW50U3RydWN0dXJlKSByZXR1cm47XG5cbiAgICBjb25zdCBjaGlsZFN0cnVjdHVyZXMgPSBkeW5hbWljQ2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gdGhpcy5zdGFnZU5vZGVUb1N0cnVjdHVyZShjaGlsZCkpO1xuICAgIHBhcmVudFN0cnVjdHVyZS5jaGlsZHJlbiA9IGNoaWxkU3RydWN0dXJlcztcblxuICAgIGZvciAoY29uc3QgY2hpbGRTdHJ1Y3R1cmUgb2YgY2hpbGRTdHJ1Y3R1cmVzKSB7XG4gICAgICB0aGlzLmJ1aWxkTm9kZU1hcChjaGlsZFN0cnVjdHVyZSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NlbGVjdG9yKSB7XG4gICAgICBwYXJlbnRTdHJ1Y3R1cmUuaGFzU2VsZWN0b3IgPSB0cnVlO1xuICAgICAgcGFyZW50U3RydWN0dXJlLmJyYW5jaElkcyA9IGNoaWxkU3RydWN0dXJlcy5tYXAoKGMpID0+IGMuaWQgPz8gYy5uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzRGVjaWRlcikge1xuICAgICAgcGFyZW50U3RydWN0dXJlLmhhc0RlY2lkZXIgPSB0cnVlO1xuICAgICAgcGFyZW50U3RydWN0dXJlLmJyYW5jaElkcyA9IGNoaWxkU3RydWN0dXJlcy5tYXAoKGMpID0+IGMuaWQgPz8gYy5uYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKiogVXBkYXRlIHN0cnVjdHVyZSB3aGVuIGEgZHluYW1pYyBzdWJmbG93IGlzIHJlZ2lzdGVyZWQgYXQgcnVudGltZS4gKi9cbiAgdXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgbW91bnROb2RlSWQ6IHN0cmluZyxcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93TmFtZT86IHN0cmluZyxcbiAgICBzdWJmbG93QnVpbGRUaW1lU3RydWN0dXJlPzogdW5rbm93bixcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJ1bnRpbWVQaXBlbGluZVN0cnVjdHVyZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW91bnRTdHJ1Y3R1cmUgPSB0aGlzLnN0cnVjdHVyZU5vZGVNYXAuZ2V0KG1vdW50Tm9kZUlkKTtcbiAgICBpZiAoIW1vdW50U3RydWN0dXJlKSByZXR1cm47XG5cbiAgICBtb3VudFN0cnVjdHVyZS5pc1N1YmZsb3dSb290ID0gdHJ1ZTtcbiAgICBtb3VudFN0cnVjdHVyZS5zdWJmbG93SWQgPSBzdWJmbG93SWQ7XG5cbiAgICBpZiAoc3ViZmxvd05hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbW91bnRTdHJ1Y3R1cmUuc3ViZmxvd05hbWUgPSBzdWJmbG93TmFtZTtcbiAgICB9XG5cbiAgICBpZiAoc3ViZmxvd0J1aWxkVGltZVN0cnVjdHVyZSkge1xuICAgICAgbW91bnRTdHJ1Y3R1cmUuc3ViZmxvd1N0cnVjdHVyZSA9IHN1YmZsb3dCdWlsZFRpbWVTdHJ1Y3R1cmUgYXMgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICAgICAgdGhpcy5idWlsZE5vZGVNYXAobW91bnRTdHJ1Y3R1cmUuc3ViZmxvd1N0cnVjdHVyZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFVwZGF0ZSBzdHJ1Y3R1cmUgd2hlbiBhIGR5bmFtaWMgbmV4dCBjaGFpbiBpcyBkaXNjb3ZlcmVkIGF0IHJ1bnRpbWUuICovXG4gIHVwZGF0ZUR5bmFtaWNOZXh0KGN1cnJlbnROb2RlSWQ6IHN0cmluZywgZHluYW1pY05leHQ6IFN0YWdlTm9kZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ydW50aW1lUGlwZWxpbmVTdHJ1Y3R1cmUpIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRTdHJ1Y3R1cmUgPSB0aGlzLnN0cnVjdHVyZU5vZGVNYXAuZ2V0KGN1cnJlbnROb2RlSWQpO1xuICAgIGlmICghY3VycmVudFN0cnVjdHVyZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV4dFN0cnVjdHVyZSA9IHRoaXMuc3RhZ2VOb2RlVG9TdHJ1Y3R1cmUoZHluYW1pY05leHQpO1xuICAgIGN1cnJlbnRTdHJ1Y3R1cmUubmV4dCA9IG5leHRTdHJ1Y3R1cmU7XG4gICAgdGhpcy5idWlsZE5vZGVNYXAobmV4dFN0cnVjdHVyZSk7XG4gIH1cblxuICAvKiogVXBkYXRlIHRoZSBpdGVyYXRpb24gY291bnQgZm9yIGEgbm9kZSAobG9vcCBzdXBwb3J0KS4gKi9cbiAgdXBkYXRlSXRlcmF0aW9uQ291bnQobm9kZUlkOiBzdHJpbmcsIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucnVudGltZVBpcGVsaW5lU3RydWN0dXJlKSByZXR1cm47XG4gICAgY29uc3Qgbm9kZVN0cnVjdHVyZSA9IHRoaXMuc3RydWN0dXJlTm9kZU1hcC5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGVTdHJ1Y3R1cmUpIHJldHVybjtcbiAgICBub2RlU3RydWN0dXJlLml0ZXJhdGlvbkNvdW50ID0gY291bnQ7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,79 @@
1
+ /**
2
+ * SelectorHandler — Multi-choice filtered fan-out.
3
+ *
4
+ * Responsibilities:
5
+ * - Execute scope-based selector nodes (stage → commit → resolve children → parallel execution)
6
+ * - The selector function IS a stage: reads scope, returns string[] of branch IDs
7
+ * - Delegates parallel execution of selected children to ChildrenExecutor
8
+ */
9
+ export class SelectorHandler {
10
+ constructor(deps, childrenExecutor) {
11
+ this.deps = deps;
12
+ this.childrenExecutor = childrenExecutor;
13
+ }
14
+ /**
15
+ * Handle a scope-based selector node (created via addSelectorFunction).
16
+ * The stage function IS the selector — its return value contains branch IDs.
17
+ * Execution order: runStage(fn) → commit → resolve children → parallel execute.
18
+ */
19
+ async handleScopeBased(node, stageFunc, context, breakFlag, branchPath, runStage, executeNode, callExtractor, getStagePath) {
20
+ var _a;
21
+ const breakFn = () => (breakFlag.shouldBreak = true);
22
+ let selectedIds;
23
+ try {
24
+ const stageOutput = await runStage(node, stageFunc, context, breakFn);
25
+ selectedIds = Array.isArray(stageOutput) ? stageOutput.map(String) : [String(stageOutput)];
26
+ }
27
+ catch (error) {
28
+ context.commit();
29
+ callExtractor(node, context, getStagePath(node, branchPath, context.stageName), undefined, {
30
+ type: 'stageExecutionError',
31
+ message: error.toString(),
32
+ });
33
+ this.deps.logger.error(`Error in pipeline (${branchPath}) stage [${node.name}]:`, { error });
34
+ context.addError('stageExecutionError', error.toString());
35
+ this.deps.narrativeGenerator.onError(node.name, error.toString(), node.displayName);
36
+ throw error;
37
+ }
38
+ context.commit();
39
+ callExtractor(node, context, getStagePath(node, branchPath, context.stageName), selectedIds);
40
+ if (breakFlag.shouldBreak) {
41
+ this.deps.logger.info(`Execution stopped in pipeline (${branchPath}) after ${node.name} due to break condition.`);
42
+ return {};
43
+ }
44
+ context.addLog('selectedChildIds', selectedIds);
45
+ context.addLog('selectorPattern', 'scope-based-multi-choice');
46
+ if (selectedIds.length === 0) {
47
+ context.addLog('skippedAllChildren', true);
48
+ context.addFlowDebugMessage('selected', 'No children selected — skipping all branches.', {
49
+ count: 0,
50
+ targetStage: [],
51
+ });
52
+ this.deps.narrativeGenerator.onSelected(node.displayName || node.name, [], ((_a = node.children) !== null && _a !== void 0 ? _a : []).length);
53
+ return {};
54
+ }
55
+ // Resolve children by matching selected IDs against node.children
56
+ const children = node.children;
57
+ const selectedChildren = children.filter((c) => selectedIds.includes(c.id));
58
+ // Validate all IDs exist (fail fast)
59
+ if (selectedChildren.length !== selectedIds.length) {
60
+ const childIds = children.map((c) => c.id);
61
+ const missing = selectedIds.filter((id) => !childIds.includes(id));
62
+ const errorMessage = `Scope-based selector '${node.name}' returned unknown child IDs: ${missing.join(', ')}. Available: ${childIds.join(', ')}`;
63
+ this.deps.logger.error(`Error in pipeline (${branchPath}):`, { error: errorMessage });
64
+ context.addError('selectorError', errorMessage);
65
+ throw new Error(errorMessage);
66
+ }
67
+ const skippedIds = children.filter((c) => !selectedIds.includes(c.id)).map((c) => c.id);
68
+ if (skippedIds.length > 0) {
69
+ context.addLog('skippedChildIds', skippedIds);
70
+ }
71
+ const selectedNames = selectedChildren.map((c) => c.displayName || c.name).join(', ');
72
+ context.addFlowDebugMessage('selected', `Running ${selectedNames} (${selectedChildren.length} of ${children.length} matched)`, { count: selectedChildren.length, targetStage: selectedChildren.map((c) => c.name) });
73
+ const selectedDisplayNames = selectedChildren.map((c) => c.displayName || c.name);
74
+ this.deps.narrativeGenerator.onSelected(node.displayName || node.name, selectedDisplayNames, children.length);
75
+ const tempNode = { name: 'selector-temp', children: selectedChildren };
76
+ return await this.childrenExecutor.executeNodeChildren(tempNode, context, undefined, branchPath);
77
+ }
78
+ }
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0b3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFRSCxNQUFNLE9BQU8sZUFBZTtJQUMxQixZQUNtQixJQUErQixFQUMvQixnQkFBZ0Q7UUFEaEQsU0FBSSxHQUFKLElBQUksQ0FBMkI7UUFDL0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQztJQUNoRSxDQUFDO0lBRUo7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsSUFBNkIsRUFDN0IsU0FBc0MsRUFDdEMsT0FBcUIsRUFDckIsU0FBbUMsRUFDbkMsVUFBOEIsRUFDOUIsUUFBa0MsRUFDbEMsV0FBd0MsRUFDeEMsYUFBNEMsRUFDNUMsWUFBMEM7O1FBRTFDLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUVyRCxJQUFJLFdBQXFCLENBQUM7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEUsV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDN0YsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFF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QUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5RyxNQUFNLFFBQVEsR0FBNEIsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hHLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbkcsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWxlY3RvckhhbmRsZXIg4oCUIE11bHRpLWNob2ljZSBmaWx0ZXJlZCBmYW4tb3V0LlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIEV4ZWN1dGUgc2NvcGUtYmFzZWQgc2VsZWN0b3Igbm9kZXMgKHN0YWdlIOKGkiBjb21taXQg4oaSIHJlc29sdmUgY2hpbGRyZW4g4oaSIHBhcmFsbGVsIGV4ZWN1dGlvbilcbiAqIC0gVGhlIHNlbGVjdG9yIGZ1bmN0aW9uIElTIGEgc3RhZ2U6IHJlYWRzIHNjb3BlLCByZXR1cm5zIHN0cmluZ1tdIG9mIGJyYW5jaCBJRHNcbiAqIC0gRGVsZWdhdGVzIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBzZWxlY3RlZCBjaGlsZHJlbiB0byBDaGlsZHJlbkV4ZWN1dG9yXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0JztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlckRlcHMsIE5vZGVSZXN1bHRUeXBlLCBTdGFnZUZ1bmN0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi9DaGlsZHJlbkV4ZWN1dG9yJztcbmltcG9ydCB0eXBlIHsgQ2FsbEV4dHJhY3RvckZuLCBFeGVjdXRlTm9kZUZuLCBHZXRTdGFnZVBhdGhGbiwgUnVuU3RhZ2VGbiB9IGZyb20gJy4vRGVjaWRlckhhbmRsZXInO1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0b3JIYW5kbGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT4sXG4gICkge31cblxuICAvKipcbiAgICogSGFuZGxlIGEgc2NvcGUtYmFzZWQgc2VsZWN0b3Igbm9kZSAoY3JlYXRlZCB2aWEgYWRkU2VsZWN0b3JGdW5jdGlvbikuXG4gICAqIFRoZSBzdGFnZSBmdW5jdGlvbiBJUyB0aGUgc2VsZWN0b3Ig4oCUIGl0cyByZXR1cm4gdmFsdWUgY29udGFpbnMgYnJhbmNoIElEcy5cbiAgICogRXhlY3V0aW9uIG9yZGVyOiBydW5TdGFnZShmbikg4oaSIGNvbW1pdCDihpIgcmVzb2x2ZSBjaGlsZHJlbiDihpIgcGFyYWxsZWwgZXhlY3V0ZS5cbiAgICovXG4gIGFzeW5jIGhhbmRsZVNjb3BlQmFzZWQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBydW5TdGFnZTogUnVuU3RhZ2VGbjxUT3V0LCBUU2NvcGU+LFxuICAgIGV4ZWN1dGVOb2RlOiBFeGVjdXRlTm9kZUZuPFRPdXQsIFRTY29wZT4sXG4gICAgY2FsbEV4dHJhY3RvcjogQ2FsbEV4dHJhY3RvckZuPFRPdXQsIFRTY29wZT4sXG4gICAgZ2V0U3RhZ2VQYXRoOiBHZXRTdGFnZVBhdGhGbjxUT3V0LCBUU2NvcGU+LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPj4ge1xuICAgIGNvbnN0IGJyZWFrRm4gPSAoKSA9PiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZSk7XG5cbiAgICBsZXQgc2VsZWN0ZWRJZHM6IHN0cmluZ1tdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFnZU91dHB1dCA9IGF3YWl0IHJ1blN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gICAgICBzZWxlY3RlZElkcyA9IEFycmF5LmlzQXJyYXkoc3RhZ2VPdXRwdXQpID8gc3RhZ2VPdXRwdXQubWFwKFN0cmluZykgOiBbU3RyaW5nKHN0YWdlT3V0cHV0KV07XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgIGNhbGxFeHRyYWN0b3Iobm9kZSwgY29udGV4dCwgZ2V0U3RhZ2VQYXRoKG5vZGUsIGJyYW5jaFBhdGgsIGNvbnRleHQuc3RhZ2VOYW1lKSwgdW5kZWZpbmVkLCB7XG4gICAgICAgIHR5cGU6ICdzdGFnZUV4ZWN1dGlvbkVycm9yJyxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3IgfSk7XG4gICAgICBjb250ZXh0LmFkZEVycm9yKCdzdGFnZUV4ZWN1dGlvbkVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBlcnJvci50b1N0cmluZygpLCBub2RlLmRpc3BsYXlOYW1lKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgY2FsbEV4dHJhY3Rvcihub2RlLCBjb250ZXh0LCBnZXRTdGFnZVBhdGgobm9kZSwgYnJhbmNoUGF0aCwgY29udGV4dC5zdGFnZU5hbWUpLCBzZWxlY3RlZElkcyk7XG5cbiAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmluZm8oYEV4ZWN1dGlvbiBzdG9wcGVkIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBhZnRlciAke25vZGUubmFtZX0gZHVlIHRvIGJyZWFrIGNvbmRpdGlvbi5gKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmFkZExvZygnc2VsZWN0ZWRDaGlsZElkcycsIHNlbGVjdGVkSWRzKTtcbiAgICBjb250ZXh0LmFkZExvZygnc2VsZWN0b3JQYXR0ZXJuJywgJ3Njb3BlLWJhc2VkLW11bHRpLWNob2ljZScpO1xuXG4gICAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGV4dC5hZGRMb2coJ3NraXBwZWRBbGxDaGlsZHJlbicsIHRydWUpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzZWxlY3RlZCcsICdObyBjaGlsZHJlbiBzZWxlY3RlZCDigJQgc2tpcHBpbmcgYWxsIGJyYW5jaGVzLicsIHtcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHRhcmdldFN0YWdlOiBbXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblNlbGVjdGVkKG5vZGUuZGlzcGxheU5hbWUgfHwgbm9kZS5uYW1lLCBbXSwgKG5vZGUuY2hpbGRyZW4gPz8gW10pLmxlbmd0aCk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBjaGlsZHJlbiBieSBtYXRjaGluZyBzZWxlY3RlZCBJRHMgYWdhaW5zdCBub2RlLmNoaWxkcmVuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuIGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gICAgY29uc3Qgc2VsZWN0ZWRDaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcigoYykgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5pZCEpKTtcblxuICAgIC8vIFZhbGlkYXRlIGFsbCBJRHMgZXhpc3QgKGZhaWwgZmFzdClcbiAgICBpZiAoc2VsZWN0ZWRDaGlsZHJlbi5sZW5ndGggIT09IHNlbGVjdGVkSWRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2hpbGRJZHMgPSBjaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQpO1xuICAgICAgY29uc3QgbWlzc2luZyA9IHNlbGVjdGVkSWRzLmZpbHRlcigoaWQpID0+ICFjaGlsZElkcy5pbmNsdWRlcyhpZCkpO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFNjb3BlLWJhc2VkIHNlbGVjdG9yICcke25vZGUubmFtZX0nIHJldHVybmVkIHVua25vd24gY2hpbGQgSURzOiAke21pc3Npbmcuam9pbihcbiAgICAgICAgJywgJyxcbiAgICAgICl9LiBBdmFpbGFibGU6ICR7Y2hpbGRJZHMuam9pbignLCAnKX1gO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIGNvbnRleHQuYWRkRXJyb3IoJ3NlbGVjdG9yRXJyb3InLCBlcnJvck1lc3NhZ2UpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcHBlZElkcyA9IGNoaWxkcmVuLmZpbHRlcigoYykgPT4gIXNlbGVjdGVkSWRzLmluY2x1ZGVzKGMuaWQhKSkubWFwKChjKSA9PiBjLmlkKTtcbiAgICBpZiAoc2tpcHBlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZXh0LmFkZExvZygnc2tpcHBlZENoaWxkSWRzJywgc2tpcHBlZElkcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWROYW1lcyA9IHNlbGVjdGVkQ2hpbGRyZW4ubWFwKChjKSA9PiBjLmRpc3BsYXlOYW1lIHx8IGMubmFtZSkuam9pbignLCAnKTtcbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgICAnc2VsZWN0ZWQnLFxuICAgICAgYFJ1bm5pbmcgJHtzZWxlY3RlZE5hbWVzfSAoJHtzZWxlY3RlZENoaWxkcmVuLmxlbmd0aH0gb2YgJHtjaGlsZHJlbi5sZW5ndGh9IG1hdGNoZWQpYCxcbiAgICAgIHsgY291bnQ6IHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoLCB0YXJnZXRTdGFnZTogc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWREaXNwbGF5TmFtZXMgPSBzZWxlY3RlZENoaWxkcmVuLm1hcCgoYykgPT4gYy5kaXNwbGF5TmFtZSB8fCBjLm5hbWUpO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TZWxlY3RlZChub2RlLmRpc3BsYXlOYW1lIHx8IG5vZGUubmFtZSwgc2VsZWN0ZWREaXNwbGF5TmFtZXMsIGNoaWxkcmVuLmxlbmd0aCk7XG5cbiAgICBjb25zdCB0ZW1wTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6ICdzZWxlY3Rvci10ZW1wJywgY2hpbGRyZW46IHNlbGVjdGVkQ2hpbGRyZW4gfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4odGVtcE5vZGUsIGNvbnRleHQsIHVuZGVmaW5lZCwgYnJhbmNoUGF0aCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,86 @@
1
+ /**
2
+ * StageRunner — Executes individual stage functions.
3
+ *
4
+ * Responsibilities:
5
+ * - Create scope via ScopeFactory for each stage
6
+ * - Apply scope protection (createProtectedScope) to intercept direct assignments
7
+ * - Handle streaming stages (onStart, onToken, onEnd lifecycle)
8
+ * - Sync+async safety: only await real Promises (instanceof check)
9
+ */
10
+ import { createProtectedScope } from '../../scope/protection/createProtectedScope';
11
+ export class StageRunner {
12
+ constructor(deps) {
13
+ this.deps = deps;
14
+ }
15
+ async run(node, stageFunc, context, breakFn) {
16
+ var _a, _b, _c, _d, _e, _f;
17
+ // Create scope via ScopeFactory — each stage gets its own scope instance
18
+ const rawScope = this.deps.ScopeFactory(context, node.name, this.deps.readOnlyContext);
19
+ // Wrap scope with protection to intercept direct property assignments
20
+ const scope = createProtectedScope(rawScope, {
21
+ mode: this.deps.scopeProtectionMode,
22
+ stageName: node.name,
23
+ });
24
+ // Set up streaming callback if this is a streaming stage
25
+ let streamCallback;
26
+ let accumulatedText = '';
27
+ if (node.isStreaming) {
28
+ const streamId = (_a = node.streamId) !== null && _a !== void 0 ? _a : node.name;
29
+ streamCallback = (token) => {
30
+ var _a, _b;
31
+ accumulatedText += token;
32
+ (_b = (_a = this.deps.streamHandlers) === null || _a === void 0 ? void 0 : _a.onToken) === null || _b === void 0 ? void 0 : _b.call(_a, streamId, token);
33
+ };
34
+ (_c = (_b = this.deps.streamHandlers) === null || _b === void 0 ? void 0 : _b.onStart) === null || _c === void 0 ? void 0 : _c.call(_b, streamId);
35
+ }
36
+ // Notify recorders of stage start (if scope supports it)
37
+ if (rawScope && typeof rawScope.notifyStageStart === 'function') {
38
+ rawScope.notifyStageStart();
39
+ }
40
+ // Execute the stage function
41
+ const output = stageFunc(scope, breakFn, streamCallback);
42
+ // Sync+async safety: only await real Promises to avoid thenable assimilation
43
+ let result;
44
+ if (output instanceof Promise) {
45
+ // Race against AbortSignal if provided
46
+ if (this.deps.signal) {
47
+ result = await raceAbort(output, this.deps.signal);
48
+ }
49
+ else {
50
+ result = await output;
51
+ }
52
+ }
53
+ else {
54
+ result = output;
55
+ }
56
+ // Notify recorders of stage end (if scope supports it)
57
+ if (rawScope && typeof rawScope.notifyStageEnd === 'function') {
58
+ rawScope.notifyStageEnd();
59
+ }
60
+ // Call onEnd lifecycle hook for streaming stages
61
+ if (node.isStreaming) {
62
+ const streamId = (_d = node.streamId) !== null && _d !== void 0 ? _d : node.name;
63
+ (_f = (_e = this.deps.streamHandlers) === null || _e === void 0 ? void 0 : _e.onEnd) === null || _f === void 0 ? void 0 : _f.call(_e, streamId, accumulatedText);
64
+ }
65
+ return result;
66
+ }
67
+ }
68
+ /** Race a promise against an AbortSignal. Rejects with the signal's reason on abort. */
69
+ function raceAbort(promise, signal) {
70
+ var _a;
71
+ if (signal.aborted) {
72
+ return Promise.reject(signal.reason instanceof Error ? signal.reason : new Error((_a = signal.reason) !== null && _a !== void 0 ? _a : 'Aborted'));
73
+ }
74
+ return new Promise((resolve, reject) => {
75
+ const onAbort = () => { var _a; return reject(signal.reason instanceof Error ? signal.reason : new Error((_a = signal.reason) !== null && _a !== void 0 ? _a : 'Aborted')); };
76
+ signal.addEventListener('abort', onAbort, { once: true });
77
+ promise.then((val) => {
78
+ signal.removeEventListener('abort', onAbort);
79
+ resolve(val);
80
+ }, (err) => {
81
+ signal.removeEventListener('abort', onAbort);
82
+ reject(err);
83
+ });
84
+ });
85
+ }
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VSdW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9TdGFnZVJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBSW5GLE1BQU0sT0FBTyxXQUFXO0lBQ3RCLFlBQTZCLElBQStCO1FBQS9CLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQUcsQ0FBQztJQUVoRSxLQUFLLENBQUMsR0FBRyxDQUNQLElBQTZCLEVBQzdCLFNBQXNDLEVBQ3RDLE9BQXFCLEVBQ3JCLE9BQW1COztRQUVuQix5RUFBeUU7UUFDekUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV2RixzRUFBc0U7UUFDdEUsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsUUFBa0IsRUFBRTtZQUNyRCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUI7WUFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ3JCLENBQVcsQ0FBQztRQUViLHlEQUF5RDtRQUN6RCxJQUFJLGNBQTBDLENBQUM7UUFDL0MsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBRXpCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sUUFBUSxHQUFHLE1BQUEsSUFBSSxDQUFDLFFBQVEsbUNBQUksSUFBSSxDQUFDLElBQUksQ0FBQztZQUM1QyxjQUFjLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTs7Z0JBQ2pDLGVBQWUsSUFBSSxLQUFLLENBQUM7Z0JBQ3pCLE1BQUEsTUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMs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QUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhZ2VSdW5uZXIg4oCUIEV4ZWN1dGVzIGluZGl2aWR1YWwgc3RhZ2UgZnVuY3Rpb25zLlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIENyZWF0ZSBzY29wZSB2aWEgU2NvcGVGYWN0b3J5IGZvciBlYWNoIHN0YWdlXG4gKiAtIEFwcGx5IHNjb3BlIHByb3RlY3Rpb24gKGNyZWF0ZVByb3RlY3RlZFNjb3BlKSB0byBpbnRlcmNlcHQgZGlyZWN0IGFzc2lnbm1lbnRzXG4gKiAtIEhhbmRsZSBzdHJlYW1pbmcgc3RhZ2VzIChvblN0YXJ0LCBvblRva2VuLCBvbkVuZCBsaWZlY3ljbGUpXG4gKiAtIFN5bmMrYXN5bmMgc2FmZXR5OiBvbmx5IGF3YWl0IHJlYWwgUHJvbWlzZXMgKGluc3RhbmNlb2YgY2hlY2spXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0JztcbmltcG9ydCB7IGNyZWF0ZVByb3RlY3RlZFNjb3BlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi9jcmVhdGVQcm90ZWN0ZWRTY29wZSc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZSc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzLCBTdGFnZUZ1bmN0aW9uLCBTdHJlYW1DYWxsYmFjayB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFN0YWdlUnVubmVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4pIHt9XG5cbiAgYXN5bmMgcnVuKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZuOiAoKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPFRPdXQ+IHtcbiAgICAvLyBDcmVhdGUgc2NvcGUgdmlhIFNjb3BlRmFjdG9yeSDigJQgZWFjaCBzdGFnZSBnZXRzIGl0cyBvd24gc2NvcGUgaW5zdGFuY2VcbiAgICBjb25zdCByYXdTY29wZSA9IHRoaXMuZGVwcy5TY29wZUZhY3RvcnkoY29udGV4dCwgbm9kZS5uYW1lLCB0aGlzLmRlcHMucmVhZE9ubHlDb250ZXh0KTtcblxuICAgIC8vIFdyYXAgc2NvcGUgd2l0aCBwcm90ZWN0aW9uIHRvIGludGVyY2VwdCBkaXJlY3QgcHJvcGVydHkgYXNzaWdubWVudHNcbiAgICBjb25zdCBzY29wZSA9IGNyZWF0ZVByb3RlY3RlZFNjb3BlKHJhd1Njb3BlIGFzIG9iamVjdCwge1xuICAgICAgbW9kZTogdGhpcy5kZXBzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBzdGFnZU5hbWU6IG5vZGUubmFtZSxcbiAgICB9KSBhcyBUU2NvcGU7XG5cbiAgICAvLyBTZXQgdXAgc3RyZWFtaW5nIGNhbGxiYWNrIGlmIHRoaXMgaXMgYSBzdHJlYW1pbmcgc3RhZ2VcbiAgICBsZXQgc3RyZWFtQ2FsbGJhY2s6IFN0cmVhbUNhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICAgIGxldCBhY2N1bXVsYXRlZFRleHQgPSAnJztcblxuICAgIGlmIChub2RlLmlzU3RyZWFtaW5nKSB7XG4gICAgICBjb25zdCBzdHJlYW1JZCA9IG5vZGUuc3RyZWFtSWQgPz8gbm9kZS5uYW1lO1xuICAgICAgc3RyZWFtQ2FsbGJhY2sgPSAodG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICBhY2N1bXVsYXRlZFRleHQgKz0gdG9rZW47XG4gICAgICAgIHRoaXMuZGVwcy5zdHJlYW1IYW5kbGVycz8ub25Ub2tlbj8uKHN0cmVhbUlkLCB0b2tlbik7XG4gICAgICB9O1xuICAgICAgdGhpcy5kZXBzLnN0cmVhbUhhbmRsZXJzPy5vblN0YXJ0Py4oc3RyZWFtSWQpO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSByZWNvcmRlcnMgb2Ygc3RhZ2Ugc3RhcnQgKGlmIHNjb3BlIHN1cHBvcnRzIGl0KVxuICAgIGlmIChyYXdTY29wZSAmJiB0eXBlb2YgKHJhd1Njb3BlIGFzIGFueSkubm90aWZ5U3RhZ2VTdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKHJhd1Njb3BlIGFzIGFueSkubm90aWZ5U3RhZ2VTdGFydCgpO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgdGhlIHN0YWdlIGZ1bmN0aW9uXG4gICAgY29uc3Qgb3V0cHV0ID0gc3RhZ2VGdW5jKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjayk7XG5cbiAgICAvLyBTeW5jK2FzeW5jIHNhZmV0eTogb25seSBhd2FpdCByZWFsIFByb21pc2VzIHRvIGF2b2lkIHRoZW5hYmxlIGFzc2ltaWxhdGlvblxuICAgIGxldCByZXN1bHQ6IFRPdXQ7XG4gICAgaWYgKG91dHB1dCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIC8vIFJhY2UgYWdhaW5zdCBBYm9ydFNpZ25hbCBpZiBwcm92aWRlZFxuICAgICAgaWYgKHRoaXMuZGVwcy5zaWduYWwpIHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmFjZUFib3J0KG91dHB1dCwgdGhpcy5kZXBzLnNpZ25hbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBvdXRwdXQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IG91dHB1dDtcbiAgICB9XG5cbiAgICAvLyBOb3RpZnkgcmVjb3JkZXJzIG9mIHN0YWdlIGVuZCAoaWYgc2NvcGUgc3VwcG9ydHMgaXQpXG4gICAgaWYgKHJhd1Njb3BlICYmIHR5cGVvZiAocmF3U2NvcGUgYXMgYW55KS5ub3RpZnlTdGFnZUVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKHJhd1Njb3BlIGFzIGFueSkubm90aWZ5U3RhZ2VFbmQoKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIG9uRW5kIGxpZmVjeWNsZSBob29rIGZvciBzdHJlYW1pbmcgc3RhZ2VzXG4gICAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHtcbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZCA/PyBub2RlLm5hbWU7XG4gICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uRW5kPy4oc3RyZWFtSWQsIGFjY3VtdWxhdGVkVGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKiogUmFjZSBhIHByb21pc2UgYWdhaW5zdCBhbiBBYm9ydFNpZ25hbC4gUmVqZWN0cyB3aXRoIHRoZSBzaWduYWwncyByZWFzb24gb24gYWJvcnQuICovXG5mdW5jdGlvbiByYWNlQWJvcnQ8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VD4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcihzaWduYWwucmVhc29uID8/ICdBYm9ydGVkJykpO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+XG4gICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcihzaWduYWwucmVhc29uID8/ICdBYm9ydGVkJykpO1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuIl19