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.
- package/CLAUDE.md +4 -4
- package/dist/advanced.js +2 -2
- package/dist/esm/advanced.d.ts +2 -2
- package/dist/esm/advanced.js +2 -2
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +5 -34
- package/dist/esm/lib/builder/FlowChartBuilder.js +236 -375
- package/dist/esm/lib/engine/graph/prefixNodeTree.d.ts +26 -0
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +40 -0
- package/dist/esm/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
- package/dist/esm/lib/engine/handlers/ParallelForEachHandler.js +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +11 -2
- package/dist/esm/lib/engine/handlers/StageRunner.js +17 -3
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +3 -32
- package/dist/esm/lib/engine/index.d.ts +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
- package/dist/esm/lib/engine/narrative/types.d.ts +26 -10
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +68 -86
- package/dist/esm/lib/engine/traversalContext.d.ts +65 -0
- package/dist/esm/lib/engine/traversalContext.js +83 -0
- package/dist/esm/lib/engine/types.d.ts +1 -3
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +3 -2
- package/dist/esm/lib/ids/branchSegment.js +119 -0
- package/dist/esm/lib/ids/runtimeStageId.d.ts +191 -0
- package/dist/esm/lib/ids/runtimeStageId.js +225 -0
- package/dist/esm/lib/memory/StageContext.d.ts +1 -17
- package/dist/esm/lib/memory/StageContext.js +2 -37
- package/dist/esm/lib/memory/commitLogUtils.js +1 -1
- package/dist/esm/lib/memory/logModel.js +1 -1
- package/dist/esm/lib/memory/runPolicy.d.ts +2 -3
- package/dist/esm/lib/memory/runPolicy.js +3 -4
- package/dist/esm/lib/memory/verbs.d.ts +2 -1
- package/dist/esm/lib/memory/verbs.js +1 -1
- package/dist/esm/lib/pause/index.d.ts +1 -1
- package/dist/esm/lib/pause/index.js +1 -1
- package/dist/esm/lib/pause/types.d.ts +48 -1
- package/dist/esm/lib/pause/types.js +52 -3
- package/dist/esm/lib/recorder/CombinedRecorder.d.ts +2 -33
- package/dist/esm/lib/recorder/CombinedRecorder.js +10 -62
- package/dist/esm/lib/recorder/CompositeRecorder.d.ts +15 -26
- package/dist/esm/lib/recorder/CompositeRecorder.js +33 -97
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +2 -7
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +3 -2
- package/dist/esm/lib/recorder/hooks.d.ts +249 -0
- package/dist/esm/lib/recorder/hooks.js +132 -0
- package/dist/esm/lib/recorder/snapshot.d.ts +19 -0
- package/dist/esm/lib/recorder/snapshot.js +26 -0
- package/dist/esm/lib/runner/DeferredObserverTier.js +15 -25
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +1 -18
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -37
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -8
- package/dist/esm/lib/runner/FlowChartExecutor.js +59 -32
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +6 -5
- package/dist/esm/lib/scope/ScopeFacade.d.ts +6 -1
- package/dist/esm/lib/scope/ScopeFacade.js +36 -61
- package/dist/esm/lib/scope/types.d.ts +3 -9
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/lib/time-travel/chain.js +2 -2
- package/dist/esm/lib/time-travel/commitStops.js +4 -4
- package/dist/esm/lib/time-travel/index.d.ts +1 -1
- package/dist/esm/lib/time-travel/index.js +2 -2
- package/dist/esm/lib/time-travel/timeTravel.js +8 -9
- package/dist/esm/lib/time-travel/types.d.ts +1 -1
- package/dist/esm/lib/time-travel/types.js +2 -2
- package/dist/esm/trace.d.ts +3 -3
- package/dist/esm/trace.js +3 -3
- package/dist/index.js +1 -1
- package/dist/lib/builder/FlowChartBuilder.js +236 -375
- package/dist/lib/engine/graph/prefixNodeTree.js +44 -0
- package/dist/lib/engine/handlers/ParallelForEachHandler.js +3 -3
- package/dist/lib/engine/handlers/ResumeEntry.js +10 -1
- package/dist/lib/engine/handlers/StageRunner.js +17 -3
- package/dist/lib/engine/handlers/SubflowExecutor.js +3 -32
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +68 -86
- package/dist/lib/engine/traversalContext.js +89 -0
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -2
- package/dist/lib/ids/branchSegment.js +127 -0
- package/dist/lib/ids/runtimeStageId.js +242 -0
- package/dist/lib/memory/StageContext.js +1 -36
- package/dist/lib/memory/commitLogUtils.js +1 -1
- package/dist/lib/memory/logModel.js +1 -1
- package/dist/lib/memory/runPolicy.js +3 -4
- package/dist/lib/memory/verbs.js +1 -1
- package/dist/lib/pause/index.js +1 -1
- package/dist/lib/pause/types.js +54 -4
- package/dist/lib/recorder/CombinedRecorder.js +11 -63
- package/dist/lib/recorder/CompositeRecorder.js +33 -97
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -2
- package/dist/lib/recorder/hooks.js +140 -0
- package/dist/lib/recorder/snapshot.js +30 -0
- package/dist/lib/runner/DeferredObserverTier.js +16 -26
- package/dist/lib/runner/ExecutionRuntime.js +1 -36
- package/dist/lib/runner/FlowChartExecutor.js +58 -31
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +36 -61
- package/dist/lib/scope/types.js +1 -1
- package/dist/lib/time-travel/chain.js +2 -2
- package/dist/lib/time-travel/commitStops.js +4 -4
- package/dist/lib/time-travel/index.js +2 -2
- package/dist/lib/time-travel/timeTravel.js +8 -9
- package/dist/lib/time-travel/types.js +2 -2
- package/dist/trace.js +3 -3
- package/dist/types/advanced.d.ts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +5 -34
- package/dist/types/lib/engine/graph/prefixNodeTree.d.ts +26 -0
- package/dist/types/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
- package/dist/types/lib/engine/narrative/types.d.ts +26 -10
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
- package/dist/types/lib/engine/traversalContext.d.ts +65 -0
- package/dist/types/lib/engine/types.d.ts +1 -3
- package/dist/types/lib/ids/runtimeStageId.d.ts +191 -0
- package/dist/types/lib/memory/StageContext.d.ts +1 -17
- package/dist/types/lib/memory/runPolicy.d.ts +2 -3
- package/dist/types/lib/memory/verbs.d.ts +2 -1
- package/dist/types/lib/pause/index.d.ts +1 -1
- package/dist/types/lib/pause/types.d.ts +48 -1
- package/dist/types/lib/recorder/CombinedRecorder.d.ts +2 -33
- package/dist/types/lib/recorder/CompositeRecorder.d.ts +15 -26
- package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -7
- package/dist/types/lib/recorder/hooks.d.ts +249 -0
- package/dist/types/lib/recorder/snapshot.d.ts +19 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -18
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -8
- package/dist/types/lib/scope/ScopeFacade.d.ts +6 -1
- package/dist/types/lib/scope/types.d.ts +3 -9
- package/dist/types/lib/time-travel/index.d.ts +1 -1
- package/dist/types/lib/time-travel/types.d.ts +1 -1
- package/dist/types/trace.d.ts +3 -3
- package/package.json +1 -1
- package/dist/esm/lib/engine/branchSegment.js +0 -119
- package/dist/esm/lib/engine/runtimeStageId.d.ts +0 -103
- package/dist/esm/lib/engine/runtimeStageId.js +0 -119
- package/dist/esm/lib/recorder/invokeHook.d.ts +0 -8
- package/dist/esm/lib/recorder/invokeHook.js +0 -9
- package/dist/lib/engine/branchSegment.js +0 -127
- package/dist/lib/engine/runtimeStageId.js +0 -126
- package/dist/lib/recorder/invokeHook.js +0 -13
- package/dist/types/lib/engine/runtimeStageId.d.ts +0 -103
- package/dist/types/lib/recorder/invokeHook.d.ts +0 -8
- /package/dist/esm/lib/{engine → ids}/branchSegment.d.ts +0 -0
- /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
|
|
File without changes
|