footprintjs 9.35.0 → 9.37.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 (158) hide show
  1. package/CLAUDE.md +4 -4
  2. package/dist/advanced.js +2 -2
  3. package/dist/esm/advanced.d.ts +2 -2
  4. package/dist/esm/advanced.js +2 -2
  5. package/dist/esm/index.d.ts +2 -2
  6. package/dist/esm/index.js +1 -1
  7. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +5 -34
  8. package/dist/esm/lib/builder/FlowChartBuilder.js +236 -375
  9. package/dist/esm/lib/engine/graph/prefixNodeTree.d.ts +26 -0
  10. package/dist/esm/lib/engine/graph/prefixNodeTree.js +40 -0
  11. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
  12. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.js +3 -3
  13. package/dist/esm/lib/engine/handlers/ResumeEntry.js +11 -2
  14. package/dist/esm/lib/engine/handlers/StageRunner.js +17 -3
  15. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +3 -32
  16. package/dist/esm/lib/engine/index.d.ts +1 -1
  17. package/dist/esm/lib/engine/index.js +1 -1
  18. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  19. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
  20. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
  21. package/dist/esm/lib/engine/narrative/types.d.ts +26 -10
  22. package/dist/esm/lib/engine/narrative/types.js +1 -1
  23. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
  24. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +68 -86
  25. package/dist/esm/lib/engine/traversalContext.d.ts +65 -0
  26. package/dist/esm/lib/engine/traversalContext.js +83 -0
  27. package/dist/esm/lib/engine/types.d.ts +1 -3
  28. package/dist/esm/lib/engine/types.js +1 -1
  29. package/dist/esm/lib/engine/walkSubflowSpec.js +3 -2
  30. package/dist/esm/lib/ids/branchSegment.js +119 -0
  31. package/dist/esm/lib/ids/runtimeStageId.d.ts +191 -0
  32. package/dist/esm/lib/ids/runtimeStageId.js +225 -0
  33. package/dist/esm/lib/memory/StageContext.d.ts +1 -17
  34. package/dist/esm/lib/memory/StageContext.js +2 -37
  35. package/dist/esm/lib/memory/commitLogUtils.js +1 -1
  36. package/dist/esm/lib/memory/logModel.js +1 -1
  37. package/dist/esm/lib/memory/runPolicy.d.ts +2 -3
  38. package/dist/esm/lib/memory/runPolicy.js +3 -4
  39. package/dist/esm/lib/memory/verbs.d.ts +2 -1
  40. package/dist/esm/lib/memory/verbs.js +1 -1
  41. package/dist/esm/lib/pause/index.d.ts +1 -1
  42. package/dist/esm/lib/pause/index.js +1 -1
  43. package/dist/esm/lib/pause/types.d.ts +48 -1
  44. package/dist/esm/lib/pause/types.js +52 -3
  45. package/dist/esm/lib/recorder/CombinedRecorder.d.ts +2 -33
  46. package/dist/esm/lib/recorder/CombinedRecorder.js +10 -62
  47. package/dist/esm/lib/recorder/CompositeRecorder.d.ts +15 -26
  48. package/dist/esm/lib/recorder/CompositeRecorder.js +33 -97
  49. package/dist/esm/lib/recorder/EmitRecorder.d.ts +2 -7
  50. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  51. package/dist/esm/lib/recorder/InOutRecorder.js +3 -2
  52. package/dist/esm/lib/recorder/hooks.d.ts +249 -0
  53. package/dist/esm/lib/recorder/hooks.js +132 -0
  54. package/dist/esm/lib/recorder/snapshot.d.ts +19 -0
  55. package/dist/esm/lib/recorder/snapshot.js +26 -0
  56. package/dist/esm/lib/runner/DeferredObserverTier.js +15 -25
  57. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +1 -18
  58. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -37
  59. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -8
  60. package/dist/esm/lib/runner/FlowChartExecutor.js +59 -32
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +6 -5
  62. package/dist/esm/lib/scope/ScopeFacade.d.ts +6 -1
  63. package/dist/esm/lib/scope/ScopeFacade.js +36 -61
  64. package/dist/esm/lib/scope/types.d.ts +3 -9
  65. package/dist/esm/lib/scope/types.js +1 -1
  66. package/dist/esm/lib/time-travel/chain.js +2 -2
  67. package/dist/esm/lib/time-travel/commitStops.js +4 -4
  68. package/dist/esm/lib/time-travel/index.d.ts +1 -1
  69. package/dist/esm/lib/time-travel/index.js +2 -2
  70. package/dist/esm/lib/time-travel/timeTravel.js +8 -9
  71. package/dist/esm/lib/time-travel/types.d.ts +1 -1
  72. package/dist/esm/lib/time-travel/types.js +2 -2
  73. package/dist/esm/trace.d.ts +3 -3
  74. package/dist/esm/trace.js +3 -3
  75. package/dist/index.js +1 -1
  76. package/dist/lib/builder/FlowChartBuilder.js +236 -375
  77. package/dist/lib/engine/graph/prefixNodeTree.js +44 -0
  78. package/dist/lib/engine/handlers/ParallelForEachHandler.js +3 -3
  79. package/dist/lib/engine/handlers/ResumeEntry.js +10 -1
  80. package/dist/lib/engine/handlers/StageRunner.js +17 -3
  81. package/dist/lib/engine/handlers/SubflowExecutor.js +3 -32
  82. package/dist/lib/engine/index.js +1 -1
  83. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
  84. package/dist/lib/engine/narrative/types.js +1 -1
  85. package/dist/lib/engine/traversal/FlowchartTraverser.js +68 -86
  86. package/dist/lib/engine/traversalContext.js +89 -0
  87. package/dist/lib/engine/types.js +1 -1
  88. package/dist/lib/engine/walkSubflowSpec.js +3 -2
  89. package/dist/lib/ids/branchSegment.js +127 -0
  90. package/dist/lib/ids/runtimeStageId.js +242 -0
  91. package/dist/lib/memory/StageContext.js +1 -36
  92. package/dist/lib/memory/commitLogUtils.js +1 -1
  93. package/dist/lib/memory/logModel.js +1 -1
  94. package/dist/lib/memory/runPolicy.js +3 -4
  95. package/dist/lib/memory/verbs.js +1 -1
  96. package/dist/lib/pause/index.js +1 -1
  97. package/dist/lib/pause/types.js +54 -4
  98. package/dist/lib/recorder/CombinedRecorder.js +11 -63
  99. package/dist/lib/recorder/CompositeRecorder.js +33 -97
  100. package/dist/lib/recorder/EmitRecorder.js +1 -1
  101. package/dist/lib/recorder/InOutRecorder.js +3 -2
  102. package/dist/lib/recorder/hooks.js +140 -0
  103. package/dist/lib/recorder/snapshot.js +30 -0
  104. package/dist/lib/runner/DeferredObserverTier.js +16 -26
  105. package/dist/lib/runner/ExecutionRuntime.js +1 -36
  106. package/dist/lib/runner/FlowChartExecutor.js +58 -31
  107. package/dist/lib/runner/getSubtreeSnapshot.js +6 -5
  108. package/dist/lib/scope/ScopeFacade.js +36 -61
  109. package/dist/lib/scope/types.js +1 -1
  110. package/dist/lib/time-travel/chain.js +2 -2
  111. package/dist/lib/time-travel/commitStops.js +4 -4
  112. package/dist/lib/time-travel/index.js +2 -2
  113. package/dist/lib/time-travel/timeTravel.js +8 -9
  114. package/dist/lib/time-travel/types.js +2 -2
  115. package/dist/trace.js +3 -3
  116. package/dist/types/advanced.d.ts +2 -2
  117. package/dist/types/index.d.ts +2 -2
  118. package/dist/types/lib/builder/FlowChartBuilder.d.ts +5 -34
  119. package/dist/types/lib/engine/graph/prefixNodeTree.d.ts +26 -0
  120. package/dist/types/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
  121. package/dist/types/lib/engine/index.d.ts +1 -1
  122. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  123. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
  124. package/dist/types/lib/engine/narrative/types.d.ts +26 -10
  125. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
  126. package/dist/types/lib/engine/traversalContext.d.ts +65 -0
  127. package/dist/types/lib/engine/types.d.ts +1 -3
  128. package/dist/types/lib/ids/runtimeStageId.d.ts +191 -0
  129. package/dist/types/lib/memory/StageContext.d.ts +1 -17
  130. package/dist/types/lib/memory/runPolicy.d.ts +2 -3
  131. package/dist/types/lib/memory/verbs.d.ts +2 -1
  132. package/dist/types/lib/pause/index.d.ts +1 -1
  133. package/dist/types/lib/pause/types.d.ts +48 -1
  134. package/dist/types/lib/recorder/CombinedRecorder.d.ts +2 -33
  135. package/dist/types/lib/recorder/CompositeRecorder.d.ts +15 -26
  136. package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -7
  137. package/dist/types/lib/recorder/hooks.d.ts +249 -0
  138. package/dist/types/lib/recorder/snapshot.d.ts +19 -0
  139. package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -18
  140. package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -8
  141. package/dist/types/lib/scope/ScopeFacade.d.ts +6 -1
  142. package/dist/types/lib/scope/types.d.ts +3 -9
  143. package/dist/types/lib/time-travel/index.d.ts +1 -1
  144. package/dist/types/lib/time-travel/types.d.ts +1 -1
  145. package/dist/types/trace.d.ts +3 -3
  146. package/package.json +1 -1
  147. package/dist/esm/lib/engine/branchSegment.js +0 -119
  148. package/dist/esm/lib/engine/runtimeStageId.d.ts +0 -103
  149. package/dist/esm/lib/engine/runtimeStageId.js +0 -119
  150. package/dist/esm/lib/recorder/invokeHook.d.ts +0 -8
  151. package/dist/esm/lib/recorder/invokeHook.js +0 -9
  152. package/dist/lib/engine/branchSegment.js +0 -127
  153. package/dist/lib/engine/runtimeStageId.js +0 -126
  154. package/dist/lib/recorder/invokeHook.js +0 -13
  155. package/dist/types/lib/engine/runtimeStageId.d.ts +0 -103
  156. package/dist/types/lib/recorder/invokeHook.d.ts +0 -8
  157. /package/dist/esm/lib/{engine → ids}/branchSegment.d.ts +0 -0
  158. /package/dist/types/lib/{engine → ids}/branchSegment.d.ts +0 -0
@@ -1,119 +0,0 @@
1
- /**
2
- * runtimeStageId — unique identifier for each execution step during traversal.
3
- *
4
- * Format: [subflowPath/]stageId#executionIndex
5
- *
6
- * Components:
7
- * stageId — stable node ID from the builder ('call-llm', 'seed')
8
- * executionIndex — monotonic counter incremented per stage execution (0, 1, 2...)
9
- * subflowPath — optional path for subflow stages ('sf-tools', 'sf-outer/sf-inner')
10
- *
11
- * Properties:
12
- * - Unique within a run (executionIndex never repeats)
13
- * - Execution-ordered (sort by executionIndex = execution order)
14
- * - Human-readable ('sf-tools/execute-tool-calls#8')
15
- * - Parseable (split on '#' for stageId and index, split stageId on '/' for subflow path)
16
- *
17
- * Naming-collision warning
18
- * ────────────────────────
19
- * The parsed-output `.stageId` field below is the LOCAL form (segment
20
- * after the last '/'). This is NOT the same as `spec.id` / `node.id`
21
- * for subflow-nested stages, which carry the FULL prefixed form
22
- * (`'sf-tools/execute-tool-calls'`). To compare safely, use
23
- * `splitStageId(spec.id)` to decompose the prefixed form the same
24
- * way `parseRuntimeStageId` decomposes a runtimeStageId.
25
- *
26
- * @example
27
- * ```
28
- * buildRuntimeStageId('call-llm', 5) // 'call-llm#5'
29
- * buildRuntimeStageId('execute-tool-calls', 8, 'sf-tools') // 'sf-tools/execute-tool-calls#8'
30
- * buildRuntimeStageId('validate', 3, 'sf-outer/sf-inner') // 'sf-outer/sf-inner/validate#3'
31
- * ```
32
- */
33
- /**
34
- * Build a runtimeStageId from its components.
35
- *
36
- * Note: The traverser does NOT use the subflowPath parameter — node.id already
37
- * includes the subflow prefix from the builder. This parameter exists for external
38
- * consumers constructing IDs from parsed components (round-trip via parseRuntimeStageId).
39
- */
40
- export function buildRuntimeStageId(stageId, executionIndex, subflowPath) {
41
- const prefix = subflowPath ? `${subflowPath}/` : '';
42
- return `${prefix}${stageId}#${executionIndex}`;
43
- }
44
- /**
45
- * Parse a runtimeStageId into its components.
46
- *
47
- * IMPORTANT — naming collision: the returned `stageId` is the LOCAL
48
- * form (the segment between the last '/' and the '#'). This is NOT
49
- * the same as `spec.id` or `node.id` for subflow-nested stages,
50
- * which contain the FULL prefixed form.
51
- *
52
- * parseRuntimeStageId('sf-tools/execute-tool-calls#8').stageId
53
- * // → 'execute-tool-calls' (LOCAL)
54
- *
55
- * node.id // (post-mount, in a spec that contains subflows)
56
- * // → 'sf-tools/execute-tool-calls' (FULL prefixed)
57
- *
58
- * To compare these two safely, use `splitStageId(node.id)` to get
59
- * the local form, OR reconstruct the full form via
60
- * `(subflowPath ? subflowPath + '/' : '') + stageId`.
61
- */
62
- export function parseRuntimeStageId(runtimeStageId) {
63
- const hashIdx = runtimeStageId.lastIndexOf('#');
64
- if (hashIdx === -1) {
65
- return { stageId: runtimeStageId, executionIndex: 0, subflowPath: undefined };
66
- }
67
- const beforeHash = runtimeStageId.slice(0, hashIdx);
68
- const executionIndex = parseInt(runtimeStageId.slice(hashIdx + 1), 10);
69
- const lastSlash = beforeHash.lastIndexOf('/');
70
- if (lastSlash === -1) {
71
- return { stageId: beforeHash, executionIndex, subflowPath: undefined };
72
- }
73
- return {
74
- stageId: beforeHash.slice(lastSlash + 1),
75
- executionIndex,
76
- subflowPath: beforeHash.slice(0, lastSlash),
77
- };
78
- }
79
- /**
80
- * Decompose a (possibly prefixed) stage id into its components.
81
- *
82
- * Use this when you have an id WITHOUT the `#N` execution suffix and
83
- * need the local stage name and/or the subflow path. Common sources
84
- * of such ids:
85
- * - `spec.id` (post-mount the id includes any subflow prefix)
86
- * - `CommitBundle.stageId` (post-mount id)
87
- * - `node.id` from xyflow nodes built off the spec
88
- * - the segment of `runtimeStageId` BEFORE the `#` (use
89
- * `parseRuntimeStageId` directly for full runtimeStageId strings)
90
- *
91
- * Mirrors the decomposition `parseRuntimeStageId` performs on the
92
- * stageId portion of a runtimeStageId, so the two helpers stay in
93
- * lockstep on naming and behavior.
94
- *
95
- * @example
96
- * splitStageId('sf-tools/execute-tool-calls')
97
- * // → { localStageId: 'execute-tool-calls', subflowPath: 'sf-tools' }
98
- *
99
- * splitStageId('execute-tool-calls')
100
- * // → { localStageId: 'execute-tool-calls', subflowPath: undefined }
101
- *
102
- * splitStageId('sf-outer/sf-inner/validate')
103
- * // → { localStageId: 'validate', subflowPath: 'sf-outer/sf-inner' }
104
- */
105
- export function splitStageId(prefixedStageId) {
106
- const lastSlash = prefixedStageId.lastIndexOf('/');
107
- if (lastSlash === -1) {
108
- return { localStageId: prefixedStageId, subflowPath: undefined };
109
- }
110
- return {
111
- localStageId: prefixedStageId.slice(lastSlash + 1),
112
- subflowPath: prefixedStageId.slice(0, lastSlash),
113
- };
114
- }
115
- /** Create a new execution counter starting at 0. */
116
- export function createExecutionCounter() {
117
- return { value: 0 };
118
- }
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZVN0YWdlSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFlLEVBQUUsY0FBc0IsRUFBRSxXQUFvQjtJQUMvRixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRCxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLGNBQXNCO0lBS3hELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuQixPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUN4QyxjQUFjO1FBQ2QsV0FBVyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztLQUM1QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxlQUF1QjtJQUlsRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFDRCxPQUFPO1FBQ0wsWUFBWSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsRCxXQUFXLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBV0Qsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBydW50aW1lU3RhZ2VJZCDigJQgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggZXhlY3V0aW9uIHN0ZXAgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleFxuICpcbiAqIENvbXBvbmVudHM6XG4gKiAgIHN0YWdlSWQgICAgICAgIOKAlCBzdGFibGUgbm9kZSBJRCBmcm9tIHRoZSBidWlsZGVyICgnY2FsbC1sbG0nLCAnc2VlZCcpXG4gKiAgIGV4ZWN1dGlvbkluZGV4IOKAlCBtb25vdG9uaWMgY291bnRlciBpbmNyZW1lbnRlZCBwZXIgc3RhZ2UgZXhlY3V0aW9uICgwLCAxLCAyLi4uKVxuICogICBzdWJmbG93UGF0aCAgICDigJQgb3B0aW9uYWwgcGF0aCBmb3Igc3ViZmxvdyBzdGFnZXMgKCdzZi10b29scycsICdzZi1vdXRlci9zZi1pbm5lcicpXG4gKlxuICogUHJvcGVydGllczpcbiAqICAgLSBVbmlxdWUgd2l0aGluIGEgcnVuIChleGVjdXRpb25JbmRleCBuZXZlciByZXBlYXRzKVxuICogICAtIEV4ZWN1dGlvbi1vcmRlcmVkIChzb3J0IGJ5IGV4ZWN1dGlvbkluZGV4ID0gZXhlY3V0aW9uIG9yZGVyKVxuICogICAtIEh1bWFuLXJlYWRhYmxlICgnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzIzgnKVxuICogICAtIFBhcnNlYWJsZSAoc3BsaXQgb24gJyMnIGZvciBzdGFnZUlkIGFuZCBpbmRleCwgc3BsaXQgc3RhZ2VJZCBvbiAnLycgZm9yIHN1YmZsb3cgcGF0aClcbiAqXG4gKiBOYW1pbmctY29sbGlzaW9uIHdhcm5pbmdcbiAqIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogICBUaGUgcGFyc2VkLW91dHB1dCBgLnN0YWdlSWRgIGZpZWxkIGJlbG93IGlzIHRoZSBMT0NBTCBmb3JtIChzZWdtZW50XG4gKiAgIGFmdGVyIHRoZSBsYXN0ICcvJykuIFRoaXMgaXMgTk9UIHRoZSBzYW1lIGFzIGBzcGVjLmlkYCAvIGBub2RlLmlkYFxuICogICBmb3Igc3ViZmxvdy1uZXN0ZWQgc3RhZ2VzLCB3aGljaCBjYXJyeSB0aGUgRlVMTCBwcmVmaXhlZCBmb3JtXG4gKiAgIChgJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscydgKS4gVG8gY29tcGFyZSBzYWZlbHksIHVzZVxuICogICBgc3BsaXRTdGFnZUlkKHNwZWMuaWQpYCB0byBkZWNvbXBvc2UgdGhlIHByZWZpeGVkIGZvcm0gdGhlIHNhbWVcbiAqICAgd2F5IGBwYXJzZVJ1bnRpbWVTdGFnZUlkYCBkZWNvbXBvc2VzIGEgcnVudGltZVN0YWdlSWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogYnVpbGRSdW50aW1lU3RhZ2VJZCgnY2FsbC1sbG0nLCA1KSAgICAgICAgICAgICAgICAgICAgLy8gJ2NhbGwtbGxtIzUnXG4gKiBidWlsZFJ1bnRpbWVTdGFnZUlkKCdleGVjdXRlLXRvb2wtY2FsbHMnLCA4LCAnc2YtdG9vbHMnKSAvLyAnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzIzgnXG4gKiBidWlsZFJ1bnRpbWVTdGFnZUlkKCd2YWxpZGF0ZScsIDMsICdzZi1vdXRlci9zZi1pbm5lcicpICAvLyAnc2Ytb3V0ZXIvc2YtaW5uZXIvdmFsaWRhdGUjMydcbiAqIGBgYFxuICovXG5cbi8qKlxuICogQnVpbGQgYSBydW50aW1lU3RhZ2VJZCBmcm9tIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIE5vdGU6IFRoZSB0cmF2ZXJzZXIgZG9lcyBOT1QgdXNlIHRoZSBzdWJmbG93UGF0aCBwYXJhbWV0ZXIg4oCUIG5vZGUuaWQgYWxyZWFkeVxuICogaW5jbHVkZXMgdGhlIHN1YmZsb3cgcHJlZml4IGZyb20gdGhlIGJ1aWxkZXIuIFRoaXMgcGFyYW1ldGVyIGV4aXN0cyBmb3IgZXh0ZXJuYWxcbiAqIGNvbnN1bWVycyBjb25zdHJ1Y3RpbmcgSURzIGZyb20gcGFyc2VkIGNvbXBvbmVudHMgKHJvdW5kLXRyaXAgdmlhIHBhcnNlUnVudGltZVN0YWdlSWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSdW50aW1lU3RhZ2VJZChzdGFnZUlkOiBzdHJpbmcsIGV4ZWN1dGlvbkluZGV4OiBudW1iZXIsIHN1YmZsb3dQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcHJlZml4ID0gc3ViZmxvd1BhdGggPyBgJHtzdWJmbG93UGF0aH0vYCA6ICcnO1xuICByZXR1cm4gYCR7cHJlZml4fSR7c3RhZ2VJZH0jJHtleGVjdXRpb25JbmRleH1gO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgcnVudGltZVN0YWdlSWQgaW50byBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBJTVBPUlRBTlQg4oCUIG5hbWluZyBjb2xsaXNpb246IHRoZSByZXR1cm5lZCBgc3RhZ2VJZGAgaXMgdGhlIExPQ0FMXG4gKiBmb3JtICh0aGUgc2VnbWVudCBiZXR3ZWVuIHRoZSBsYXN0ICcvJyBhbmQgdGhlICcjJykuIFRoaXMgaXMgTk9UXG4gKiB0aGUgc2FtZSBhcyBgc3BlYy5pZGAgb3IgYG5vZGUuaWRgIGZvciBzdWJmbG93LW5lc3RlZCBzdGFnZXMsXG4gKiB3aGljaCBjb250YWluIHRoZSBGVUxMIHByZWZpeGVkIGZvcm0uXG4gKlxuICogICBwYXJzZVJ1bnRpbWVTdGFnZUlkKCdzZi10b29scy9leGVjdXRlLXRvb2wtY2FsbHMjOCcpLnN0YWdlSWRcbiAqICAgLy8g4oaSICdleGVjdXRlLXRvb2wtY2FsbHMnICAgKExPQ0FMKVxuICpcbiAqICAgbm9kZS5pZCAgLy8gKHBvc3QtbW91bnQsIGluIGEgc3BlYyB0aGF0IGNvbnRhaW5zIHN1YmZsb3dzKVxuICogICAvLyDihpIgJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscycgICAoRlVMTCBwcmVmaXhlZClcbiAqXG4gKiBUbyBjb21wYXJlIHRoZXNlIHR3byBzYWZlbHksIHVzZSBgc3BsaXRTdGFnZUlkKG5vZGUuaWQpYCB0byBnZXRcbiAqIHRoZSBsb2NhbCBmb3JtLCBPUiByZWNvbnN0cnVjdCB0aGUgZnVsbCBmb3JtIHZpYVxuICogYChzdWJmbG93UGF0aCA/IHN1YmZsb3dQYXRoICsgJy8nIDogJycpICsgc3RhZ2VJZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJ1bnRpbWVTdGFnZUlkKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiB7XG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgZXhlY3V0aW9uSW5kZXg6IG51bWJlcjtcbiAgc3ViZmxvd1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0ge1xuICBjb25zdCBoYXNoSWR4ID0gcnVudGltZVN0YWdlSWQubGFzdEluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2hJZHggPT09IC0xKSB7XG4gICAgcmV0dXJuIHsgc3RhZ2VJZDogcnVudGltZVN0YWdlSWQsIGV4ZWN1dGlvbkluZGV4OiAwLCBzdWJmbG93UGF0aDogdW5kZWZpbmVkIH07XG4gIH1cblxuICBjb25zdCBiZWZvcmVIYXNoID0gcnVudGltZVN0YWdlSWQuc2xpY2UoMCwgaGFzaElkeCk7XG4gIGNvbnN0IGV4ZWN1dGlvbkluZGV4ID0gcGFyc2VJbnQocnVudGltZVN0YWdlSWQuc2xpY2UoaGFzaElkeCArIDEpLCAxMCk7XG5cbiAgY29uc3QgbGFzdFNsYXNoID0gYmVmb3JlSGFzaC5sYXN0SW5kZXhPZignLycpO1xuICBpZiAobGFzdFNsYXNoID09PSAtMSkge1xuICAgIHJldHVybiB7IHN0YWdlSWQ6IGJlZm9yZUhhc2gsIGV4ZWN1dGlvbkluZGV4LCBzdWJmbG93UGF0aDogdW5kZWZpbmVkIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YWdlSWQ6IGJlZm9yZUhhc2guc2xpY2UobGFzdFNsYXNoICsgMSksXG4gICAgZXhlY3V0aW9uSW5kZXgsXG4gICAgc3ViZmxvd1BhdGg6IGJlZm9yZUhhc2guc2xpY2UoMCwgbGFzdFNsYXNoKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNvbXBvc2UgYSAocG9zc2libHkgcHJlZml4ZWQpIHN0YWdlIGlkIGludG8gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogVXNlIHRoaXMgd2hlbiB5b3UgaGF2ZSBhbiBpZCBXSVRIT1VUIHRoZSBgI05gIGV4ZWN1dGlvbiBzdWZmaXggYW5kXG4gKiBuZWVkIHRoZSBsb2NhbCBzdGFnZSBuYW1lIGFuZC9vciB0aGUgc3ViZmxvdyBwYXRoLiBDb21tb24gc291cmNlc1xuICogb2Ygc3VjaCBpZHM6XG4gKiAgIC0gYHNwZWMuaWRgIChwb3N0LW1vdW50IHRoZSBpZCBpbmNsdWRlcyBhbnkgc3ViZmxvdyBwcmVmaXgpXG4gKiAgIC0gYENvbW1pdEJ1bmRsZS5zdGFnZUlkYCAocG9zdC1tb3VudCBpZClcbiAqICAgLSBgbm9kZS5pZGAgZnJvbSB4eWZsb3cgbm9kZXMgYnVpbHQgb2ZmIHRoZSBzcGVjXG4gKiAgIC0gdGhlIHNlZ21lbnQgb2YgYHJ1bnRpbWVTdGFnZUlkYCBCRUZPUkUgdGhlIGAjYCAodXNlXG4gKiAgICAgYHBhcnNlUnVudGltZVN0YWdlSWRgIGRpcmVjdGx5IGZvciBmdWxsIHJ1bnRpbWVTdGFnZUlkIHN0cmluZ3MpXG4gKlxuICogTWlycm9ycyB0aGUgZGVjb21wb3NpdGlvbiBgcGFyc2VSdW50aW1lU3RhZ2VJZGAgcGVyZm9ybXMgb24gdGhlXG4gKiBzdGFnZUlkIHBvcnRpb24gb2YgYSBydW50aW1lU3RhZ2VJZCwgc28gdGhlIHR3byBoZWxwZXJzIHN0YXkgaW5cbiAqIGxvY2tzdGVwIG9uIG5hbWluZyBhbmQgYmVoYXZpb3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNwbGl0U3RhZ2VJZCgnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzJylcbiAqIC8vIOKGkiB7IGxvY2FsU3RhZ2VJZDogJ2V4ZWN1dGUtdG9vbC1jYWxscycsIHN1YmZsb3dQYXRoOiAnc2YtdG9vbHMnIH1cbiAqXG4gKiBzcGxpdFN0YWdlSWQoJ2V4ZWN1dGUtdG9vbC1jYWxscycpXG4gKiAvLyDihpIgeyBsb2NhbFN0YWdlSWQ6ICdleGVjdXRlLXRvb2wtY2FsbHMnLCBzdWJmbG93UGF0aDogdW5kZWZpbmVkIH1cbiAqXG4gKiBzcGxpdFN0YWdlSWQoJ3NmLW91dGVyL3NmLWlubmVyL3ZhbGlkYXRlJylcbiAqIC8vIOKGkiB7IGxvY2FsU3RhZ2VJZDogJ3ZhbGlkYXRlJywgc3ViZmxvd1BhdGg6ICdzZi1vdXRlci9zZi1pbm5lcicgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdGFnZUlkKHByZWZpeGVkU3RhZ2VJZDogc3RyaW5nKToge1xuICBsb2NhbFN0YWdlSWQ6IHN0cmluZztcbiAgc3ViZmxvd1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0ge1xuICBjb25zdCBsYXN0U2xhc2ggPSBwcmVmaXhlZFN0YWdlSWQubGFzdEluZGV4T2YoJy8nKTtcbiAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBsb2NhbFN0YWdlSWQ6IHByZWZpeGVkU3RhZ2VJZCwgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbG9jYWxTdGFnZUlkOiBwcmVmaXhlZFN0YWdlSWQuc2xpY2UobGFzdFNsYXNoICsgMSksXG4gICAgc3ViZmxvd1BhdGg6IHByZWZpeGVkU3RhZ2VJZC5zbGljZSgwLCBsYXN0U2xhc2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBtdXRhYmxlIGNvdW50ZXIgZm9yIGV4ZWN1dGlvbiBpbmRleC5cbiAqIFBhc3NlZCBieSByZWZlcmVuY2UgdG8gY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIHRoZXlcbiAqIGNvbnRpbnVlIHRoZSBnbG9iYWwgbnVtYmVyaW5nIGluc3RlYWQgb2YgcmVzdGFydGluZyBhdCAwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50ZXIge1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKiogQ3JlYXRlIGEgbmV3IGV4ZWN1dGlvbiBjb3VudGVyIHN0YXJ0aW5nIGF0IDAuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ291bnRlcigpOiBFeGVjdXRpb25Db3VudGVyIHtcbiAgcmV0dXJuIHsgdmFsdWU6IDAgfTtcbn1cbiJdfQ==
@@ -1,8 +0,0 @@
1
- /**
2
- * @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
3
- * and then goes away; import `invokeRecorderHook` from `lib/capture/invokeHook.ts`.
4
- *
5
- * It imported nothing but sat inside `recorder/`, so `scope/` (the inline tier) had to
6
- * import `recorder/` for it — one edge of the memory ⇄ scope ⇄ recorder cycle.
7
- */
8
- export { invokeRecorderHook } from '../capture/invokeHook.js';
@@ -1,9 +0,0 @@
1
- /**
2
- * @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
3
- * and then goes away; import `invokeRecorderHook` from `lib/capture/invokeHook.ts`.
4
- *
5
- * It imported nothing but sat inside `recorder/`, so `scope/` (the inline tier) had to
6
- * import `recorder/` for it — one edge of the memory ⇄ scope ⇄ recorder cycle.
7
- */
8
- export { invokeRecorderHook } from '../capture/invokeHook.js';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2tlSG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvaW52b2tlSG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlcHJlY2F0ZWQgTW92ZWQgKEYwLCB0aGUgZmVuY2UgYW5kIHRoZSBsZWF2ZXMpLiBUaGlzIHBhdGggcmUtZXhwb3J0cyBmb3Igb25lIG1pbm9yXG4gKiBhbmQgdGhlbiBnb2VzIGF3YXk7IGltcG9ydCBgaW52b2tlUmVjb3JkZXJIb29rYCBmcm9tIGBsaWIvY2FwdHVyZS9pbnZva2VIb29rLnRzYC5cbiAqXG4gKiBJdCBpbXBvcnRlZCBub3RoaW5nIGJ1dCBzYXQgaW5zaWRlIGByZWNvcmRlci9gLCBzbyBgc2NvcGUvYCAodGhlIGlubGluZSB0aWVyKSBoYWQgdG9cbiAqIGltcG9ydCBgcmVjb3JkZXIvYCBmb3IgaXQg4oCUIG9uZSBlZGdlIG9mIHRoZSBtZW1vcnkg4oeEIHNjb3BlIOKHhCByZWNvcmRlciBjeWNsZS5cbiAqL1xuZXhwb3J0IHsgaW52b2tlUmVjb3JkZXJIb29rIH0gZnJvbSAnLi4vY2FwdHVyZS9pbnZva2VIb29rLmpzJztcbiJdfQ==
@@ -1,127 +0,0 @@
1
- "use strict";
2
- /**
3
- * branchSegment — the grammar for GENERATED subflow path segments.
4
- *
5
- * Design: docs/design/execution-control.md (D1). This module is the ONE place
6
- * the generated-segment rule lives; every producer and every validator imports
7
- * it rather than re-spelling the format.
8
- *
9
- * ## The law
10
- *
11
- * A `parallelForEach` branch executes as a generated subflow whose path
12
- * segment is `<parentStageId>~<branchIndex>`. It rides the runtimeStageId
13
- * grammar that already exists — `[subflowPath/]stageId#executionIndex` — with
14
- * `#` and `/` keeping ONE meaning each:
15
- *
16
- * review-chunks~2/score#14
17
- * └── subflowPath ──┘└stage┘└idx┘
18
- *
19
- * There is deliberately NO third delimiter class. Every parser in the library
20
- * splits on the LAST `#` then the LAST `/`, so a generated segment is opaque
21
- * to all of them: `parseRuntimeStageId`, `splitStageId`, `ScopeFacade`'s
22
- * subflow-path derivation, `InOutRecorder`, `getSubtreeSnapshot`,
23
- * `DeferredObserverTier`, and the structure recorder all read a generated
24
- * branch exactly the way they read a hand-authored subflow. That is the whole
25
- * point of D1: branch commits reach `causalChain` / `sliceForKey` /
26
- * `forwardSliceForKey` with ZERO changes to those readers.
27
- *
28
- * ## Why the marker is reserved
29
- *
30
- * Stage ids and subflow ids are user-authored free-form strings. A marker that
31
- * could also appear in a user id would not crash — it would silently
32
- * mis-attribute, which is worse (the loop-ref precedent proves this codebase
33
- * tolerates deliberate id-collision classes). So the marker is REFUSED at
34
- * build time in the two positions that could collide with a generated segment:
35
- *
36
- * 1. user-authored SUBFLOW ids (every `addSubFlowChart*` / `addLazySubFlowChart*`
37
- * entry point) — a subflow id IS a path segment;
38
- * 2. the id passed to `addParallelForEach()` — the generated segment embeds
39
- * that id verbatim, so a parent id containing the marker would make
40
- * `parseBranchSegment` ambiguous. Refusing it keeps the parse rule simple
41
- * (split at the LAST marker) instead of clever.
42
- *
43
- * Stage ids elsewhere stay unvalidated: they occupy the `stageId` position,
44
- * never the `subflowPath` position, so they cannot collide with a segment.
45
- *
46
- * ## Marker choice (audited 2026-08-02)
47
- *
48
- * `~` (U+007E) appears in ZERO id literals across this repo's src, tests,
49
- * examples, docs and bench (852 distinct ids audited), and in zero ids across
50
- * the known consumer libraries. It is RFC-3986 *unreserved* (survives a URL
51
- * without percent-encoding — trace viewers put path segments in links) and is
52
- * NOT a regex metacharacter (unlike `^ ! * + ? [ ] |`), so a consumer building
53
- * a `RegExp` from a path segment cannot be silently surprised by it.
54
- */
55
- Object.defineProperty(exports, "__esModule", { value: true });
56
- exports.branchSegmentReservationMessage = exports.parseBranchSegment = exports.isBranchSegment = exports.hasBranchSegmentMarker = exports.buildBranchSegment = exports.BRANCH_SEGMENT_MARKER = void 0;
57
- /**
58
- * The reserved marker separating a parent stage id from a branch index in a
59
- * generated subflow path segment. Reserved from 9.14.0 forward — the builder
60
- * refuses it in user-authored subflow ids and in `addParallelForEach` ids.
61
- */
62
- exports.BRANCH_SEGMENT_MARKER = '~';
63
- /**
64
- * Build the generated subflow path segment for one `parallelForEach` branch.
65
- *
66
- * @param parentStageId The fan-out stage's id (already subflow-prefixed when
67
- * the chart is mounted inside another chart, so nested
68
- * composition works without special handling).
69
- * @param index The branch's position in the items array (0-based).
70
- *
71
- * @example
72
- * buildBranchSegment('review-chunks', 2) // 'review-chunks~2'
73
- * buildBranchSegment('outer/review-chunks', 2) // 'outer/review-chunks~2'
74
- */
75
- function buildBranchSegment(parentStageId, index) {
76
- return `${parentStageId}${exports.BRANCH_SEGMENT_MARKER}${index}`;
77
- }
78
- exports.buildBranchSegment = buildBranchSegment;
79
- /** True when `value` contains the reserved marker anywhere. */
80
- function hasBranchSegmentMarker(value) {
81
- return value.includes(exports.BRANCH_SEGMENT_MARKER);
82
- }
83
- exports.hasBranchSegmentMarker = hasBranchSegmentMarker;
84
- /**
85
- * True when `segment` is a generated branch segment — i.e. it splits at the
86
- * LAST marker into a non-empty parent id and a non-negative integer index.
87
- */
88
- function isBranchSegment(segment) {
89
- return parseBranchSegment(segment) !== undefined;
90
- }
91
- exports.isBranchSegment = isBranchSegment;
92
- /**
93
- * Decompose a generated branch segment back into its parts, or `undefined`
94
- * when `segment` is not one.
95
- *
96
- * Splitting at the LAST marker is unambiguous precisely because the builder
97
- * refuses the marker in the parent id (see the module doc) — no right-most
98
- * numeric-scanning heuristic is needed, and the round trip
99
- * `parseBranchSegment(buildBranchSegment(id, i))` is exact.
100
- *
101
- * @example
102
- * parseBranchSegment('review-chunks~2') // { parentStageId: 'review-chunks', index: 2 }
103
- * parseBranchSegment('sf-tools') // undefined
104
- */
105
- function parseBranchSegment(segment) {
106
- const markerIdx = segment.lastIndexOf(exports.BRANCH_SEGMENT_MARKER);
107
- if (markerIdx <= 0)
108
- return undefined; // absent, or nothing before it
109
- const indexPart = segment.slice(markerIdx + exports.BRANCH_SEGMENT_MARKER.length);
110
- if (indexPart === '' || !/^\d+$/.test(indexPart))
111
- return undefined;
112
- return { parentStageId: segment.slice(0, markerIdx), index: Number(indexPart) };
113
- }
114
- exports.parseBranchSegment = parseBranchSegment;
115
- /**
116
- * The sentence every build-time refusal of the marker shares. Kept here so the
117
- * reservation is explained identically at all nine refusal sites.
118
- */
119
- function branchSegmentReservationMessage(what, id) {
120
- return (`${what} '${id}' contains the reserved character '${exports.BRANCH_SEGMENT_MARKER}'. ` +
121
- `From 9.14.0 '${exports.BRANCH_SEGMENT_MARKER}' is reserved for the subflow path segments that ` +
122
- 'addParallelForEach() generates for its branches — allowing it here would let a hand-authored ' +
123
- 'id collide with a generated branch and silently mis-attribute its trace. Rename the id ' +
124
- '(a dash reads the same). See docs/design/execution-control.md.');
125
- }
126
- exports.branchSegmentReservationMessage = branchSegmentReservationMessage;
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmNoU2VnbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvZW5naW5lL2JyYW5jaFNlZ21lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0RHOzs7QUFFSDs7OztHQUlHO0FBQ1UsUUFBQSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFFekM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxhQUFxQixFQUFFLEtBQWE7SUFDckUsT0FBTyxHQUFHLGFBQWEsR0FBRyw2QkFBcUIsR0FBRyxLQUFLLEVBQUUsQ0FBQztBQUM1RCxDQUFDO0FBRkQsZ0RBRUM7QUFFRCwrREFBK0Q7QUFDL0QsU0FBZ0Isc0JBQXNCLENBQUMsS0FBYTtJQUNsRCxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsNkJBQXFCLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRkQsd0RBRUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixlQUFlLENBQUMsT0FBZTtJQUM3QyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUNuRCxDQUFDO0FBRkQsMENBRUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxPQUFlO0lBQ2hELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsNkJBQXFCLENBQUMsQ0FBQztJQUM3RCxJQUFJLFNBQVMsSUFBSSxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQywrQkFBK0I7SUFDckUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsNkJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUUsSUFBSSxTQUFTLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztBQUNsRixDQUFDO0FBTkQsZ0RBTUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQiwrQkFBK0IsQ0FBQyxJQUFZLEVBQUUsRUFBVTtJQUN0RSxPQUFPLENBQ0wsR0FBRyxJQUFJLEtBQUssRUFBRSxzQ0FBc0MsNkJBQXFCLEtBQUs7UUFDOUUsZ0JBQWdCLDZCQUFxQixtREFBbUQ7UUFDeEYsK0ZBQStGO1FBQy9GLHlGQUF5RjtRQUN6RixnRUFBZ0UsQ0FDakUsQ0FBQztBQUNKLENBQUM7QUFSRCwwRUFRQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYnJhbmNoU2VnbWVudCDigJQgdGhlIGdyYW1tYXIgZm9yIEdFTkVSQVRFRCBzdWJmbG93IHBhdGggc2VnbWVudHMuXG4gKlxuICogRGVzaWduOiBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZCAoRDEpLiBUaGlzIG1vZHVsZSBpcyB0aGUgT05FIHBsYWNlXG4gKiB0aGUgZ2VuZXJhdGVkLXNlZ21lbnQgcnVsZSBsaXZlczsgZXZlcnkgcHJvZHVjZXIgYW5kIGV2ZXJ5IHZhbGlkYXRvciBpbXBvcnRzXG4gKiBpdCByYXRoZXIgdGhhbiByZS1zcGVsbGluZyB0aGUgZm9ybWF0LlxuICpcbiAqICMjIFRoZSBsYXdcbiAqXG4gKiBBIGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCBleGVjdXRlcyBhcyBhIGdlbmVyYXRlZCBzdWJmbG93IHdob3NlIHBhdGhcbiAqIHNlZ21lbnQgaXMgYDxwYXJlbnRTdGFnZUlkPn48YnJhbmNoSW5kZXg+YC4gSXQgcmlkZXMgdGhlIHJ1bnRpbWVTdGFnZUlkXG4gKiBncmFtbWFyIHRoYXQgYWxyZWFkeSBleGlzdHMg4oCUIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIOKAlCB3aXRoXG4gKiBgI2AgYW5kIGAvYCBrZWVwaW5nIE9ORSBtZWFuaW5nIGVhY2g6XG4gKlxuICogICAgIHJldmlldy1jaHVua3N+Mi9zY29yZSMxNFxuICogICAgIOKUlOKUgOKUgCBzdWJmbG93UGF0aCDilIDilIDilJjilJRzdGFnZeKUmOKUlGlkeOKUmFxuICpcbiAqIFRoZXJlIGlzIGRlbGliZXJhdGVseSBOTyB0aGlyZCBkZWxpbWl0ZXIgY2xhc3MuIEV2ZXJ5IHBhcnNlciBpbiB0aGUgbGlicmFyeVxuICogc3BsaXRzIG9uIHRoZSBMQVNUIGAjYCB0aGVuIHRoZSBMQVNUIGAvYCwgc28gYSBnZW5lcmF0ZWQgc2VnbWVudCBpcyBvcGFxdWVcbiAqIHRvIGFsbCBvZiB0aGVtOiBgcGFyc2VSdW50aW1lU3RhZ2VJZGAsIGBzcGxpdFN0YWdlSWRgLCBgU2NvcGVGYWNhZGVgJ3NcbiAqIHN1YmZsb3ctcGF0aCBkZXJpdmF0aW9uLCBgSW5PdXRSZWNvcmRlcmAsIGBnZXRTdWJ0cmVlU25hcHNob3RgLFxuICogYERlZmVycmVkT2JzZXJ2ZXJUaWVyYCwgYW5kIHRoZSBzdHJ1Y3R1cmUgcmVjb3JkZXIgYWxsIHJlYWQgYSBnZW5lcmF0ZWRcbiAqIGJyYW5jaCBleGFjdGx5IHRoZSB3YXkgdGhleSByZWFkIGEgaGFuZC1hdXRob3JlZCBzdWJmbG93LiBUaGF0IGlzIHRoZSB3aG9sZVxuICogcG9pbnQgb2YgRDE6IGJyYW5jaCBjb21taXRzIHJlYWNoIGBjYXVzYWxDaGFpbmAgLyBgc2xpY2VGb3JLZXlgIC9cbiAqIGBmb3J3YXJkU2xpY2VGb3JLZXlgIHdpdGggWkVSTyBjaGFuZ2VzIHRvIHRob3NlIHJlYWRlcnMuXG4gKlxuICogIyMgV2h5IHRoZSBtYXJrZXIgaXMgcmVzZXJ2ZWRcbiAqXG4gKiBTdGFnZSBpZHMgYW5kIHN1YmZsb3cgaWRzIGFyZSB1c2VyLWF1dGhvcmVkIGZyZWUtZm9ybSBzdHJpbmdzLiBBIG1hcmtlciB0aGF0XG4gKiBjb3VsZCBhbHNvIGFwcGVhciBpbiBhIHVzZXIgaWQgd291bGQgbm90IGNyYXNoIOKAlCBpdCB3b3VsZCBzaWxlbnRseVxuICogbWlzLWF0dHJpYnV0ZSwgd2hpY2ggaXMgd29yc2UgKHRoZSBsb29wLXJlZiBwcmVjZWRlbnQgcHJvdmVzIHRoaXMgY29kZWJhc2VcbiAqIHRvbGVyYXRlcyBkZWxpYmVyYXRlIGlkLWNvbGxpc2lvbiBjbGFzc2VzKS4gU28gdGhlIG1hcmtlciBpcyBSRUZVU0VEIGF0XG4gKiBidWlsZCB0aW1lIGluIHRoZSB0d28gcG9zaXRpb25zIHRoYXQgY291bGQgY29sbGlkZSB3aXRoIGEgZ2VuZXJhdGVkIHNlZ21lbnQ6XG4gKlxuICogICAxLiB1c2VyLWF1dGhvcmVkIFNVQkZMT1cgaWRzIChldmVyeSBgYWRkU3ViRmxvd0NoYXJ0KmAgLyBgYWRkTGF6eVN1YkZsb3dDaGFydCpgXG4gKiAgICAgIGVudHJ5IHBvaW50KSDigJQgYSBzdWJmbG93IGlkIElTIGEgcGF0aCBzZWdtZW50O1xuICogICAyLiB0aGUgaWQgcGFzc2VkIHRvIGBhZGRQYXJhbGxlbEZvckVhY2goKWAg4oCUIHRoZSBnZW5lcmF0ZWQgc2VnbWVudCBlbWJlZHNcbiAqICAgICAgdGhhdCBpZCB2ZXJiYXRpbSwgc28gYSBwYXJlbnQgaWQgY29udGFpbmluZyB0aGUgbWFya2VyIHdvdWxkIG1ha2VcbiAqICAgICAgYHBhcnNlQnJhbmNoU2VnbWVudGAgYW1iaWd1b3VzLiBSZWZ1c2luZyBpdCBrZWVwcyB0aGUgcGFyc2UgcnVsZSBzaW1wbGVcbiAqICAgICAgKHNwbGl0IGF0IHRoZSBMQVNUIG1hcmtlcikgaW5zdGVhZCBvZiBjbGV2ZXIuXG4gKlxuICogU3RhZ2UgaWRzIGVsc2V3aGVyZSBzdGF5IHVudmFsaWRhdGVkOiB0aGV5IG9jY3VweSB0aGUgYHN0YWdlSWRgIHBvc2l0aW9uLFxuICogbmV2ZXIgdGhlIGBzdWJmbG93UGF0aGAgcG9zaXRpb24sIHNvIHRoZXkgY2Fubm90IGNvbGxpZGUgd2l0aCBhIHNlZ21lbnQuXG4gKlxuICogIyMgTWFya2VyIGNob2ljZSAoYXVkaXRlZCAyMDI2LTA4LTAyKVxuICpcbiAqIGB+YCAoVSswMDdFKSBhcHBlYXJzIGluIFpFUk8gaWQgbGl0ZXJhbHMgYWNyb3NzIHRoaXMgcmVwbydzIHNyYywgdGVzdHMsXG4gKiBleGFtcGxlcywgZG9jcyBhbmQgYmVuY2ggKDg1MiBkaXN0aW5jdCBpZHMgYXVkaXRlZCksIGFuZCBpbiB6ZXJvIGlkcyBhY3Jvc3NcbiAqIHRoZSBrbm93biBjb25zdW1lciBsaWJyYXJpZXMuIEl0IGlzIFJGQy0zOTg2ICp1bnJlc2VydmVkKiAoc3Vydml2ZXMgYSBVUkxcbiAqIHdpdGhvdXQgcGVyY2VudC1lbmNvZGluZyDigJQgdHJhY2Ugdmlld2VycyBwdXQgcGF0aCBzZWdtZW50cyBpbiBsaW5rcykgYW5kIGlzXG4gKiBOT1QgYSByZWdleCBtZXRhY2hhcmFjdGVyICh1bmxpa2UgYF4gISAqICsgPyBbIF0gfGApLCBzbyBhIGNvbnN1bWVyIGJ1aWxkaW5nXG4gKiBhIGBSZWdFeHBgIGZyb20gYSBwYXRoIHNlZ21lbnQgY2Fubm90IGJlIHNpbGVudGx5IHN1cnByaXNlZCBieSBpdC5cbiAqL1xuXG4vKipcbiAqIFRoZSByZXNlcnZlZCBtYXJrZXIgc2VwYXJhdGluZyBhIHBhcmVudCBzdGFnZSBpZCBmcm9tIGEgYnJhbmNoIGluZGV4IGluIGFcbiAqIGdlbmVyYXRlZCBzdWJmbG93IHBhdGggc2VnbWVudC4gUmVzZXJ2ZWQgZnJvbSA5LjE0LjAgZm9yd2FyZCDigJQgdGhlIGJ1aWxkZXJcbiAqIHJlZnVzZXMgaXQgaW4gdXNlci1hdXRob3JlZCBzdWJmbG93IGlkcyBhbmQgaW4gYGFkZFBhcmFsbGVsRm9yRWFjaGAgaWRzLlxuICovXG5leHBvcnQgY29uc3QgQlJBTkNIX1NFR01FTlRfTUFSS0VSID0gJ34nO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBnZW5lcmF0ZWQgc3ViZmxvdyBwYXRoIHNlZ21lbnQgZm9yIG9uZSBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2guXG4gKlxuICogQHBhcmFtIHBhcmVudFN0YWdlSWQgVGhlIGZhbi1vdXQgc3RhZ2UncyBpZCAoYWxyZWFkeSBzdWJmbG93LXByZWZpeGVkIHdoZW5cbiAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBjaGFydCBpcyBtb3VudGVkIGluc2lkZSBhbm90aGVyIGNoYXJ0LCBzbyBuZXN0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uIHdvcmtzIHdpdGhvdXQgc3BlY2lhbCBoYW5kbGluZykuXG4gKiBAcGFyYW0gaW5kZXggICAgICAgICBUaGUgYnJhbmNoJ3MgcG9zaXRpb24gaW4gdGhlIGl0ZW1zIGFycmF5ICgwLWJhc2VkKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYnVpbGRCcmFuY2hTZWdtZW50KCdyZXZpZXctY2h1bmtzJywgMikgICAgICAgIC8vICdyZXZpZXctY2h1bmtzfjInXG4gKiBidWlsZEJyYW5jaFNlZ21lbnQoJ291dGVyL3Jldmlldy1jaHVua3MnLCAyKSAgLy8gJ291dGVyL3Jldmlldy1jaHVua3N+MidcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQnJhbmNoU2VnbWVudChwYXJlbnRTdGFnZUlkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cGFyZW50U3RhZ2VJZH0ke0JSQU5DSF9TRUdNRU5UX01BUktFUn0ke2luZGV4fWA7XG59XG5cbi8qKiBUcnVlIHdoZW4gYHZhbHVlYCBjb250YWlucyB0aGUgcmVzZXJ2ZWQgbWFya2VyIGFueXdoZXJlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUuaW5jbHVkZXMoQlJBTkNIX1NFR01FTlRfTUFSS0VSKTtcbn1cblxuLyoqXG4gKiBUcnVlIHdoZW4gYHNlZ21lbnRgIGlzIGEgZ2VuZXJhdGVkIGJyYW5jaCBzZWdtZW50IOKAlCBpLmUuIGl0IHNwbGl0cyBhdCB0aGVcbiAqIExBU1QgbWFya2VyIGludG8gYSBub24tZW1wdHkgcGFyZW50IGlkIGFuZCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCcmFuY2hTZWdtZW50KHNlZ21lbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFyc2VCcmFuY2hTZWdtZW50KHNlZ21lbnQpICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVjb21wb3NlIGEgZ2VuZXJhdGVkIGJyYW5jaCBzZWdtZW50IGJhY2sgaW50byBpdHMgcGFydHMsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGBzZWdtZW50YCBpcyBub3Qgb25lLlxuICpcbiAqIFNwbGl0dGluZyBhdCB0aGUgTEFTVCBtYXJrZXIgaXMgdW5hbWJpZ3VvdXMgcHJlY2lzZWx5IGJlY2F1c2UgdGhlIGJ1aWxkZXJcbiAqIHJlZnVzZXMgdGhlIG1hcmtlciBpbiB0aGUgcGFyZW50IGlkIChzZWUgdGhlIG1vZHVsZSBkb2MpIOKAlCBubyByaWdodC1tb3N0XG4gKiBudW1lcmljLXNjYW5uaW5nIGhldXJpc3RpYyBpcyBuZWVkZWQsIGFuZCB0aGUgcm91bmQgdHJpcFxuICogYHBhcnNlQnJhbmNoU2VnbWVudChidWlsZEJyYW5jaFNlZ21lbnQoaWQsIGkpKWAgaXMgZXhhY3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlQnJhbmNoU2VnbWVudCgncmV2aWV3LWNodW5rc34yJykgIC8vIHsgcGFyZW50U3RhZ2VJZDogJ3Jldmlldy1jaHVua3MnLCBpbmRleDogMiB9XG4gKiBwYXJzZUJyYW5jaFNlZ21lbnQoJ3NmLXRvb2xzJykgICAgICAgICAvLyB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnJhbmNoU2VnbWVudChzZWdtZW50OiBzdHJpbmcpOiB7IHBhcmVudFN0YWdlSWQ6IHN0cmluZzsgaW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWFya2VySWR4ID0gc2VnbWVudC5sYXN0SW5kZXhPZihCUkFOQ0hfU0VHTUVOVF9NQVJLRVIpO1xuICBpZiAobWFya2VySWR4IDw9IDApIHJldHVybiB1bmRlZmluZWQ7IC8vIGFic2VudCwgb3Igbm90aGluZyBiZWZvcmUgaXRcbiAgY29uc3QgaW5kZXhQYXJ0ID0gc2VnbWVudC5zbGljZShtYXJrZXJJZHggKyBCUkFOQ0hfU0VHTUVOVF9NQVJLRVIubGVuZ3RoKTtcbiAgaWYgKGluZGV4UGFydCA9PT0gJycgfHwgIS9eXFxkKyQvLnRlc3QoaW5kZXhQYXJ0KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgcGFyZW50U3RhZ2VJZDogc2VnbWVudC5zbGljZSgwLCBtYXJrZXJJZHgpLCBpbmRleDogTnVtYmVyKGluZGV4UGFydCkgfTtcbn1cblxuLyoqXG4gKiBUaGUgc2VudGVuY2UgZXZlcnkgYnVpbGQtdGltZSByZWZ1c2FsIG9mIHRoZSBtYXJrZXIgc2hhcmVzLiBLZXB0IGhlcmUgc28gdGhlXG4gKiByZXNlcnZhdGlvbiBpcyBleHBsYWluZWQgaWRlbnRpY2FsbHkgYXQgYWxsIG5pbmUgcmVmdXNhbCBzaXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJyYW5jaFNlZ21lbnRSZXNlcnZhdGlvbk1lc3NhZ2Uod2hhdDogc3RyaW5nLCBpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBgJHt3aGF0fSAnJHtpZH0nIGNvbnRhaW5zIHRoZSByZXNlcnZlZCBjaGFyYWN0ZXIgJyR7QlJBTkNIX1NFR01FTlRfTUFSS0VSfScuIGAgK1xuICAgIGBGcm9tIDkuMTQuMCAnJHtCUkFOQ0hfU0VHTUVOVF9NQVJLRVJ9JyBpcyByZXNlcnZlZCBmb3IgdGhlIHN1YmZsb3cgcGF0aCBzZWdtZW50cyB0aGF0IGAgK1xuICAgICdhZGRQYXJhbGxlbEZvckVhY2goKSBnZW5lcmF0ZXMgZm9yIGl0cyBicmFuY2hlcyDigJQgYWxsb3dpbmcgaXQgaGVyZSB3b3VsZCBsZXQgYSBoYW5kLWF1dGhvcmVkICcgK1xuICAgICdpZCBjb2xsaWRlIHdpdGggYSBnZW5lcmF0ZWQgYnJhbmNoIGFuZCBzaWxlbnRseSBtaXMtYXR0cmlidXRlIGl0cyB0cmFjZS4gUmVuYW1lIHRoZSBpZCAnICtcbiAgICAnKGEgZGFzaCByZWFkcyB0aGUgc2FtZSkuIFNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC4nXG4gICk7XG59XG4iXX0=
@@ -1,126 +0,0 @@
1
- "use strict";
2
- /**
3
- * runtimeStageId — unique identifier for each execution step during traversal.
4
- *
5
- * Format: [subflowPath/]stageId#executionIndex
6
- *
7
- * Components:
8
- * stageId — stable node ID from the builder ('call-llm', 'seed')
9
- * executionIndex — monotonic counter incremented per stage execution (0, 1, 2...)
10
- * subflowPath — optional path for subflow stages ('sf-tools', 'sf-outer/sf-inner')
11
- *
12
- * Properties:
13
- * - Unique within a run (executionIndex never repeats)
14
- * - Execution-ordered (sort by executionIndex = execution order)
15
- * - Human-readable ('sf-tools/execute-tool-calls#8')
16
- * - Parseable (split on '#' for stageId and index, split stageId on '/' for subflow path)
17
- *
18
- * Naming-collision warning
19
- * ────────────────────────
20
- * The parsed-output `.stageId` field below is the LOCAL form (segment
21
- * after the last '/'). This is NOT the same as `spec.id` / `node.id`
22
- * for subflow-nested stages, which carry the FULL prefixed form
23
- * (`'sf-tools/execute-tool-calls'`). To compare safely, use
24
- * `splitStageId(spec.id)` to decompose the prefixed form the same
25
- * way `parseRuntimeStageId` decomposes a runtimeStageId.
26
- *
27
- * @example
28
- * ```
29
- * buildRuntimeStageId('call-llm', 5) // 'call-llm#5'
30
- * buildRuntimeStageId('execute-tool-calls', 8, 'sf-tools') // 'sf-tools/execute-tool-calls#8'
31
- * buildRuntimeStageId('validate', 3, 'sf-outer/sf-inner') // 'sf-outer/sf-inner/validate#3'
32
- * ```
33
- */
34
- Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.createExecutionCounter = exports.splitStageId = exports.parseRuntimeStageId = exports.buildRuntimeStageId = void 0;
36
- /**
37
- * Build a runtimeStageId from its components.
38
- *
39
- * Note: The traverser does NOT use the subflowPath parameter — node.id already
40
- * includes the subflow prefix from the builder. This parameter exists for external
41
- * consumers constructing IDs from parsed components (round-trip via parseRuntimeStageId).
42
- */
43
- function buildRuntimeStageId(stageId, executionIndex, subflowPath) {
44
- const prefix = subflowPath ? `${subflowPath}/` : '';
45
- return `${prefix}${stageId}#${executionIndex}`;
46
- }
47
- exports.buildRuntimeStageId = buildRuntimeStageId;
48
- /**
49
- * Parse a runtimeStageId into its components.
50
- *
51
- * IMPORTANT — naming collision: the returned `stageId` is the LOCAL
52
- * form (the segment between the last '/' and the '#'). This is NOT
53
- * the same as `spec.id` or `node.id` for subflow-nested stages,
54
- * which contain the FULL prefixed form.
55
- *
56
- * parseRuntimeStageId('sf-tools/execute-tool-calls#8').stageId
57
- * // → 'execute-tool-calls' (LOCAL)
58
- *
59
- * node.id // (post-mount, in a spec that contains subflows)
60
- * // → 'sf-tools/execute-tool-calls' (FULL prefixed)
61
- *
62
- * To compare these two safely, use `splitStageId(node.id)` to get
63
- * the local form, OR reconstruct the full form via
64
- * `(subflowPath ? subflowPath + '/' : '') + stageId`.
65
- */
66
- function parseRuntimeStageId(runtimeStageId) {
67
- const hashIdx = runtimeStageId.lastIndexOf('#');
68
- if (hashIdx === -1) {
69
- return { stageId: runtimeStageId, executionIndex: 0, subflowPath: undefined };
70
- }
71
- const beforeHash = runtimeStageId.slice(0, hashIdx);
72
- const executionIndex = parseInt(runtimeStageId.slice(hashIdx + 1), 10);
73
- const lastSlash = beforeHash.lastIndexOf('/');
74
- if (lastSlash === -1) {
75
- return { stageId: beforeHash, executionIndex, subflowPath: undefined };
76
- }
77
- return {
78
- stageId: beforeHash.slice(lastSlash + 1),
79
- executionIndex,
80
- subflowPath: beforeHash.slice(0, lastSlash),
81
- };
82
- }
83
- exports.parseRuntimeStageId = parseRuntimeStageId;
84
- /**
85
- * Decompose a (possibly prefixed) stage id into its components.
86
- *
87
- * Use this when you have an id WITHOUT the `#N` execution suffix and
88
- * need the local stage name and/or the subflow path. Common sources
89
- * of such ids:
90
- * - `spec.id` (post-mount the id includes any subflow prefix)
91
- * - `CommitBundle.stageId` (post-mount id)
92
- * - `node.id` from xyflow nodes built off the spec
93
- * - the segment of `runtimeStageId` BEFORE the `#` (use
94
- * `parseRuntimeStageId` directly for full runtimeStageId strings)
95
- *
96
- * Mirrors the decomposition `parseRuntimeStageId` performs on the
97
- * stageId portion of a runtimeStageId, so the two helpers stay in
98
- * lockstep on naming and behavior.
99
- *
100
- * @example
101
- * splitStageId('sf-tools/execute-tool-calls')
102
- * // → { localStageId: 'execute-tool-calls', subflowPath: 'sf-tools' }
103
- *
104
- * splitStageId('execute-tool-calls')
105
- * // → { localStageId: 'execute-tool-calls', subflowPath: undefined }
106
- *
107
- * splitStageId('sf-outer/sf-inner/validate')
108
- * // → { localStageId: 'validate', subflowPath: 'sf-outer/sf-inner' }
109
- */
110
- function splitStageId(prefixedStageId) {
111
- const lastSlash = prefixedStageId.lastIndexOf('/');
112
- if (lastSlash === -1) {
113
- return { localStageId: prefixedStageId, subflowPath: undefined };
114
- }
115
- return {
116
- localStageId: prefixedStageId.slice(lastSlash + 1),
117
- subflowPath: prefixedStageId.slice(0, lastSlash),
118
- };
119
- }
120
- exports.splitStageId = splitStageId;
121
- /** Create a new execution counter starting at 0. */
122
- function createExecutionCounter() {
123
- return { value: 0 };
124
- }
125
- exports.createExecutionCounter = createExecutionCounter;
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZVN0YWdlSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7OztBQUVIOzs7Ozs7R0FNRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLE9BQWUsRUFBRSxjQUFzQixFQUFFLFdBQW9CO0lBQy9GLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BELE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO0FBQ2pELENBQUM7QUFIRCxrREFHQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLGNBQXNCO0lBS3hELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuQixPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUN4QyxjQUFjO1FBQ2QsV0FBVyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztLQUM1QyxDQUFDO0FBQ0osQ0FBQztBQXZCRCxrREF1QkM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILFNBQWdCLFlBQVksQ0FBQyxlQUF1QjtJQUlsRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFDRCxPQUFPO1FBQ0wsWUFBWSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsRCxXQUFXLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBWkQsb0NBWUM7QUFXRCxvREFBb0Q7QUFDcEQsU0FBZ0Isc0JBQXNCO0lBQ3BDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDdEIsQ0FBQztBQUZELHdEQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBydW50aW1lU3RhZ2VJZCDigJQgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggZXhlY3V0aW9uIHN0ZXAgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleFxuICpcbiAqIENvbXBvbmVudHM6XG4gKiAgIHN0YWdlSWQgICAgICAgIOKAlCBzdGFibGUgbm9kZSBJRCBmcm9tIHRoZSBidWlsZGVyICgnY2FsbC1sbG0nLCAnc2VlZCcpXG4gKiAgIGV4ZWN1dGlvbkluZGV4IOKAlCBtb25vdG9uaWMgY291bnRlciBpbmNyZW1lbnRlZCBwZXIgc3RhZ2UgZXhlY3V0aW9uICgwLCAxLCAyLi4uKVxuICogICBzdWJmbG93UGF0aCAgICDigJQgb3B0aW9uYWwgcGF0aCBmb3Igc3ViZmxvdyBzdGFnZXMgKCdzZi10b29scycsICdzZi1vdXRlci9zZi1pbm5lcicpXG4gKlxuICogUHJvcGVydGllczpcbiAqICAgLSBVbmlxdWUgd2l0aGluIGEgcnVuIChleGVjdXRpb25JbmRleCBuZXZlciByZXBlYXRzKVxuICogICAtIEV4ZWN1dGlvbi1vcmRlcmVkIChzb3J0IGJ5IGV4ZWN1dGlvbkluZGV4ID0gZXhlY3V0aW9uIG9yZGVyKVxuICogICAtIEh1bWFuLXJlYWRhYmxlICgnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzIzgnKVxuICogICAtIFBhcnNlYWJsZSAoc3BsaXQgb24gJyMnIGZvciBzdGFnZUlkIGFuZCBpbmRleCwgc3BsaXQgc3RhZ2VJZCBvbiAnLycgZm9yIHN1YmZsb3cgcGF0aClcbiAqXG4gKiBOYW1pbmctY29sbGlzaW9uIHdhcm5pbmdcbiAqIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogICBUaGUgcGFyc2VkLW91dHB1dCBgLnN0YWdlSWRgIGZpZWxkIGJlbG93IGlzIHRoZSBMT0NBTCBmb3JtIChzZWdtZW50XG4gKiAgIGFmdGVyIHRoZSBsYXN0ICcvJykuIFRoaXMgaXMgTk9UIHRoZSBzYW1lIGFzIGBzcGVjLmlkYCAvIGBub2RlLmlkYFxuICogICBmb3Igc3ViZmxvdy1uZXN0ZWQgc3RhZ2VzLCB3aGljaCBjYXJyeSB0aGUgRlVMTCBwcmVmaXhlZCBmb3JtXG4gKiAgIChgJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscydgKS4gVG8gY29tcGFyZSBzYWZlbHksIHVzZVxuICogICBgc3BsaXRTdGFnZUlkKHNwZWMuaWQpYCB0byBkZWNvbXBvc2UgdGhlIHByZWZpeGVkIGZvcm0gdGhlIHNhbWVcbiAqICAgd2F5IGBwYXJzZVJ1bnRpbWVTdGFnZUlkYCBkZWNvbXBvc2VzIGEgcnVudGltZVN0YWdlSWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogYnVpbGRSdW50aW1lU3RhZ2VJZCgnY2FsbC1sbG0nLCA1KSAgICAgICAgICAgICAgICAgICAgLy8gJ2NhbGwtbGxtIzUnXG4gKiBidWlsZFJ1bnRpbWVTdGFnZUlkKCdleGVjdXRlLXRvb2wtY2FsbHMnLCA4LCAnc2YtdG9vbHMnKSAvLyAnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzIzgnXG4gKiBidWlsZFJ1bnRpbWVTdGFnZUlkKCd2YWxpZGF0ZScsIDMsICdzZi1vdXRlci9zZi1pbm5lcicpICAvLyAnc2Ytb3V0ZXIvc2YtaW5uZXIvdmFsaWRhdGUjMydcbiAqIGBgYFxuICovXG5cbi8qKlxuICogQnVpbGQgYSBydW50aW1lU3RhZ2VJZCBmcm9tIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIE5vdGU6IFRoZSB0cmF2ZXJzZXIgZG9lcyBOT1QgdXNlIHRoZSBzdWJmbG93UGF0aCBwYXJhbWV0ZXIg4oCUIG5vZGUuaWQgYWxyZWFkeVxuICogaW5jbHVkZXMgdGhlIHN1YmZsb3cgcHJlZml4IGZyb20gdGhlIGJ1aWxkZXIuIFRoaXMgcGFyYW1ldGVyIGV4aXN0cyBmb3IgZXh0ZXJuYWxcbiAqIGNvbnN1bWVycyBjb25zdHJ1Y3RpbmcgSURzIGZyb20gcGFyc2VkIGNvbXBvbmVudHMgKHJvdW5kLXRyaXAgdmlhIHBhcnNlUnVudGltZVN0YWdlSWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSdW50aW1lU3RhZ2VJZChzdGFnZUlkOiBzdHJpbmcsIGV4ZWN1dGlvbkluZGV4OiBudW1iZXIsIHN1YmZsb3dQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcHJlZml4ID0gc3ViZmxvd1BhdGggPyBgJHtzdWJmbG93UGF0aH0vYCA6ICcnO1xuICByZXR1cm4gYCR7cHJlZml4fSR7c3RhZ2VJZH0jJHtleGVjdXRpb25JbmRleH1gO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgcnVudGltZVN0YWdlSWQgaW50byBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBJTVBPUlRBTlQg4oCUIG5hbWluZyBjb2xsaXNpb246IHRoZSByZXR1cm5lZCBgc3RhZ2VJZGAgaXMgdGhlIExPQ0FMXG4gKiBmb3JtICh0aGUgc2VnbWVudCBiZXR3ZWVuIHRoZSBsYXN0ICcvJyBhbmQgdGhlICcjJykuIFRoaXMgaXMgTk9UXG4gKiB0aGUgc2FtZSBhcyBgc3BlYy5pZGAgb3IgYG5vZGUuaWRgIGZvciBzdWJmbG93LW5lc3RlZCBzdGFnZXMsXG4gKiB3aGljaCBjb250YWluIHRoZSBGVUxMIHByZWZpeGVkIGZvcm0uXG4gKlxuICogICBwYXJzZVJ1bnRpbWVTdGFnZUlkKCdzZi10b29scy9leGVjdXRlLXRvb2wtY2FsbHMjOCcpLnN0YWdlSWRcbiAqICAgLy8g4oaSICdleGVjdXRlLXRvb2wtY2FsbHMnICAgKExPQ0FMKVxuICpcbiAqICAgbm9kZS5pZCAgLy8gKHBvc3QtbW91bnQsIGluIGEgc3BlYyB0aGF0IGNvbnRhaW5zIHN1YmZsb3dzKVxuICogICAvLyDihpIgJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscycgICAoRlVMTCBwcmVmaXhlZClcbiAqXG4gKiBUbyBjb21wYXJlIHRoZXNlIHR3byBzYWZlbHksIHVzZSBgc3BsaXRTdGFnZUlkKG5vZGUuaWQpYCB0byBnZXRcbiAqIHRoZSBsb2NhbCBmb3JtLCBPUiByZWNvbnN0cnVjdCB0aGUgZnVsbCBmb3JtIHZpYVxuICogYChzdWJmbG93UGF0aCA/IHN1YmZsb3dQYXRoICsgJy8nIDogJycpICsgc3RhZ2VJZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJ1bnRpbWVTdGFnZUlkKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiB7XG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgZXhlY3V0aW9uSW5kZXg6IG51bWJlcjtcbiAgc3ViZmxvd1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0ge1xuICBjb25zdCBoYXNoSWR4ID0gcnVudGltZVN0YWdlSWQubGFzdEluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2hJZHggPT09IC0xKSB7XG4gICAgcmV0dXJuIHsgc3RhZ2VJZDogcnVudGltZVN0YWdlSWQsIGV4ZWN1dGlvbkluZGV4OiAwLCBzdWJmbG93UGF0aDogdW5kZWZpbmVkIH07XG4gIH1cblxuICBjb25zdCBiZWZvcmVIYXNoID0gcnVudGltZVN0YWdlSWQuc2xpY2UoMCwgaGFzaElkeCk7XG4gIGNvbnN0IGV4ZWN1dGlvbkluZGV4ID0gcGFyc2VJbnQocnVudGltZVN0YWdlSWQuc2xpY2UoaGFzaElkeCArIDEpLCAxMCk7XG5cbiAgY29uc3QgbGFzdFNsYXNoID0gYmVmb3JlSGFzaC5sYXN0SW5kZXhPZignLycpO1xuICBpZiAobGFzdFNsYXNoID09PSAtMSkge1xuICAgIHJldHVybiB7IHN0YWdlSWQ6IGJlZm9yZUhhc2gsIGV4ZWN1dGlvbkluZGV4LCBzdWJmbG93UGF0aDogdW5kZWZpbmVkIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YWdlSWQ6IGJlZm9yZUhhc2guc2xpY2UobGFzdFNsYXNoICsgMSksXG4gICAgZXhlY3V0aW9uSW5kZXgsXG4gICAgc3ViZmxvd1BhdGg6IGJlZm9yZUhhc2guc2xpY2UoMCwgbGFzdFNsYXNoKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNvbXBvc2UgYSAocG9zc2libHkgcHJlZml4ZWQpIHN0YWdlIGlkIGludG8gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogVXNlIHRoaXMgd2hlbiB5b3UgaGF2ZSBhbiBpZCBXSVRIT1VUIHRoZSBgI05gIGV4ZWN1dGlvbiBzdWZmaXggYW5kXG4gKiBuZWVkIHRoZSBsb2NhbCBzdGFnZSBuYW1lIGFuZC9vciB0aGUgc3ViZmxvdyBwYXRoLiBDb21tb24gc291cmNlc1xuICogb2Ygc3VjaCBpZHM6XG4gKiAgIC0gYHNwZWMuaWRgIChwb3N0LW1vdW50IHRoZSBpZCBpbmNsdWRlcyBhbnkgc3ViZmxvdyBwcmVmaXgpXG4gKiAgIC0gYENvbW1pdEJ1bmRsZS5zdGFnZUlkYCAocG9zdC1tb3VudCBpZClcbiAqICAgLSBgbm9kZS5pZGAgZnJvbSB4eWZsb3cgbm9kZXMgYnVpbHQgb2ZmIHRoZSBzcGVjXG4gKiAgIC0gdGhlIHNlZ21lbnQgb2YgYHJ1bnRpbWVTdGFnZUlkYCBCRUZPUkUgdGhlIGAjYCAodXNlXG4gKiAgICAgYHBhcnNlUnVudGltZVN0YWdlSWRgIGRpcmVjdGx5IGZvciBmdWxsIHJ1bnRpbWVTdGFnZUlkIHN0cmluZ3MpXG4gKlxuICogTWlycm9ycyB0aGUgZGVjb21wb3NpdGlvbiBgcGFyc2VSdW50aW1lU3RhZ2VJZGAgcGVyZm9ybXMgb24gdGhlXG4gKiBzdGFnZUlkIHBvcnRpb24gb2YgYSBydW50aW1lU3RhZ2VJZCwgc28gdGhlIHR3byBoZWxwZXJzIHN0YXkgaW5cbiAqIGxvY2tzdGVwIG9uIG5hbWluZyBhbmQgYmVoYXZpb3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNwbGl0U3RhZ2VJZCgnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzJylcbiAqIC8vIOKGkiB7IGxvY2FsU3RhZ2VJZDogJ2V4ZWN1dGUtdG9vbC1jYWxscycsIHN1YmZsb3dQYXRoOiAnc2YtdG9vbHMnIH1cbiAqXG4gKiBzcGxpdFN0YWdlSWQoJ2V4ZWN1dGUtdG9vbC1jYWxscycpXG4gKiAvLyDihpIgeyBsb2NhbFN0YWdlSWQ6ICdleGVjdXRlLXRvb2wtY2FsbHMnLCBzdWJmbG93UGF0aDogdW5kZWZpbmVkIH1cbiAqXG4gKiBzcGxpdFN0YWdlSWQoJ3NmLW91dGVyL3NmLWlubmVyL3ZhbGlkYXRlJylcbiAqIC8vIOKGkiB7IGxvY2FsU3RhZ2VJZDogJ3ZhbGlkYXRlJywgc3ViZmxvd1BhdGg6ICdzZi1vdXRlci9zZi1pbm5lcicgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdGFnZUlkKHByZWZpeGVkU3RhZ2VJZDogc3RyaW5nKToge1xuICBsb2NhbFN0YWdlSWQ6IHN0cmluZztcbiAgc3ViZmxvd1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0ge1xuICBjb25zdCBsYXN0U2xhc2ggPSBwcmVmaXhlZFN0YWdlSWQubGFzdEluZGV4T2YoJy8nKTtcbiAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBsb2NhbFN0YWdlSWQ6IHByZWZpeGVkU3RhZ2VJZCwgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbG9jYWxTdGFnZUlkOiBwcmVmaXhlZFN0YWdlSWQuc2xpY2UobGFzdFNsYXNoICsgMSksXG4gICAgc3ViZmxvd1BhdGg6IHByZWZpeGVkU3RhZ2VJZC5zbGljZSgwLCBsYXN0U2xhc2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBtdXRhYmxlIGNvdW50ZXIgZm9yIGV4ZWN1dGlvbiBpbmRleC5cbiAqIFBhc3NlZCBieSByZWZlcmVuY2UgdG8gY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIHRoZXlcbiAqIGNvbnRpbnVlIHRoZSBnbG9iYWwgbnVtYmVyaW5nIGluc3RlYWQgb2YgcmVzdGFydGluZyBhdCAwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50ZXIge1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKiogQ3JlYXRlIGEgbmV3IGV4ZWN1dGlvbiBjb3VudGVyIHN0YXJ0aW5nIGF0IDAuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ291bnRlcigpOiBFeGVjdXRpb25Db3VudGVyIHtcbiAgcmV0dXJuIHsgdmFsdWU6IDAgfTtcbn1cbiJdfQ==
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.invokeRecorderHook = void 0;
4
- /**
5
- * @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
6
- * and then goes away; import `invokeRecorderHook` from `lib/capture/invokeHook.ts`.
7
- *
8
- * It imported nothing but sat inside `recorder/`, so `scope/` (the inline tier) had to
9
- * import `recorder/` for it — one edge of the memory ⇄ scope ⇄ recorder cycle.
10
- */
11
- var invokeHook_js_1 = require("../capture/invokeHook.js");
12
- Object.defineProperty(exports, "invokeRecorderHook", { enumerable: true, get: function () { return invokeHook_js_1.invokeRecorderHook; } });
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2tlSG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvaW52b2tlSG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7O0dBTUc7QUFDSCwwREFBOEQ7QUFBckQsbUhBQUEsa0JBQWtCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXByZWNhdGVkIE1vdmVkIChGMCwgdGhlIGZlbmNlIGFuZCB0aGUgbGVhdmVzKS4gVGhpcyBwYXRoIHJlLWV4cG9ydHMgZm9yIG9uZSBtaW5vclxuICogYW5kIHRoZW4gZ29lcyBhd2F5OyBpbXBvcnQgYGludm9rZVJlY29yZGVySG9va2AgZnJvbSBgbGliL2NhcHR1cmUvaW52b2tlSG9vay50c2AuXG4gKlxuICogSXQgaW1wb3J0ZWQgbm90aGluZyBidXQgc2F0IGluc2lkZSBgcmVjb3JkZXIvYCwgc28gYHNjb3BlL2AgKHRoZSBpbmxpbmUgdGllcikgaGFkIHRvXG4gKiBpbXBvcnQgYHJlY29yZGVyL2AgZm9yIGl0IOKAlCBvbmUgZWRnZSBvZiB0aGUgbWVtb3J5IOKHhCBzY29wZSDih4QgcmVjb3JkZXIgY3ljbGUuXG4gKi9cbmV4cG9ydCB7IGludm9rZVJlY29yZGVySG9vayB9IGZyb20gJy4uL2NhcHR1cmUvaW52b2tlSG9vay5qcyc7XG4iXX0=
@@ -1,103 +0,0 @@
1
- /**
2
- * runtimeStageId — unique identifier for each execution step during traversal.
3
- *
4
- * Format: [subflowPath/]stageId#executionIndex
5
- *
6
- * Components:
7
- * stageId — stable node ID from the builder ('call-llm', 'seed')
8
- * executionIndex — monotonic counter incremented per stage execution (0, 1, 2...)
9
- * subflowPath — optional path for subflow stages ('sf-tools', 'sf-outer/sf-inner')
10
- *
11
- * Properties:
12
- * - Unique within a run (executionIndex never repeats)
13
- * - Execution-ordered (sort by executionIndex = execution order)
14
- * - Human-readable ('sf-tools/execute-tool-calls#8')
15
- * - Parseable (split on '#' for stageId and index, split stageId on '/' for subflow path)
16
- *
17
- * Naming-collision warning
18
- * ────────────────────────
19
- * The parsed-output `.stageId` field below is the LOCAL form (segment
20
- * after the last '/'). This is NOT the same as `spec.id` / `node.id`
21
- * for subflow-nested stages, which carry the FULL prefixed form
22
- * (`'sf-tools/execute-tool-calls'`). To compare safely, use
23
- * `splitStageId(spec.id)` to decompose the prefixed form the same
24
- * way `parseRuntimeStageId` decomposes a runtimeStageId.
25
- *
26
- * @example
27
- * ```
28
- * buildRuntimeStageId('call-llm', 5) // 'call-llm#5'
29
- * buildRuntimeStageId('execute-tool-calls', 8, 'sf-tools') // 'sf-tools/execute-tool-calls#8'
30
- * buildRuntimeStageId('validate', 3, 'sf-outer/sf-inner') // 'sf-outer/sf-inner/validate#3'
31
- * ```
32
- */
33
- /**
34
- * Build a runtimeStageId from its components.
35
- *
36
- * Note: The traverser does NOT use the subflowPath parameter — node.id already
37
- * includes the subflow prefix from the builder. This parameter exists for external
38
- * consumers constructing IDs from parsed components (round-trip via parseRuntimeStageId).
39
- */
40
- export declare function buildRuntimeStageId(stageId: string, executionIndex: number, subflowPath?: string): string;
41
- /**
42
- * Parse a runtimeStageId into its components.
43
- *
44
- * IMPORTANT — naming collision: the returned `stageId` is the LOCAL
45
- * form (the segment between the last '/' and the '#'). This is NOT
46
- * the same as `spec.id` or `node.id` for subflow-nested stages,
47
- * which contain the FULL prefixed form.
48
- *
49
- * parseRuntimeStageId('sf-tools/execute-tool-calls#8').stageId
50
- * // → 'execute-tool-calls' (LOCAL)
51
- *
52
- * node.id // (post-mount, in a spec that contains subflows)
53
- * // → 'sf-tools/execute-tool-calls' (FULL prefixed)
54
- *
55
- * To compare these two safely, use `splitStageId(node.id)` to get
56
- * the local form, OR reconstruct the full form via
57
- * `(subflowPath ? subflowPath + '/' : '') + stageId`.
58
- */
59
- export declare function parseRuntimeStageId(runtimeStageId: string): {
60
- stageId: string;
61
- executionIndex: number;
62
- subflowPath: string | undefined;
63
- };
64
- /**
65
- * Decompose a (possibly prefixed) stage id into its components.
66
- *
67
- * Use this when you have an id WITHOUT the `#N` execution suffix and
68
- * need the local stage name and/or the subflow path. Common sources
69
- * of such ids:
70
- * - `spec.id` (post-mount the id includes any subflow prefix)
71
- * - `CommitBundle.stageId` (post-mount id)
72
- * - `node.id` from xyflow nodes built off the spec
73
- * - the segment of `runtimeStageId` BEFORE the `#` (use
74
- * `parseRuntimeStageId` directly for full runtimeStageId strings)
75
- *
76
- * Mirrors the decomposition `parseRuntimeStageId` performs on the
77
- * stageId portion of a runtimeStageId, so the two helpers stay in
78
- * lockstep on naming and behavior.
79
- *
80
- * @example
81
- * splitStageId('sf-tools/execute-tool-calls')
82
- * // → { localStageId: 'execute-tool-calls', subflowPath: 'sf-tools' }
83
- *
84
- * splitStageId('execute-tool-calls')
85
- * // → { localStageId: 'execute-tool-calls', subflowPath: undefined }
86
- *
87
- * splitStageId('sf-outer/sf-inner/validate')
88
- * // → { localStageId: 'validate', subflowPath: 'sf-outer/sf-inner' }
89
- */
90
- export declare function splitStageId(prefixedStageId: string): {
91
- localStageId: string;
92
- subflowPath: string | undefined;
93
- };
94
- /**
95
- * Shared mutable counter for execution index.
96
- * Passed by reference to child traversers (subflows) so they
97
- * continue the global numbering instead of restarting at 0.
98
- */
99
- export interface ExecutionCounter {
100
- value: number;
101
- }
102
- /** Create a new execution counter starting at 0. */
103
- export declare function createExecutionCounter(): ExecutionCounter;
@@ -1,8 +0,0 @@
1
- /**
2
- * @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
3
- * and then goes away; import `invokeRecorderHook` from `lib/capture/invokeHook.ts`.
4
- *
5
- * It imported nothing but sat inside `recorder/`, so `scope/` (the inline tier) had to
6
- * import `recorder/` for it — one edge of the memory ⇄ scope ⇄ recorder cycle.
7
- */
8
- export { invokeRecorderHook } from '../capture/invokeHook.js';
File without changes