footprintjs 9.48.2 → 10.0.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/AGENTS.md +12 -10
- package/CLAUDE.md +21 -23
- package/README.md +1 -1
- package/dist/advanced.js +71 -128
- package/dist/esm/advanced.d.ts +24 -58
- package/dist/esm/advanced.js +13 -51
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
- package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/esm/lib/capture/index.d.ts +0 -1
- package/dist/esm/lib/capture/index.js +1 -2
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
- package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
- 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 +4 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
- package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
- package/dist/esm/lib/engine/traversalContext.js +2 -2
- package/dist/esm/lib/engine/types.d.ts +2 -10
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
- package/dist/esm/lib/ids/reservedIds.js +2 -2
- package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +2 -4
- package/dist/esm/lib/memory/StageContext.js +2 -2
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/index.d.ts +6 -21
- package/dist/esm/lib/memory/index.js +4 -22
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
- package/dist/esm/lib/memory/runPolicy.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +2 -2
- package/dist/esm/lib/reactive/writeTraps.js +2 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
- package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/esm/lib/recorder/qualityTrace.js +2 -2
- package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
- package/dist/esm/lib/runner/resume.js +2 -2
- package/dist/esm/lib/runner/snapshot.js +3 -2
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
- package/dist/esm/recorders.d.ts +2 -3
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.d.ts +11 -57
- package/dist/esm/trace.js +10 -68
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +5 -5
- package/dist/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/lib/capture/index.js +2 -4
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
- package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
- package/dist/lib/engine/traversalContext.js +4 -4
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -3
- package/dist/lib/ids/reservedIds.js +5 -5
- package/dist/lib/memory/DiagnosticCollector.js +3 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/borrowedMutation.js +3 -3
- package/dist/lib/memory/index.js +7 -42
- package/dist/lib/memory/redaction.js +3 -3
- package/dist/lib/memory/runPolicy.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +3 -3
- package/dist/lib/reactive/writeTraps.js +4 -4
- package/dist/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -3
- package/dist/lib/recorder/qualityTrace.js +4 -4
- package/dist/lib/runner/DeferredObserverTier.js +3 -3
- package/dist/lib/runner/ExecutionRuntime.js +6 -9
- package/dist/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
- package/dist/lib/runner/resume.js +3 -3
- package/dist/lib/runner/snapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +3 -3
- package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -120
- package/dist/types/advanced.d.ts +24 -58
- package/dist/types/index.d.ts +5 -8
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/types/lib/capture/index.d.ts +0 -1
- package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/types/lib/engine/traversalContext.d.ts +1 -1
- package/dist/types/lib/engine/types.d.ts +2 -10
- package/dist/types/lib/memory/StageContext.d.ts +2 -4
- package/dist/types/lib/memory/index.d.ts +6 -21
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/memory/runPolicy.d.ts +3 -2
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/types/recorders.d.ts +2 -3
- package/dist/types/trace.d.ts +11 -57
- package/package.json +6 -15
- package/dist/esm/lib/capture/freeze.d.ts +0 -91
- package/dist/esm/lib/capture/freeze.js +0 -314
- package/dist/esm/lib/capture/ownData.d.ts +0 -7
- package/dist/esm/lib/capture/ownData.js +0 -15
- package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
- package/dist/esm/lib/capture/valueKinds.js +0 -142
- package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/esm/lib/ids/runtimeStageId.js +0 -194
- package/dist/esm/lib/memory/EventLog.d.ts +0 -105
- package/dist/esm/lib/memory/EventLog.js +0 -148
- package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/esm/lib/memory/RecordFrame.js +0 -296
- package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/esm/lib/memory/SharedMemory.js +0 -88
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
- package/dist/esm/lib/memory/admission.d.ts +0 -81
- package/dist/esm/lib/memory/admission.js +0 -153
- package/dist/esm/lib/memory/backtrack.d.ts +0 -286
- package/dist/esm/lib/memory/backtrack.js +0 -457
- package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/esm/lib/memory/commitLogUtils.js +0 -384
- package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/esm/lib/memory/deltaEncoding.js +0 -122
- package/dist/esm/lib/memory/equality.d.ts +0 -93
- package/dist/esm/lib/memory/equality.js +0 -262
- package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
- package/dist/esm/lib/memory/eventPosition.js +0 -2
- package/dist/esm/lib/memory/honesty.d.ts +0 -93
- package/dist/esm/lib/memory/honesty.js +0 -92
- package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
- package/dist/esm/lib/memory/keyPaths.js +0 -227
- package/dist/esm/lib/memory/logModel.d.ts +0 -76
- package/dist/esm/lib/memory/logModel.js +0 -364
- package/dist/esm/lib/memory/merge.d.ts +0 -26
- package/dist/esm/lib/memory/merge.js +0 -60
- package/dist/esm/lib/memory/pathOps.d.ts +0 -115
- package/dist/esm/lib/memory/pathOps.js +0 -290
- package/dist/esm/lib/memory/paths.d.ts +0 -52
- package/dist/esm/lib/memory/paths.js +0 -57
- package/dist/esm/lib/memory/placeholders.d.ts +0 -39
- package/dist/esm/lib/memory/placeholders.js +0 -40
- package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
- package/dist/esm/lib/memory/recordCommit.js +0 -61
- package/dist/esm/lib/memory/scrub.d.ts +0 -53
- package/dist/esm/lib/memory/scrub.js +0 -74
- package/dist/esm/lib/memory/types.d.ts +0 -209
- package/dist/esm/lib/memory/types.js +0 -10
- package/dist/esm/lib/memory/utils.d.ts +0 -73
- package/dist/esm/lib/memory/utils.js +0 -159
- package/dist/esm/lib/memory/verbs.d.ts +0 -333
- package/dist/esm/lib/memory/verbs.js +0 -427
- package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
- package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
- package/dist/esm/lib/scope/detectCircular.js +0 -14
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
- package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/esm/lib/slice/elementProvenance.js +0 -190
- package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
- package/dist/esm/lib/slice/index.d.ts +0 -25
- package/dist/esm/lib/slice/index.js +0 -25
- package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
- package/dist/esm/lib/slice/keyIndex.js +0 -293
- package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/esm/lib/slice/keyTimeline.js +0 -113
- package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/esm/lib/slice/keysReadSources.js +0 -95
- package/dist/esm/lib/slice/serialize.d.ts +0 -78
- package/dist/esm/lib/slice/serialize.js +0 -278
- package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/esm/lib/slice/sliceForKey.js +0 -88
- package/dist/esm/lib/slice/types.d.ts +0 -567
- package/dist/esm/lib/slice/types.js +0 -25
- package/dist/esm/lib/time-travel/axis.d.ts +0 -119
- package/dist/esm/lib/time-travel/axis.js +0 -179
- package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
- package/dist/esm/lib/time-travel/bundles.js +0 -136
- package/dist/esm/lib/time-travel/chain.d.ts +0 -93
- package/dist/esm/lib/time-travel/chain.js +0 -188
- package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/esm/lib/time-travel/commitStops.js +0 -202
- package/dist/esm/lib/time-travel/index.d.ts +0 -22
- package/dist/esm/lib/time-travel/index.js +0 -21
- package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/esm/lib/time-travel/stateAt.js +0 -153
- package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/esm/lib/time-travel/tagStops.js +0 -102
- package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/esm/lib/time-travel/timeTravel.js +0 -360
- package/dist/esm/lib/time-travel/types.d.ts +0 -470
- package/dist/esm/lib/time-travel/types.js +0 -23
- package/dist/esm/write.d.ts +0 -47
- package/dist/esm/write.js +0 -46
- package/dist/lib/capture/freeze.js +0 -320
- package/dist/lib/capture/ownData.js +0 -19
- package/dist/lib/capture/valueKinds.js +0 -146
- package/dist/lib/ids/runtimeStageId.js +0 -210
- package/dist/lib/memory/EventLog.js +0 -152
- package/dist/lib/memory/RecordFrame.js +0 -300
- package/dist/lib/memory/SharedMemory.js +0 -92
- package/dist/lib/memory/TransactionBuffer.js +0 -950
- package/dist/lib/memory/admission.js +0 -159
- package/dist/lib/memory/backtrack.js +0 -463
- package/dist/lib/memory/commitLogUtils.js +0 -399
- package/dist/lib/memory/deltaEncoding.js +0 -128
- package/dist/lib/memory/equality.js +0 -266
- package/dist/lib/memory/eventPosition.js +0 -3
- package/dist/lib/memory/honesty.js +0 -95
- package/dist/lib/memory/keyPaths.js +0 -243
- package/dist/lib/memory/logModel.js +0 -372
- package/dist/lib/memory/merge.js +0 -64
- package/dist/lib/memory/pathOps.js +0 -306
- package/dist/lib/memory/paths.js +0 -62
- package/dist/lib/memory/placeholders.js +0 -43
- package/dist/lib/memory/recordCommit.js +0 -65
- package/dist/lib/memory/scrub.js +0 -79
- package/dist/lib/memory/types.js +0 -11
- package/dist/lib/memory/utils.js +0 -178
- package/dist/lib/memory/verbs.js +0 -444
- package/dist/lib/recorder/CommitRangeIndex.js +0 -211
- package/dist/lib/scope/detectCircular.js +0 -21
- package/dist/lib/scope/recorders/summarizeValue.js +0 -10
- package/dist/lib/slice/elementProvenance.js +0 -195
- package/dist/lib/slice/forwardSliceForKey.js +0 -247
- package/dist/lib/slice/index.js +0 -42
- package/dist/lib/slice/keyIndex.js +0 -313
- package/dist/lib/slice/keyTimeline.js +0 -117
- package/dist/lib/slice/keysReadSources.js +0 -101
- package/dist/lib/slice/serialize.js +0 -286
- package/dist/lib/slice/sliceForKey.js +0 -93
- package/dist/lib/slice/types.js +0 -26
- package/dist/lib/time-travel/axis.js +0 -184
- package/dist/lib/time-travel/bundles.js +0 -144
- package/dist/lib/time-travel/chain.js +0 -193
- package/dist/lib/time-travel/commitStops.js +0 -206
- package/dist/lib/time-travel/index.js +0 -32
- package/dist/lib/time-travel/stateAt.js +0 -160
- package/dist/lib/time-travel/tagStops.js +0 -106
- package/dist/lib/time-travel/timeTravel.js +0 -364
- package/dist/lib/time-travel/types.js +0 -24
- package/dist/types/lib/capture/freeze.d.ts +0 -91
- package/dist/types/lib/capture/ownData.d.ts +0 -7
- package/dist/types/lib/capture/valueKinds.d.ts +0 -57
- package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/types/lib/memory/EventLog.d.ts +0 -105
- package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/types/lib/memory/admission.d.ts +0 -81
- package/dist/types/lib/memory/backtrack.d.ts +0 -286
- package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/types/lib/memory/equality.d.ts +0 -93
- package/dist/types/lib/memory/eventPosition.d.ts +0 -18
- package/dist/types/lib/memory/honesty.d.ts +0 -93
- package/dist/types/lib/memory/keyPaths.d.ts +0 -125
- package/dist/types/lib/memory/logModel.d.ts +0 -76
- package/dist/types/lib/memory/merge.d.ts +0 -26
- package/dist/types/lib/memory/pathOps.d.ts +0 -115
- package/dist/types/lib/memory/paths.d.ts +0 -52
- package/dist/types/lib/memory/placeholders.d.ts +0 -39
- package/dist/types/lib/memory/recordCommit.d.ts +0 -45
- package/dist/types/lib/memory/scrub.d.ts +0 -53
- package/dist/types/lib/memory/types.d.ts +0 -209
- package/dist/types/lib/memory/utils.d.ts +0 -73
- package/dist/types/lib/memory/verbs.d.ts +0 -333
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/types/lib/scope/detectCircular.d.ts +0 -13
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/types/lib/slice/index.d.ts +0 -25
- package/dist/types/lib/slice/keyIndex.d.ts +0 -137
- package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/types/lib/slice/serialize.d.ts +0 -78
- package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/types/lib/slice/types.d.ts +0 -567
- package/dist/types/lib/time-travel/axis.d.ts +0 -119
- package/dist/types/lib/time-travel/bundles.d.ts +0 -77
- package/dist/types/lib/time-travel/chain.d.ts +0 -93
- package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/types/lib/time-travel/index.d.ts +0 -22
- package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/types/lib/time-travel/types.d.ts +0 -470
- package/dist/types/write.d.ts +0 -47
- package/dist/write.js +0 -52
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* commitStops — the one strategy footprintjs ships.
|
|
4
|
-
*
|
|
5
|
-
* One stop per executed stage, in execution order, plus `'start'` / `'end'`
|
|
6
|
-
* bookends. It is the only stop grammar the substrate itself knows: the engine
|
|
7
|
-
* stamps one `runtimeStageId` per executed stage, and an empty commit is a
|
|
8
|
-
* deliberate cursor stop, not noise. Richer vocabularies (milestones, turns,
|
|
9
|
-
* tool calls) belong to the consumer that owns them — they plug in through
|
|
10
|
-
* `TimeTravelStrategy`, they do not go here.
|
|
11
|
-
*/
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.commitStopsStrategy = exports.commitStops = void 0;
|
|
14
|
-
const runtimeStageId_js_1 = require("../ids/runtimeStageId.js");
|
|
15
|
-
const commitLogUtils_js_1 = require("../memory/commitLogUtils.js");
|
|
16
|
-
/**
|
|
17
|
-
* Every `runtimeStageId` in the execution tree that the engine marked as a
|
|
18
|
-
* subflow mount. Authoritative, as is a bundle's recorded `phase: 'exit'`
|
|
19
|
-
* (9.39.0) — a mount with a merge-back records its exit as a continuation. A
|
|
20
|
-
* mount without one has a single bundle, its own (no `phase`), so only the
|
|
21
|
-
* tree names it. Only a log written before 9.39.0 AND handed over without its
|
|
22
|
-
* tree falls back to the legacy inference (`inferLegacyPhases`).
|
|
23
|
-
*/
|
|
24
|
-
function mountIdsFrom(tree) {
|
|
25
|
-
const ids = new Set();
|
|
26
|
-
if (!tree)
|
|
27
|
-
return ids;
|
|
28
|
-
const work = [tree];
|
|
29
|
-
while (work.length > 0) {
|
|
30
|
-
const node = work.pop();
|
|
31
|
-
if (node.subflowId && node.runtimeStageId)
|
|
32
|
-
ids.add(node.runtimeStageId);
|
|
33
|
-
if (node.next)
|
|
34
|
-
work.push(node.next);
|
|
35
|
-
if (node.children)
|
|
36
|
-
work.push(...node.children);
|
|
37
|
-
}
|
|
38
|
-
return ids;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Derive one stop per executed stage from a recorded commit log.
|
|
42
|
-
*
|
|
43
|
-
* **One stop per `runtimeStageId`.** A stage can commit MORE than one bundle:
|
|
44
|
-
* a subflow mount commits its output-mapping bundle and then its EXIT; a
|
|
45
|
-
* parallel fork child is committed by the stage funnel and again by the
|
|
46
|
-
* fan-out (its REPEAT), and siblings interleave. The writer names each
|
|
47
|
-
* continuation on its bundle (`phase: 'exit' | 'repeat'`, 9.39.0), so the
|
|
48
|
-
* grouping is read, never inferred: the axis shows the stage ONCE, at its
|
|
49
|
-
* first commit ({@link buildCommitIndex}), which keeps `runtimeStageId → stop`
|
|
50
|
-
* one-to-one — the property `jumpTo` and marks depend on. The FIRST bundle per
|
|
51
|
-
* `runtimeStageId` is the stage's own and never carries a `phase`; a stage
|
|
52
|
-
* whose bundles include an `'exit'` is a `'mount'`. A continuation is normally empty
|
|
53
|
-
* (the first commit released the staging buffer); one that carries a write is
|
|
54
|
-
* folded where it sits in the log, which is when it happened.
|
|
55
|
-
*
|
|
56
|
-
* **Stops PARTITION the log.** A stop's range runs from its own first commit
|
|
57
|
-
* up to (and including) the last commit before the NEXT stop begins —
|
|
58
|
-
* `lastCommitIdx`. Every bundle therefore belongs to exactly one stop, nothing
|
|
59
|
-
* is orphaned, and `stateAt(stop)` is precisely the state that existed just
|
|
60
|
-
* before the next stop's stage started. Folding through `commitIdx` instead
|
|
61
|
-
* would silently drop a mount's output mapping.
|
|
62
|
-
*
|
|
63
|
-
* **Bookends.** `'start'` is the position before the first commit — the fold
|
|
64
|
-
* base, which no commit index can otherwise address. `'end'` is "the run is
|
|
65
|
-
* over"; it folds the whole log, the same as the last stage's stop, because
|
|
66
|
-
* "after the last stage" and "the run finished" are the same state asked as
|
|
67
|
-
* two different questions.
|
|
68
|
-
*
|
|
69
|
-
* An EMPTY log yields NO stops at all — not two bookends around nothing. A
|
|
70
|
-
* cursor with nowhere to stand says so (`Move.reason === 'empty'`).
|
|
71
|
-
*
|
|
72
|
-
* **THE SHAPE IS A CONTRACT (9.18.0).** For a non-empty log the result is
|
|
73
|
-
* `[start, …stages, end]` — `'start'` first, `'end'` last, one stop per
|
|
74
|
-
* executed stage between them, in execution order — and for an empty log it
|
|
75
|
-
* is `[]`. A strategy that COMPOSES this one (keep some stages, drop the rest)
|
|
76
|
-
* rests on that shape; it is pinned by `test/lib/time-travel/`, and
|
|
77
|
-
* {@link splitAxis} is the one guard that reads it — a composer calls that, or
|
|
78
|
-
* {@link filterStops} which calls it, instead of writing its own.
|
|
79
|
-
*/
|
|
80
|
-
function commitStops(commitLog, executionTree, subflowResults) {
|
|
81
|
-
if (commitLog.length === 0)
|
|
82
|
-
return [];
|
|
83
|
-
// No tree? The snapshot's `subflowResults` still keys every mount EXECUTION
|
|
84
|
-
// by its runtimeStageId (9.39.0) — the mapper-less mounts whose one bundle
|
|
85
|
-
// carries no `phase` (fork / selector children, lazy mounts, `parallelForEach`
|
|
86
|
-
// branches) included.
|
|
87
|
-
const mountIds = executionTree ? mountIdsFrom(executionTree) : mountKeysOf(subflowResults);
|
|
88
|
-
const phases = phasesOf(commitLog, executionTree !== undefined);
|
|
89
|
-
// First commit of each distinct runtimeStageId, in execution order — the
|
|
90
|
-
// one index every reader shares (`buildCommitIndex`).
|
|
91
|
-
// A subflow's `inputMapper` seed is not one of the subflow's stages: it is
|
|
92
|
-
// the MOUNT's commit, made before any of them ran. It gets no stop of its
|
|
93
|
-
// own; it belongs to the `'start'` bookend, which is where a reader looks
|
|
94
|
-
// for "the input this chart began with" anyway. See {@link seedCommits}.
|
|
95
|
-
const seeds = seedCommits(commitLog, executionTree);
|
|
96
|
-
const firsts = [];
|
|
97
|
-
for (const [id, i] of (0, commitLogUtils_js_1.buildCommitIndex)(commitLog))
|
|
98
|
-
if (id && i >= seeds)
|
|
99
|
-
firsts.push(i);
|
|
100
|
-
const exits = new Set();
|
|
101
|
-
for (let i = seeds; i < commitLog.length; i++)
|
|
102
|
-
if (phases[i] === 'exit')
|
|
103
|
-
exits.add(commitLog[i].runtimeStageId);
|
|
104
|
-
const stops = [
|
|
105
|
-
{
|
|
106
|
-
step: 0,
|
|
107
|
-
runtimeStageId: '',
|
|
108
|
-
commitIdx: -1,
|
|
109
|
-
// Covers the subflow input seed, when the log opens with one.
|
|
110
|
-
lastCommitIdx: (firsts.length > 0 ? firsts[0] : commitLog.length) - 1,
|
|
111
|
-
stageId: '',
|
|
112
|
-
label: 'Run start',
|
|
113
|
-
kind: 'start',
|
|
114
|
-
},
|
|
115
|
-
];
|
|
116
|
-
for (let g = 0; g < firsts.length; g++) {
|
|
117
|
-
const first = firsts[g];
|
|
118
|
-
const bundle = commitLog[first];
|
|
119
|
-
// Partition boundary: everything up to the next stage's first commit.
|
|
120
|
-
const last = g + 1 < firsts.length ? firsts[g + 1] - 1 : commitLog.length - 1;
|
|
121
|
-
stops.push({
|
|
122
|
-
step: stops.length,
|
|
123
|
-
runtimeStageId: bundle.runtimeStageId,
|
|
124
|
-
commitIdx: first,
|
|
125
|
-
lastCommitIdx: last,
|
|
126
|
-
stageId: bundle.stageId,
|
|
127
|
-
subflowPath: (0, runtimeStageId_js_1.parseRuntimeStageId)(bundle.runtimeStageId).subflowPath,
|
|
128
|
-
label: bundle.stage || bundle.stageId || bundle.runtimeStageId,
|
|
129
|
-
kind: mountIds.has(bundle.runtimeStageId) || exits.has(bundle.runtimeStageId) ? 'mount' : 'commit',
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
stops.push({
|
|
133
|
-
step: stops.length,
|
|
134
|
-
runtimeStageId: '',
|
|
135
|
-
commitIdx: commitLog.length - 1,
|
|
136
|
-
lastCommitIdx: commitLog.length - 1,
|
|
137
|
-
stageId: '',
|
|
138
|
-
label: 'Run end',
|
|
139
|
-
kind: 'end',
|
|
140
|
-
});
|
|
141
|
-
return stops;
|
|
142
|
-
}
|
|
143
|
-
exports.commitStops = commitStops;
|
|
144
|
-
/** The per-execution mount keys of a snapshot's `subflowResults` (`'#'` keys; path keys skipped). */
|
|
145
|
-
function mountKeysOf(subflowResults) {
|
|
146
|
-
const ids = new Set();
|
|
147
|
-
if (subflowResults === null || typeof subflowResults !== 'object')
|
|
148
|
-
return ids;
|
|
149
|
-
for (const key of Object.keys(subflowResults))
|
|
150
|
-
if ((0, runtimeStageId_js_1.isExecutionKey)(key))
|
|
151
|
-
ids.add(key);
|
|
152
|
-
return ids;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* The phase of every bundle: as RECORDED when the log records any (9.39.0+).
|
|
156
|
-
* A log that records none is either free of continuations (nothing to read)
|
|
157
|
-
* or older than the field: with its execution tree the tree names the mounts,
|
|
158
|
-
* so nothing is inferred; without it, the one legacy reader infers what
|
|
159
|
-
* 9.38.0 inferred (`inferLegacyPhases`) — a stored recording keeps its axis.
|
|
160
|
-
*/
|
|
161
|
-
function phasesOf(commitLog, haveTree) {
|
|
162
|
-
if ((0, commitLogUtils_js_1.recordsPhases)(commitLog))
|
|
163
|
-
return commitLog.map((bundle) => bundle.phase);
|
|
164
|
-
return haveTree ? [] : (0, commitLogUtils_js_1.inferLegacyPhases)(commitLog);
|
|
165
|
-
}
|
|
166
|
-
/** `commitStops` as a {@link TimeTravelStrategy} — the default for `timeTravel`. */
|
|
167
|
-
exports.commitStopsStrategy = { stopsFor: commitStops };
|
|
168
|
-
/**
|
|
169
|
-
* How many commits at the head of a log are a subflow's input seed — 0 on a
|
|
170
|
-
* run's own log. The seed is `history[0]` of the subflow's log, committed by
|
|
171
|
-
* the MOUNT before any of the subflow's stages ran:
|
|
172
|
-
*
|
|
173
|
-
* - since R13 it carries the mount's runtimeStageId — and a mount's stage
|
|
174
|
-
* address (the id before `#`) IS the subflow path of every stage in the
|
|
175
|
-
* log it opens (`sub#2` opens `sub/in#3`; `outer/sub#5` opens
|
|
176
|
-
* `outer/sub/in#6`), which no stage of that log can be;
|
|
177
|
-
* - through 9.33.0 it carried `''`, which is still read the same way, so an
|
|
178
|
-
* old recording keeps its axis.
|
|
179
|
-
*
|
|
180
|
-
* A log that holds ONLY the seed (the subflow committed no stage — it paused
|
|
181
|
-
* or failed first) has no stage to compare with; the execution tree's root
|
|
182
|
-
* stands in for it: a subflow's tree is rooted at one of its own stages,
|
|
183
|
-
* whose id carries the same subflow path. Without a tree such a log reads as
|
|
184
|
-
* one stop.
|
|
185
|
-
*/
|
|
186
|
-
function seedCommits(commitLog, executionTree) {
|
|
187
|
-
const head = commitLog[0]?.runtimeStageId;
|
|
188
|
-
if (head === undefined)
|
|
189
|
-
return 0;
|
|
190
|
-
if (head === '') {
|
|
191
|
-
let n = 0;
|
|
192
|
-
while (n < commitLog.length && commitLog[n].runtimeStageId === '')
|
|
193
|
-
n++;
|
|
194
|
-
return n;
|
|
195
|
-
}
|
|
196
|
-
let next = 1;
|
|
197
|
-
while (next < commitLog.length && commitLog[next].runtimeStageId === head)
|
|
198
|
-
next++;
|
|
199
|
-
const address = (0, runtimeStageId_js_1.stageIdOf)(head);
|
|
200
|
-
if (next >= commitLog.length) {
|
|
201
|
-
const rootId = executionTree?.id;
|
|
202
|
-
return typeof rootId === 'string' && (0, runtimeStageId_js_1.isWithinSubflow)(rootId, address) ? next : 0;
|
|
203
|
-
}
|
|
204
|
-
return (0, runtimeStageId_js_1.parseRuntimeStageId)(commitLog[next].runtimeStageId).subflowPath === address ? next : 0;
|
|
205
|
-
}
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0U3RvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL2NvbW1pdFN0b3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7OztBQUVILGdFQUEyRztBQUMzRyxtRUFBaUc7QUFJakc7Ozs7Ozs7R0FPRztBQUNILFNBQVMsWUFBWSxDQUFDLElBQStCO0lBQ25ELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDOUIsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN0QixNQUFNLElBQUksR0FBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRyxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYztZQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksSUFBSSxDQUFDLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILFNBQWdCLFdBQVcsQ0FDekIsU0FBa0MsRUFDbEMsYUFBNkIsRUFDN0IsY0FBd0I7SUFFeEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUV0Qyw0RUFB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QUFDLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY29tbWl0U3RvcHMg4oCUIHRoZSBvbmUgc3RyYXRlZ3kgZm9vdHByaW50anMgc2hpcHMuXG4gKlxuICogT25lIHN0b3AgcGVyIGV4ZWN1dGVkIHN0YWdlLCBpbiBleGVjdXRpb24gb3JkZXIsIHBsdXMgYCdzdGFydCdgIC8gYCdlbmQnYFxuICogYm9va2VuZHMuIEl0IGlzIHRoZSBvbmx5IHN0b3AgZ3JhbW1hciB0aGUgc3Vic3RyYXRlIGl0c2VsZiBrbm93czogdGhlIGVuZ2luZVxuICogc3RhbXBzIG9uZSBgcnVudGltZVN0YWdlSWRgIHBlciBleGVjdXRlZCBzdGFnZSwgYW5kIGFuIGVtcHR5IGNvbW1pdCBpcyBhXG4gKiBkZWxpYmVyYXRlIGN1cnNvciBzdG9wLCBub3Qgbm9pc2UuIFJpY2hlciB2b2NhYnVsYXJpZXMgKG1pbGVzdG9uZXMsIHR1cm5zLFxuICogdG9vbCBjYWxscykgYmVsb25nIHRvIHRoZSBjb25zdW1lciB0aGF0IG93bnMgdGhlbSDigJQgdGhleSBwbHVnIGluIHRocm91Z2hcbiAqIGBUaW1lVHJhdmVsU3RyYXRlZ3lgLCB0aGV5IGRvIG5vdCBnbyBoZXJlLlxuICovXG5cbmltcG9ydCB7IGlzRXhlY3V0aW9uS2V5LCBpc1dpdGhpblN1YmZsb3csIHBhcnNlUnVudGltZVN0YWdlSWQsIHN0YWdlSWRPZiB9IGZyb20gJy4uL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgeyBidWlsZENvbW1pdEluZGV4LCBpbmZlckxlZ2FjeVBoYXNlcywgcmVjb3Jkc1BoYXNlcyB9IGZyb20gJy4uL21lbW9yeS9jb21taXRMb2dVdGlscy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0UGhhc2UsIEV4ZWN1dGlvblRyZWUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdG9wLCBUaW1lVHJhdmVsU3RyYXRlZ3kgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBFdmVyeSBgcnVudGltZVN0YWdlSWRgIGluIHRoZSBleGVjdXRpb24gdHJlZSB0aGF0IHRoZSBlbmdpbmUgbWFya2VkIGFzIGFcbiAqIHN1YmZsb3cgbW91bnQuIEF1dGhvcml0YXRpdmUsIGFzIGlzIGEgYnVuZGxlJ3MgcmVjb3JkZWQgYHBoYXNlOiAnZXhpdCdgXG4gKiAoOS4zOS4wKSDigJQgYSBtb3VudCB3aXRoIGEgbWVyZ2UtYmFjayByZWNvcmRzIGl0cyBleGl0IGFzIGEgY29udGludWF0aW9uLiBBXG4gKiBtb3VudCB3aXRob3V0IG9uZSBoYXMgYSBzaW5nbGUgYnVuZGxlLCBpdHMgb3duIChubyBgcGhhc2VgKSwgc28gb25seSB0aGVcbiAqIHRyZWUgbmFtZXMgaXQuIE9ubHkgYSBsb2cgd3JpdHRlbiBiZWZvcmUgOS4zOS4wIEFORCBoYW5kZWQgb3ZlciB3aXRob3V0IGl0c1xuICogdHJlZSBmYWxscyBiYWNrIHRvIHRoZSBsZWdhY3kgaW5mZXJlbmNlIChgaW5mZXJMZWdhY3lQaGFzZXNgKS5cbiAqL1xuZnVuY3Rpb24gbW91bnRJZHNGcm9tKHRyZWU6IEV4ZWN1dGlvblRyZWUgfCB1bmRlZmluZWQpOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoIXRyZWUpIHJldHVybiBpZHM7XG4gIGNvbnN0IHdvcms6IEV4ZWN1dGlvblRyZWVbXSA9IFt0cmVlXTtcbiAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSB3b3JrLnBvcCgpITtcbiAgICBpZiAobm9kZS5zdWJmbG93SWQgJiYgbm9kZS5ydW50aW1lU3RhZ2VJZCkgaWRzLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICBpZiAobm9kZS5uZXh0KSB3b3JrLnB1c2gobm9kZS5uZXh0KTtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikgd29yay5wdXNoKC4uLm5vZGUuY2hpbGRyZW4pO1xuICB9XG4gIHJldHVybiBpZHM7XG59XG5cbi8qKlxuICogRGVyaXZlIG9uZSBzdG9wIHBlciBleGVjdXRlZCBzdGFnZSBmcm9tIGEgcmVjb3JkZWQgY29tbWl0IGxvZy5cbiAqXG4gKiAqKk9uZSBzdG9wIHBlciBgcnVudGltZVN0YWdlSWRgLioqIEEgc3RhZ2UgY2FuIGNvbW1pdCBNT1JFIHRoYW4gb25lIGJ1bmRsZTpcbiAqIGEgc3ViZmxvdyBtb3VudCBjb21taXRzIGl0cyBvdXRwdXQtbWFwcGluZyBidW5kbGUgYW5kIHRoZW4gaXRzIEVYSVQ7IGFcbiAqIHBhcmFsbGVsIGZvcmsgY2hpbGQgaXMgY29tbWl0dGVkIGJ5IHRoZSBzdGFnZSBmdW5uZWwgYW5kIGFnYWluIGJ5IHRoZVxuICogZmFuLW91dCAoaXRzIFJFUEVBVCksIGFuZCBzaWJsaW5ncyBpbnRlcmxlYXZlLiBUaGUgd3JpdGVyIG5hbWVzIGVhY2hcbiAqIGNvbnRpbnVhdGlvbiBvbiBpdHMgYnVuZGxlIChgcGhhc2U6ICdleGl0JyB8ICdyZXBlYXQnYCwgOS4zOS4wKSwgc28gdGhlXG4gKiBncm91cGluZyBpcyByZWFkLCBuZXZlciBpbmZlcnJlZDogdGhlIGF4aXMgc2hvd3MgdGhlIHN0YWdlIE9OQ0UsIGF0IGl0c1xuICogZmlyc3QgY29tbWl0ICh7QGxpbmsgYnVpbGRDb21taXRJbmRleH0pLCB3aGljaCBrZWVwcyBgcnVudGltZVN0YWdlSWQg4oaSIHN0b3BgXG4gKiBvbmUtdG8tb25lIOKAlCB0aGUgcHJvcGVydHkgYGp1bXBUb2AgYW5kIG1hcmtzIGRlcGVuZCBvbi4gVGhlIEZJUlNUIGJ1bmRsZSBwZXJcbiAqIGBydW50aW1lU3RhZ2VJZGAgaXMgdGhlIHN0YWdlJ3Mgb3duIGFuZCBuZXZlciBjYXJyaWVzIGEgYHBoYXNlYDsgYSBzdGFnZVxuICogd2hvc2UgYnVuZGxlcyBpbmNsdWRlIGFuIGAnZXhpdCdgIGlzIGEgYCdtb3VudCdgLiBBIGNvbnRpbnVhdGlvbiBpcyBub3JtYWxseSBlbXB0eVxuICogKHRoZSBmaXJzdCBjb21taXQgcmVsZWFzZWQgdGhlIHN0YWdpbmcgYnVmZmVyKTsgb25lIHRoYXQgY2FycmllcyBhIHdyaXRlIGlzXG4gKiBmb2xkZWQgd2hlcmUgaXQgc2l0cyBpbiB0aGUgbG9nLCB3aGljaCBpcyB3aGVuIGl0IGhhcHBlbmVkLlxuICpcbiAqICoqU3RvcHMgUEFSVElUSU9OIHRoZSBsb2cuKiogQSBzdG9wJ3MgcmFuZ2UgcnVucyBmcm9tIGl0cyBvd24gZmlyc3QgY29tbWl0XG4gKiB1cCB0byAoYW5kIGluY2x1ZGluZykgdGhlIGxhc3QgY29tbWl0IGJlZm9yZSB0aGUgTkVYVCBzdG9wIGJlZ2lucyDigJRcbiAqIGBsYXN0Q29tbWl0SWR4YC4gRXZlcnkgYnVuZGxlIHRoZXJlZm9yZSBiZWxvbmdzIHRvIGV4YWN0bHkgb25lIHN0b3AsIG5vdGhpbmdcbiAqIGlzIG9ycGhhbmVkLCBhbmQgYHN0YXRlQXQoc3RvcClgIGlzIHByZWNpc2VseSB0aGUgc3RhdGUgdGhhdCBleGlzdGVkIGp1c3RcbiAqIGJlZm9yZSB0aGUgbmV4dCBzdG9wJ3Mgc3RhZ2Ugc3RhcnRlZC4gRm9sZGluZyB0aHJvdWdoIGBjb21taXRJZHhgIGluc3RlYWRcbiAqIHdvdWxkIHNpbGVudGx5IGRyb3AgYSBtb3VudCdzIG91dHB1dCBtYXBwaW5nLlxuICpcbiAqICoqQm9va2VuZHMuKiogYCdzdGFydCdgIGlzIHRoZSBwb3NpdGlvbiBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCDigJQgdGhlIGZvbGRcbiAqIGJhc2UsIHdoaWNoIG5vIGNvbW1pdCBpbmRleCBjYW4gb3RoZXJ3aXNlIGFkZHJlc3MuIGAnZW5kJ2AgaXMgXCJ0aGUgcnVuIGlzXG4gKiBvdmVyXCI7IGl0IGZvbGRzIHRoZSB3aG9sZSBsb2csIHRoZSBzYW1lIGFzIHRoZSBsYXN0IHN0YWdlJ3Mgc3RvcCwgYmVjYXVzZVxuICogXCJhZnRlciB0aGUgbGFzdCBzdGFnZVwiIGFuZCBcInRoZSBydW4gZmluaXNoZWRcIiBhcmUgdGhlIHNhbWUgc3RhdGUgYXNrZWQgYXNcbiAqIHR3byBkaWZmZXJlbnQgcXVlc3Rpb25zLlxuICpcbiAqIEFuIEVNUFRZIGxvZyB5aWVsZHMgTk8gc3RvcHMgYXQgYWxsIOKAlCBub3QgdHdvIGJvb2tlbmRzIGFyb3VuZCBub3RoaW5nLiBBXG4gKiBjdXJzb3Igd2l0aCBub3doZXJlIHRvIHN0YW5kIHNheXMgc28gKGBNb3ZlLnJlYXNvbiA9PT0gJ2VtcHR5J2ApLlxuICpcbiAqICoqVEhFIFNIQVBFIElTIEEgQ09OVFJBQ1QgKDkuMTguMCkuKiogRm9yIGEgbm9uLWVtcHR5IGxvZyB0aGUgcmVzdWx0IGlzXG4gKiBgW3N0YXJ0LCDigKZzdGFnZXMsIGVuZF1gIOKAlCBgJ3N0YXJ0J2AgZmlyc3QsIGAnZW5kJ2AgbGFzdCwgb25lIHN0b3AgcGVyXG4gKiBleGVjdXRlZCBzdGFnZSBiZXR3ZWVuIHRoZW0sIGluIGV4ZWN1dGlvbiBvcmRlciDigJQgYW5kIGZvciBhbiBlbXB0eSBsb2cgaXRcbiAqIGlzIGBbXWAuIEEgc3RyYXRlZ3kgdGhhdCBDT01QT1NFUyB0aGlzIG9uZSAoa2VlcCBzb21lIHN0YWdlcywgZHJvcCB0aGUgcmVzdClcbiAqIHJlc3RzIG9uIHRoYXQgc2hhcGU7IGl0IGlzIHBpbm5lZCBieSBgdGVzdC9saWIvdGltZS10cmF2ZWwvYCwgYW5kXG4gKiB7QGxpbmsgc3BsaXRBeGlzfSBpcyB0aGUgb25lIGd1YXJkIHRoYXQgcmVhZHMgaXQg4oCUIGEgY29tcG9zZXIgY2FsbHMgdGhhdCwgb3JcbiAqIHtAbGluayBmaWx0ZXJTdG9wc30gd2hpY2ggY2FsbHMgaXQsIGluc3RlYWQgb2Ygd3JpdGluZyBpdHMgb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0U3RvcHMoXG4gIGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sXG4gIGV4ZWN1dGlvblRyZWU/OiBFeGVjdXRpb25UcmVlLFxuICBzdWJmbG93UmVzdWx0cz86IHVua25vd24sXG4pOiBTdG9wW10ge1xuICBpZiAoY29tbWl0TG9nLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIC8vIE5vIHRyZWU/IFRoZSBzbmFwc2hvdCdzIGBzdWJmbG93UmVzdWx0c2Agc3RpbGwga2V5cyBldmVyeSBtb3VudCBFWEVDVVRJT05cbiAgLy8gYnkgaXRzIHJ1bnRpbWVTdGFnZUlkICg5LjM5LjApIOKAlCB0aGUgbWFwcGVyLWxlc3MgbW91bnRzIHdob3NlIG9uZSBidW5kbGVcbiAgLy8gY2FycmllcyBubyBgcGhhc2VgIChmb3JrIC8gc2VsZWN0b3IgY2hpbGRyZW4sIGxhenkgbW91bnRzLCBgcGFyYWxsZWxGb3JFYWNoYFxuICAvLyBicmFuY2hlcykgaW5jbHVkZWQuXG4gIGNvbnN0IG1vdW50SWRzID0gZXhlY3V0aW9uVHJlZSA/IG1vdW50SWRzRnJvbShleGVjdXRpb25UcmVlKSA6IG1vdW50S2V5c09mKHN1YmZsb3dSZXN1bHRzKTtcbiAgY29uc3QgcGhhc2VzID0gcGhhc2VzT2YoY29tbWl0TG9nLCBleGVjdXRpb25UcmVlICE9PSB1bmRlZmluZWQpO1xuXG4gIC8vIEZpcnN0IGNvbW1pdCBvZiBlYWNoIGRpc3RpbmN0IHJ1bnRpbWVTdGFnZUlkLCBpbiBleGVjdXRpb24gb3JkZXIg4oCUIHRoZVxuICAvLyBvbmUgaW5kZXggZXZlcnkgcmVhZGVyIHNoYXJlcyAoYGJ1aWxkQ29tbWl0SW5kZXhgKS5cbiAgLy8gQSBzdWJmbG93J3MgYGlucHV0TWFwcGVyYCBzZWVkIGlzIG5vdCBvbmUgb2YgdGhlIHN1YmZsb3cncyBzdGFnZXM6IGl0IGlzXG4gIC8vIHRoZSBNT1VOVCdzIGNvbW1pdCwgbWFkZSBiZWZvcmUgYW55IG9mIHRoZW0gcmFuLiBJdCBnZXRzIG5vIHN0b3Agb2YgaXRzXG4gIC8vIG93bjsgaXQgYmVsb25ncyB0byB0aGUgYCdzdGFydCdgIGJvb2tlbmQsIHdoaWNoIGlzIHdoZXJlIGEgcmVhZGVyIGxvb2tzXG4gIC8vIGZvciBcInRoZSBpbnB1dCB0aGlzIGNoYXJ0IGJlZ2FuIHdpdGhcIiBhbnl3YXkuIFNlZSB7QGxpbmsgc2VlZENvbW1pdHN9LlxuICBjb25zdCBzZWVkcyA9IHNlZWRDb21taXRzKGNvbW1pdExvZywgZXhlY3V0aW9uVHJlZSk7XG4gIGNvbnN0IGZpcnN0czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaWQsIGldIG9mIGJ1aWxkQ29tbWl0SW5kZXgoY29tbWl0TG9nKSkgaWYgKGlkICYmIGkgPj0gc2VlZHMpIGZpcnN0cy5wdXNoKGkpO1xuICBjb25zdCBleGl0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGxldCBpID0gc2VlZHM7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIGlmIChwaGFzZXNbaV0gPT09ICdleGl0JykgZXhpdHMuYWRkKGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgY29uc3Qgc3RvcHM6IFN0b3BbXSA9IFtcbiAgICB7XG4gICAgICBzdGVwOiAwLFxuICAgICAgcnVudGltZVN0YWdlSWQ6ICcnLFxuICAgICAgY29tbWl0SWR4OiAtMSxcbiAgICAgIC8vIENvdmVycyB0aGUgc3ViZmxvdyBpbnB1dCBzZWVkLCB3aGVuIHRoZSBsb2cgb3BlbnMgd2l0aCBvbmUuXG4gICAgICBsYXN0Q29tbWl0SWR4OiAoZmlyc3RzLmxlbmd0aCA+IDAgPyBmaXJzdHNbMF0gOiBjb21taXRMb2cubGVuZ3RoKSAtIDEsXG4gICAgICBzdGFnZUlkOiAnJyxcbiAgICAgIGxhYmVsOiAnUnVuIHN0YXJ0JyxcbiAgICAgIGtpbmQ6ICdzdGFydCcsXG4gICAgfSxcbiAgXTtcblxuICBmb3IgKGxldCBnID0gMDsgZyA8IGZpcnN0cy5sZW5ndGg7IGcrKykge1xuICAgIGNvbnN0IGZpcnN0ID0gZmlyc3RzW2ddO1xuICAgIGNvbnN0IGJ1bmRsZSA9IGNvbW1pdExvZ1tmaXJzdF07XG4gICAgLy8gUGFydGl0aW9uIGJvdW5kYXJ5OiBldmVyeXRoaW5nIHVwIHRvIHRoZSBuZXh0IHN0YWdlJ3MgZmlyc3QgY29tbWl0LlxuICAgIGNvbnN0IGxhc3QgPSBnICsgMSA8IGZpcnN0cy5sZW5ndGggPyBmaXJzdHNbZyArIDFdIC0gMSA6IGNvbW1pdExvZy5sZW5ndGggLSAxO1xuICAgIHN0b3BzLnB1c2goe1xuICAgICAgc3RlcDogc3RvcHMubGVuZ3RoLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGJ1bmRsZS5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIGNvbW1pdElkeDogZmlyc3QsXG4gICAgICBsYXN0Q29tbWl0SWR4OiBsYXN0LFxuICAgICAgc3RhZ2VJZDogYnVuZGxlLnN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogcGFyc2VSdW50aW1lU3RhZ2VJZChidW5kbGUucnVudGltZVN0YWdlSWQpLnN1YmZsb3dQYXRoLFxuICAgICAgbGFiZWw6IGJ1bmRsZS5zdGFnZSB8fCBidW5kbGUuc3RhZ2VJZCB8fCBidW5kbGUucnVudGltZVN0YWdlSWQsXG4gICAgICBraW5kOiBtb3VudElkcy5oYXMoYnVuZGxlLnJ1bnRpbWVTdGFnZUlkKSB8fCBleGl0cy5oYXMoYnVuZGxlLnJ1bnRpbWVTdGFnZUlkKSA/ICdtb3VudCcgOiAnY29tbWl0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHN0b3BzLnB1c2goe1xuICAgIHN0ZXA6IHN0b3BzLmxlbmd0aCxcbiAgICBydW50aW1lU3RhZ2VJZDogJycsXG4gICAgY29tbWl0SWR4OiBjb21taXRMb2cubGVuZ3RoIC0gMSxcbiAgICBsYXN0Q29tbWl0SWR4OiBjb21taXRMb2cubGVuZ3RoIC0gMSxcbiAgICBzdGFnZUlkOiAnJyxcbiAgICBsYWJlbDogJ1J1biBlbmQnLFxuICAgIGtpbmQ6ICdlbmQnLFxuICB9KTtcblxuICByZXR1cm4gc3RvcHM7XG59XG5cbi8qKiBUaGUgcGVyLWV4ZWN1dGlvbiBtb3VudCBrZXlzIG9mIGEgc25hcHNob3QncyBgc3ViZmxvd1Jlc3VsdHNgIChgJyMnYCBrZXlzOyBwYXRoIGtleXMgc2tpcHBlZCkuICovXG5mdW5jdGlvbiBtb3VudEtleXNPZihzdWJmbG93UmVzdWx0czogdW5rbm93bik6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgaWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGlmIChzdWJmbG93UmVzdWx0cyA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViZmxvd1Jlc3VsdHMgIT09ICdvYmplY3QnKSByZXR1cm4gaWRzO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzdWJmbG93UmVzdWx0cykpIGlmIChpc0V4ZWN1dGlvbktleShrZXkpKSBpZHMuYWRkKGtleSk7XG4gIHJldHVybiBpZHM7XG59XG5cbi8qKlxuICogVGhlIHBoYXNlIG9mIGV2ZXJ5IGJ1bmRsZTogYXMgUkVDT1JERUQgd2hlbiB0aGUgbG9nIHJlY29yZHMgYW55ICg5LjM5LjArKS5cbiAqIEEgbG9nIHRoYXQgcmVjb3JkcyBub25lIGlzIGVpdGhlciBmcmVlIG9mIGNvbnRpbnVhdGlvbnMgKG5vdGhpbmcgdG8gcmVhZClcbiAqIG9yIG9sZGVyIHRoYW4gdGhlIGZpZWxkOiB3aXRoIGl0cyBleGVjdXRpb24gdHJlZSB0aGUgdHJlZSBuYW1lcyB0aGUgbW91bnRzLFxuICogc28gbm90aGluZyBpcyBpbmZlcnJlZDsgd2l0aG91dCBpdCwgdGhlIG9uZSBsZWdhY3kgcmVhZGVyIGluZmVycyB3aGF0XG4gKiA5LjM4LjAgaW5mZXJyZWQgKGBpbmZlckxlZ2FjeVBoYXNlc2ApIOKAlCBhIHN0b3JlZCByZWNvcmRpbmcga2VlcHMgaXRzIGF4aXMuXG4gKi9cbmZ1bmN0aW9uIHBoYXNlc09mKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sIGhhdmVUcmVlOiBib29sZWFuKTogcmVhZG9ubHkgKENvbW1pdFBoYXNlIHwgdW5kZWZpbmVkKVtdIHtcbiAgaWYgKHJlY29yZHNQaGFzZXMoY29tbWl0TG9nKSkgcmV0dXJuIGNvbW1pdExvZy5tYXAoKGJ1bmRsZSkgPT4gYnVuZGxlLnBoYXNlKTtcbiAgcmV0dXJuIGhhdmVUcmVlID8gW10gOiBpbmZlckxlZ2FjeVBoYXNlcyhjb21taXRMb2cpO1xufVxuXG4vKiogYGNvbW1pdFN0b3BzYCBhcyBhIHtAbGluayBUaW1lVHJhdmVsU3RyYXRlZ3l9IOKAlCB0aGUgZGVmYXVsdCBmb3IgYHRpbWVUcmF2ZWxgLiAqL1xuZXhwb3J0IGNvbnN0IGNvbW1pdFN0b3BzU3RyYXRlZ3k6IFRpbWVUcmF2ZWxTdHJhdGVneSA9IHsgc3RvcHNGb3I6IGNvbW1pdFN0b3BzIH07XG5cbi8qKlxuICogSG93IG1hbnkgY29tbWl0cyBhdCB0aGUgaGVhZCBvZiBhIGxvZyBhcmUgYSBzdWJmbG93J3MgaW5wdXQgc2VlZCDigJQgMCBvbiBhXG4gKiBydW4ncyBvd24gbG9nLiBUaGUgc2VlZCBpcyBgaGlzdG9yeVswXWAgb2YgdGhlIHN1YmZsb3cncyBsb2csIGNvbW1pdHRlZCBieVxuICogdGhlIE1PVU5UIGJlZm9yZSBhbnkgb2YgdGhlIHN1YmZsb3cncyBzdGFnZXMgcmFuOlxuICpcbiAqIC0gc2luY2UgUjEzIGl0IGNhcnJpZXMgdGhlIG1vdW50J3MgcnVudGltZVN0YWdlSWQg4oCUIGFuZCBhIG1vdW50J3Mgc3RhZ2VcbiAqICAgYWRkcmVzcyAodGhlIGlkIGJlZm9yZSBgI2ApIElTIHRoZSBzdWJmbG93IHBhdGggb2YgZXZlcnkgc3RhZ2UgaW4gdGhlXG4gKiAgIGxvZyBpdCBvcGVucyAoYHN1YiMyYCBvcGVucyBgc3ViL2luIzNgOyBgb3V0ZXIvc3ViIzVgIG9wZW5zXG4gKiAgIGBvdXRlci9zdWIvaW4jNmApLCB3aGljaCBubyBzdGFnZSBvZiB0aGF0IGxvZyBjYW4gYmU7XG4gKiAtIHRocm91Z2ggOS4zMy4wIGl0IGNhcnJpZWQgYCcnYCwgd2hpY2ggaXMgc3RpbGwgcmVhZCB0aGUgc2FtZSB3YXksIHNvIGFuXG4gKiAgIG9sZCByZWNvcmRpbmcga2VlcHMgaXRzIGF4aXMuXG4gKlxuICogQSBsb2cgdGhhdCBob2xkcyBPTkxZIHRoZSBzZWVkICh0aGUgc3ViZmxvdyBjb21taXR0ZWQgbm8gc3RhZ2Ug4oCUIGl0IHBhdXNlZFxuICogb3IgZmFpbGVkIGZpcnN0KSBoYXMgbm8gc3RhZ2UgdG8gY29tcGFyZSB3aXRoOyB0aGUgZXhlY3V0aW9uIHRyZWUncyByb290XG4gKiBzdGFuZHMgaW4gZm9yIGl0OiBhIHN1YmZsb3cncyB0cmVlIGlzIHJvb3RlZCBhdCBvbmUgb2YgaXRzIG93biBzdGFnZXMsXG4gKiB3aG9zZSBpZCBjYXJyaWVzIHRoZSBzYW1lIHN1YmZsb3cgcGF0aC4gV2l0aG91dCBhIHRyZWUgc3VjaCBhIGxvZyByZWFkcyBhc1xuICogb25lIHN0b3AuXG4gKi9cbmZ1bmN0aW9uIHNlZWRDb21taXRzKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sIGV4ZWN1dGlvblRyZWU/OiBFeGVjdXRpb25UcmVlKTogbnVtYmVyIHtcbiAgY29uc3QgaGVhZCA9IGNvbW1pdExvZ1swXT8ucnVudGltZVN0YWdlSWQ7XG4gIGlmIChoZWFkID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBpZiAoaGVhZCA9PT0gJycpIHtcbiAgICBsZXQgbiA9IDA7XG4gICAgd2hpbGUgKG4gPCBjb21taXRMb2cubGVuZ3RoICYmIGNvbW1pdExvZ1tuXS5ydW50aW1lU3RhZ2VJZCA9PT0gJycpIG4rKztcbiAgICByZXR1cm4gbjtcbiAgfVxuICBsZXQgbmV4dCA9IDE7XG4gIHdoaWxlIChuZXh0IDwgY29tbWl0TG9nLmxlbmd0aCAmJiBjb21taXRMb2dbbmV4dF0ucnVudGltZVN0YWdlSWQgPT09IGhlYWQpIG5leHQrKztcbiAgY29uc3QgYWRkcmVzcyA9IHN0YWdlSWRPZihoZWFkKTtcbiAgaWYgKG5leHQgPj0gY29tbWl0TG9nLmxlbmd0aCkge1xuICAgIGNvbnN0IHJvb3RJZCA9IGV4ZWN1dGlvblRyZWU/LmlkO1xuICAgIHJldHVybiB0eXBlb2Ygcm9vdElkID09PSAnc3RyaW5nJyAmJiBpc1dpdGhpblN1YmZsb3cocm9vdElkLCBhZGRyZXNzKSA/IG5leHQgOiAwO1xuICB9XG4gIHJldHVybiBwYXJzZVJ1bnRpbWVTdGFnZUlkKGNvbW1pdExvZ1tuZXh0XS5ydW50aW1lU3RhZ2VJZCkuc3ViZmxvd1BhdGggPT09IGFkZHJlc3MgPyBuZXh0IDogMDtcbn1cbiJdfQ==
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* time-travel/ — the reader's cursor over a finished trace.
|
|
4
|
-
*
|
|
5
|
-
* Time travel here is READ-TIME: a cursor over a Trace that has already
|
|
6
|
-
* happened, with a Fold at each stop. It is not the Walker and never becomes a
|
|
7
|
-
* second live cursor — nothing in this folder can move, re-run or mutate an
|
|
8
|
-
* execution.
|
|
9
|
-
*
|
|
10
|
-
* See README.md for the five laws, the strategy seam, and a worked example of
|
|
11
|
-
* every export.
|
|
12
|
-
*
|
|
13
|
-
* DAG position: memory ← time-travel (plus `ids/runtimeStageId`, the
|
|
14
|
-
* zero-dependency id grammar).
|
|
15
|
-
*/
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.timeTravel = exports.tagStops = exports.stateAt = exports.commitStopsStrategy = exports.commitStops = exports.isCommitBundle = exports.splitAxis = exports.filterStops = void 0;
|
|
18
|
-
var axis_js_1 = require("./axis.js");
|
|
19
|
-
Object.defineProperty(exports, "filterStops", { enumerable: true, get: function () { return axis_js_1.filterStops; } });
|
|
20
|
-
Object.defineProperty(exports, "splitAxis", { enumerable: true, get: function () { return axis_js_1.splitAxis; } });
|
|
21
|
-
var bundles_js_1 = require("./bundles.js");
|
|
22
|
-
Object.defineProperty(exports, "isCommitBundle", { enumerable: true, get: function () { return bundles_js_1.isCommitBundle; } });
|
|
23
|
-
var commitStops_js_1 = require("./commitStops.js");
|
|
24
|
-
Object.defineProperty(exports, "commitStops", { enumerable: true, get: function () { return commitStops_js_1.commitStops; } });
|
|
25
|
-
Object.defineProperty(exports, "commitStopsStrategy", { enumerable: true, get: function () { return commitStops_js_1.commitStopsStrategy; } });
|
|
26
|
-
var stateAt_js_1 = require("./stateAt.js");
|
|
27
|
-
Object.defineProperty(exports, "stateAt", { enumerable: true, get: function () { return stateAt_js_1.stateAt; } });
|
|
28
|
-
var tagStops_js_1 = require("./tagStops.js");
|
|
29
|
-
Object.defineProperty(exports, "tagStops", { enumerable: true, get: function () { return tagStops_js_1.tagStops; } });
|
|
30
|
-
var timeTravel_js_1 = require("./timeTravel.js");
|
|
31
|
-
Object.defineProperty(exports, "timeTravel", { enumerable: true, get: function () { return timeTravel_js_1.timeTravel; } });
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7OztHQWFHOzs7QUFHSCxxQ0FBbUQ7QUFBMUMsc0dBQUEsV0FBVyxPQUFBO0FBQUUsb0dBQUEsU0FBUyxPQUFBO0FBQy9CLDJDQUE4QztBQUFyQyw0R0FBQSxjQUFjLE9BQUE7QUFDdkIsbURBQW9FO0FBQTNELDZHQUFBLFdBQVcsT0FBQTtBQUFFLHFIQUFBLG1CQUFtQixPQUFBO0FBQ3pDLDJDQUF1QztBQUE5QixxR0FBQSxPQUFPLE9BQUE7QUFDaEIsNkNBQXlDO0FBQWhDLHVHQUFBLFFBQVEsT0FBQTtBQUNqQixpREFBNkM7QUFBcEMsMkdBQUEsVUFBVSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0aW1lLXRyYXZlbC8g4oCUIHRoZSByZWFkZXIncyBjdXJzb3Igb3ZlciBhIGZpbmlzaGVkIHRyYWNlLlxuICpcbiAqIFRpbWUgdHJhdmVsIGhlcmUgaXMgUkVBRC1USU1FOiBhIGN1cnNvciBvdmVyIGEgVHJhY2UgdGhhdCBoYXMgYWxyZWFkeVxuICogaGFwcGVuZWQsIHdpdGggYSBGb2xkIGF0IGVhY2ggc3RvcC4gSXQgaXMgbm90IHRoZSBXYWxrZXIgYW5kIG5ldmVyIGJlY29tZXMgYVxuICogc2Vjb25kIGxpdmUgY3Vyc29yIOKAlCBub3RoaW5nIGluIHRoaXMgZm9sZGVyIGNhbiBtb3ZlLCByZS1ydW4gb3IgbXV0YXRlIGFuXG4gKiBleGVjdXRpb24uXG4gKlxuICogU2VlIFJFQURNRS5tZCBmb3IgdGhlIGZpdmUgbGF3cywgdGhlIHN0cmF0ZWd5IHNlYW0sIGFuZCBhIHdvcmtlZCBleGFtcGxlIG9mXG4gKiBldmVyeSBleHBvcnQuXG4gKlxuICogREFHIHBvc2l0aW9uOiBtZW1vcnkg4oaQIHRpbWUtdHJhdmVsIChwbHVzIGBpZHMvcnVudGltZVN0YWdlSWRgLCB0aGVcbiAqIHplcm8tZGVwZW5kZW5jeSBpZCBncmFtbWFyKS5cbiAqL1xuXG5leHBvcnQgdHlwZSB7IFN0b3BGaWx0ZXIgfSBmcm9tICcuL2F4aXMuanMnO1xuZXhwb3J0IHsgZmlsdGVyU3RvcHMsIHNwbGl0QXhpcyB9IGZyb20gJy4vYXhpcy5qcyc7XG5leHBvcnQgeyBpc0NvbW1pdEJ1bmRsZSB9IGZyb20gJy4vYnVuZGxlcy5qcyc7XG5leHBvcnQgeyBjb21taXRTdG9wcywgY29tbWl0U3RvcHNTdHJhdGVneSB9IGZyb20gJy4vY29tbWl0U3RvcHMuanMnO1xuZXhwb3J0IHsgc3RhdGVBdCB9IGZyb20gJy4vc3RhdGVBdC5qcyc7XG5leHBvcnQgeyB0YWdTdG9wcyB9IGZyb20gJy4vdGFnU3RvcHMuanMnO1xuZXhwb3J0IHsgdGltZVRyYXZlbCB9IGZyb20gJy4vdGltZVRyYXZlbC5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEF4aXNSZWZ1c2FsLFxuICBBeGlzU3BsaXQsXG4gIEJvb2tlbmRlZEF4aXMsXG4gIEZvbGRCYXNpcyxcbiAgRm9sZGVkU3RhdGUsXG4gIEZvbGRTb3VyY2UsXG4gIExvZ0dhcCxcbiAgTWFyayxcbiAgTW92ZSxcbiAgTW92ZVJlZnVzYWwsXG4gIFN0b3AsXG4gIFN0b3BLaW5kLFxuICBUaW1lVHJhdmVsLFxuICBUaW1lVHJhdmVsT3B0aW9ucyxcbiAgVGltZVRyYXZlbFNvdXJjZSxcbiAgVGltZVRyYXZlbFN0cmF0ZWd5LFxufSBmcm9tICcuL3R5cGVzLmpzJztcbiJdfQ==
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* stateAt — the fold at a stop.
|
|
4
|
-
*
|
|
5
|
-
* The commit log stores DIFFS. Replaying them onto the run's fold base
|
|
6
|
-
* reproduces the state as it stood after any commit — byte-for-byte the state
|
|
7
|
-
* the next stage saw, in both `commitValues` encodings, because the replay
|
|
8
|
-
* runs through `applySmartMergeInto`, the one verb law (`memory/verbs.ts`) the
|
|
9
|
-
* live commit itself uses. There is deliberately no second implementation of
|
|
10
|
-
* the verbs here.
|
|
11
|
-
*/
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.stateAt = exports.foldLegsFrom = exports.foldLegs = exports.readSource = void 0;
|
|
14
|
-
const freeze_js_1 = require("../capture/freeze.js");
|
|
15
|
-
const utils_js_1 = require("../memory/utils.js");
|
|
16
|
-
const bundles_js_1 = require("./bundles.js");
|
|
17
|
-
/**
|
|
18
|
-
* Read whichever shape the caller handed us — `commitLog` (a run snapshot) or
|
|
19
|
-
* `history` (a subflow's own log) — narrowing the rows to commit bundles as it
|
|
20
|
-
* goes (see `bundles.ts`: a row that is not one becomes an index-holding gap).
|
|
21
|
-
*/
|
|
22
|
-
function readSource(source) {
|
|
23
|
-
const base = source?.initialState;
|
|
24
|
-
if (!source)
|
|
25
|
-
return { log: [], gaps: [], base };
|
|
26
|
-
const withLog = source;
|
|
27
|
-
const raw = Array.isArray(withLog.commitLog)
|
|
28
|
-
? withLog.commitLog
|
|
29
|
-
: Array.isArray(source.history)
|
|
30
|
-
? source.history
|
|
31
|
-
: undefined;
|
|
32
|
-
const { log, gaps } = (0, bundles_js_1.readLog)(raw);
|
|
33
|
-
return { log, gaps, base };
|
|
34
|
-
}
|
|
35
|
-
exports.readSource = readSource;
|
|
36
|
-
/**
|
|
37
|
-
* Fold one chain of legs: every leg BEFORE `legIdx` in full, then `legIdx`
|
|
38
|
-
* through `through`.
|
|
39
|
-
*
|
|
40
|
-
* THE LEG RULE. A leg that carries its own `initialState` RESTARTS the
|
|
41
|
-
* accumulation from it — on a pause/resume that base IS the state at the
|
|
42
|
-
* pause, recorded by the engine, and is authoritative over anything the
|
|
43
|
-
* previous leg's log rebuilt. A leg with no base (a pre-9.17 snapshot, a
|
|
44
|
-
* hand-built log) CONTINUES from what the earlier legs folded, which is the
|
|
45
|
-
* best honest answer available and is exactly what `basis` then reports.
|
|
46
|
-
*
|
|
47
|
-
* With a single leg this is the 9.17.0 fold, unchanged.
|
|
48
|
-
*/
|
|
49
|
-
function foldLegs(legs, legIdx, through) {
|
|
50
|
-
return foldLegsFrom(legs, legIdx, through).folded;
|
|
51
|
-
}
|
|
52
|
-
exports.foldLegs = foldLegs;
|
|
53
|
-
/** Apply `log[from + 1 .. end]` of one leg into `out`, collecting the leg's facts. */
|
|
54
|
-
function applyLeg(out, leg, from, end, redactedPaths, skipped) {
|
|
55
|
-
for (const gap of leg.gaps) {
|
|
56
|
-
if (gap.index > from && gap.index <= end)
|
|
57
|
-
(skipped ??= []).push(gap);
|
|
58
|
-
}
|
|
59
|
-
for (let i = from + 1; i <= end; i++) {
|
|
60
|
-
const bundle = leg.log[i];
|
|
61
|
-
if (!bundle)
|
|
62
|
-
continue;
|
|
63
|
-
for (const path of bundle.redactedPaths ?? [])
|
|
64
|
-
redactedPaths.add(path);
|
|
65
|
-
(0, utils_js_1.applySmartMergeInto)(out, bundle.updates, bundle.overwrite, bundle.trace);
|
|
66
|
-
}
|
|
67
|
-
return skipped;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* The fold, resumable. ONE clone per fold: the base is cloned once (or `{}`
|
|
71
|
-
* stands in), every bundle is applied INTO that copy, and the state handed
|
|
72
|
-
* out is one more clone, frozen — so the working copy stays private and a
|
|
73
|
-
* later step can continue from it. Same answer as the 9.17.0 fold, pinned by
|
|
74
|
-
* test/lib/time-travel/fold-memo.test.ts against a fresh fold at every stop.
|
|
75
|
-
*/
|
|
76
|
-
function foldLegsFrom(legs, legIdx, through, memo) {
|
|
77
|
-
const last = legs[legIdx];
|
|
78
|
-
const endOnLeg = last ? Math.min(through, last.log.length - 1) : -1;
|
|
79
|
-
const lastThrough = endOnLeg < -1 ? -1 : endOnLeg;
|
|
80
|
-
const resumable = memo !== undefined && memo.legIdx === legIdx && lastThrough >= memo.through;
|
|
81
|
-
let based = resumable ? memo.based : false;
|
|
82
|
-
let out = resumable ? memo.out : {};
|
|
83
|
-
const redactedPaths = new Set(resumable ? memo.redactedPaths : []);
|
|
84
|
-
let skipped = resumable && memo.skipped ? [...memo.skipped] : undefined;
|
|
85
|
-
if (resumable) {
|
|
86
|
-
if (last)
|
|
87
|
-
skipped = applyLeg(out, last, memo.through, lastThrough, redactedPaths, skipped);
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
for (let leg = 0; leg <= legIdx && leg < legs.length; leg++) {
|
|
91
|
-
const source = legs[leg];
|
|
92
|
-
if (source.base && typeof source.base === 'object') {
|
|
93
|
-
out = structuredClone(source.base);
|
|
94
|
-
based = true;
|
|
95
|
-
}
|
|
96
|
-
const end = leg === legIdx ? lastThrough : source.log.length - 1;
|
|
97
|
-
skipped = applyLeg(out, source, -1, end, redactedPaths, skipped);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
const basis = based ? 'initial+log' : 'log-only';
|
|
101
|
-
const folded = {
|
|
102
|
-
// The one freeze walk (`capture/freeze.ts`): a typed array in state is skipped, not thrown on.
|
|
103
|
-
state: (0, freeze_js_1.deepFreeze)(structuredClone(out)),
|
|
104
|
-
basis,
|
|
105
|
-
redacted: redactedPaths.size > 0,
|
|
106
|
-
redactedPaths: Object.freeze([...redactedPaths].sort()),
|
|
107
|
-
throughCommitIdx: lastThrough,
|
|
108
|
-
...(skipped ? { skipped: Object.freeze(skipped) } : {}),
|
|
109
|
-
};
|
|
110
|
-
return { folded, memo: { legIdx, through: lastThrough, out, based, redactedPaths, skipped } };
|
|
111
|
-
}
|
|
112
|
-
exports.foldLegsFrom = foldLegsFrom;
|
|
113
|
-
/**
|
|
114
|
-
* Fold `source`'s log from its base up to and including `commitIdx`.
|
|
115
|
-
*
|
|
116
|
-
* @param source A run snapshot (`commitLog` + `initialState`) or a subflow
|
|
117
|
-
* subtree (`history` + `initialState`). Both spellings work,
|
|
118
|
-
* and the rows may be unvalidated (`unknown[]`) — a row that
|
|
119
|
-
* is not a commit bundle is skipped and REPORTED, by index,
|
|
120
|
-
* in {@link FoldedState.skipped}, never crashed on.
|
|
121
|
-
* @param commitIdx ARRAY INDEX of the last bundle to fold, inclusive. `-1`
|
|
122
|
-
* (or any negative) folds nothing and returns the base —
|
|
123
|
-
* the state before the run's first commit. Past the end
|
|
124
|
-
* clamps to the end; the result's `throughCommitIdx` reports
|
|
125
|
-
* where the fold actually stopped.
|
|
126
|
-
*
|
|
127
|
-
* @returns A detached, deeply frozen state plus how it was derived: `basis`
|
|
128
|
-
* says whether the real fold base was available, `redacted` /
|
|
129
|
-
* `redactedPaths` say where the log was scrubbed at write time, and
|
|
130
|
-
* `skipped` says which rows could not be read. The engine redacts values as
|
|
131
|
-
* it records them, so a replay of a redacted run yields `'REDACTED'` in
|
|
132
|
-
* those places — correct, and said out loud rather than presented as the
|
|
133
|
-
* real value.
|
|
134
|
-
*
|
|
135
|
-
* @example
|
|
136
|
-
* ```typescript
|
|
137
|
-
* const snapshot = executor.getSnapshot();
|
|
138
|
-
* const { state, basis } = stateAt(snapshot, 3); // after the 4th commit
|
|
139
|
-
* console.log(basis, state); // 'initial+log' { ... }
|
|
140
|
-
*
|
|
141
|
-
* // A subflow's own log folds identically:
|
|
142
|
-
* const inner = getSubtreeSnapshot(snapshot, 'sf-payment')!;
|
|
143
|
-
* stateAt(inner, 0).state; // after the subflow's first commit
|
|
144
|
-
*
|
|
145
|
-
* // A STORED recording needs no cast — its rows are `unknown[]`:
|
|
146
|
-
* const stored = JSON.parse(await fs.readFile(path, 'utf8'));
|
|
147
|
-
* stateAt(stored, 3).skipped; // undefined, or the bad rows
|
|
148
|
-
* ```
|
|
149
|
-
*/
|
|
150
|
-
function stateAt(source, commitIdx) {
|
|
151
|
-
// `NaN` is out of contract; treat it as "fold nothing" rather than letting
|
|
152
|
-
// it flow through the arithmetic into `throughCommitIdx`, where it would
|
|
153
|
-
// serialize as `null` and tell a consumer nothing about where the fold
|
|
154
|
-
// stopped. (±Infinity needs no special case: it clamps like any index past
|
|
155
|
-
// either end.)
|
|
156
|
-
const asked = Number.isNaN(commitIdx) ? -1 : Math.floor(commitIdx);
|
|
157
|
-
return foldLegs([readSource(source)], 0, asked);
|
|
158
|
-
}
|
|
159
|
-
exports.stateAt = stateAt;
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVBdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdGltZS10cmF2ZWwvc3RhdGVBdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7QUFFSCxvREFBa0Q7QUFFbEQsaURBQXlEO0FBQ3pELDZDQUF1QztBQVV2Qzs7OztHQUlHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLE1BQThCO0lBQ3ZELE1BQU0sSUFBSSxHQUFJLE1BQWlFLEVBQUUsWUFBWSxDQUFDO0lBQzlGLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxNQUE0QyxDQUFDO0lBQzdELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUMxQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVM7UUFDbkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUUsTUFBMkMsQ0FBQyxPQUFPLENBQUM7WUFDckUsQ0FBQyxDQUFFLE1BQTBDLENBQUMsT0FBTztZQUNyRCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2QsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFBLG9CQUFPLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQVhELGdDQVdDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLElBQTJCLEVBQUUsTUFBYyxFQUFFLE9BQWU7SUFDbkYsT0FBTyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDcEQsQ0FBQztBQUZELDRCQUVDO0FB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RSxPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7QUFDaEcsQ0FBQztBQXpDRCxvQ0F5Q0M7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NHO0FBQ0gsU0FBZ0IsT0FBTyxDQUFDLE1BQThCLEVBQUUsU0FBaUI7SUFDdkUsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLGVBQWU7SUFDZixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRSxPQUFPLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBUkQsMEJBUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHN0YXRlQXQg4oCUIHRoZSBmb2xkIGF0IGEgc3RvcC5cbiAqXG4gKiBUaGUgY29tbWl0IGxvZyBzdG9yZXMgRElGRlMuIFJlcGxheWluZyB0aGVtIG9udG8gdGhlIHJ1bidzIGZvbGQgYmFzZVxuICogcmVwcm9kdWNlcyB0aGUgc3RhdGUgYXMgaXQgc3Rvb2QgYWZ0ZXIgYW55IGNvbW1pdCDigJQgYnl0ZS1mb3ItYnl0ZSB0aGUgc3RhdGVcbiAqIHRoZSBuZXh0IHN0YWdlIHNhdywgaW4gYm90aCBgY29tbWl0VmFsdWVzYCBlbmNvZGluZ3MsIGJlY2F1c2UgdGhlIHJlcGxheVxuICogcnVucyB0aHJvdWdoIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgdGhlIG9uZSB2ZXJiIGxhdyAoYG1lbW9yeS92ZXJicy50c2ApIHRoZVxuICogbGl2ZSBjb21taXQgaXRzZWxmIHVzZXMuIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBzZWNvbmQgaW1wbGVtZW50YXRpb24gb2ZcbiAqIHRoZSB2ZXJicyBoZXJlLlxuICovXG5cbmltcG9ydCB7IGRlZXBGcmVlemUgfSBmcm9tICcuLi9jYXB0dXJlL2ZyZWV6ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgTWVtb3J5UGF0Y2ggfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgYXBwbHlTbWFydE1lcmdlSW50byB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQgeyByZWFkTG9nIH0gZnJvbSAnLi9idW5kbGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRm9sZEJhc2lzLCBGb2xkZWRTdGF0ZSwgRm9sZFNvdXJjZSwgTG9nR2FwIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBPbmUgc291cmNlLCByZWFkOiBpdHMgbG9nIChnYXBzIGhlbGQgaW4gcGxhY2UpIGFuZCBpdHMgZm9sZCBiYXNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFkU291cmNlIHtcbiAgcmVhZG9ubHkgbG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXTtcbiAgcmVhZG9ubHkgZ2FwczogcmVhZG9ubHkgTG9nR2FwW107XG4gIHJlYWRvbmx5IGJhc2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWQgd2hpY2hldmVyIHNoYXBlIHRoZSBjYWxsZXIgaGFuZGVkIHVzIOKAlCBgY29tbWl0TG9nYCAoYSBydW4gc25hcHNob3QpIG9yXG4gKiBgaGlzdG9yeWAgKGEgc3ViZmxvdydzIG93biBsb2cpIOKAlCBuYXJyb3dpbmcgdGhlIHJvd3MgdG8gY29tbWl0IGJ1bmRsZXMgYXMgaXRcbiAqIGdvZXMgKHNlZSBgYnVuZGxlcy50c2A6IGEgcm93IHRoYXQgaXMgbm90IG9uZSBiZWNvbWVzIGFuIGluZGV4LWhvbGRpbmcgZ2FwKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTb3VyY2Uoc291cmNlOiBGb2xkU291cmNlIHwgdW5kZWZpbmVkKTogUmVhZFNvdXJjZSB7XG4gIGNvbnN0IGJhc2UgPSAoc291cmNlIGFzIHsgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IHVuZGVmaW5lZCk/LmluaXRpYWxTdGF0ZTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB7IGxvZzogW10sIGdhcHM6IFtdLCBiYXNlIH07XG4gIGNvbnN0IHdpdGhMb2cgPSBzb3VyY2UgYXMgeyBjb21taXRMb2c/OiByZWFkb25seSB1bmtub3duW10gfTtcbiAgY29uc3QgcmF3ID0gQXJyYXkuaXNBcnJheSh3aXRoTG9nLmNvbW1pdExvZylcbiAgICA/IHdpdGhMb2cuY29tbWl0TG9nXG4gICAgOiBBcnJheS5pc0FycmF5KChzb3VyY2UgYXMgeyBoaXN0b3J5PzogcmVhZG9ubHkgdW5rbm93bltdIH0pLmhpc3RvcnkpXG4gICAgPyAoc291cmNlIGFzIHsgaGlzdG9yeTogcmVhZG9ubHkgdW5rbm93bltdIH0pLmhpc3RvcnlcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgeyBsb2csIGdhcHMgfSA9IHJlYWRMb2cocmF3KTtcbiAgcmV0dXJuIHsgbG9nLCBnYXBzLCBiYXNlIH07XG59XG5cbi8qKlxuICogRm9sZCBvbmUgY2hhaW4gb2YgbGVnczogZXZlcnkgbGVnIEJFRk9SRSBgbGVnSWR4YCBpbiBmdWxsLCB0aGVuIGBsZWdJZHhgXG4gKiB0aHJvdWdoIGB0aHJvdWdoYC5cbiAqXG4gKiBUSEUgTEVHIFJVTEUuIEEgbGVnIHRoYXQgY2FycmllcyBpdHMgb3duIGBpbml0aWFsU3RhdGVgIFJFU1RBUlRTIHRoZVxuICogYWNjdW11bGF0aW9uIGZyb20gaXQg4oCUIG9uIGEgcGF1c2UvcmVzdW1lIHRoYXQgYmFzZSBJUyB0aGUgc3RhdGUgYXQgdGhlXG4gKiBwYXVzZSwgcmVjb3JkZWQgYnkgdGhlIGVuZ2luZSwgYW5kIGlzIGF1dGhvcml0YXRpdmUgb3ZlciBhbnl0aGluZyB0aGVcbiAqIHByZXZpb3VzIGxlZydzIGxvZyByZWJ1aWx0LiBBIGxlZyB3aXRoIG5vIGJhc2UgKGEgcHJlLTkuMTcgc25hcHNob3QsIGFcbiAqIGhhbmQtYnVpbHQgbG9nKSBDT05USU5VRVMgZnJvbSB3aGF0IHRoZSBlYXJsaWVyIGxlZ3MgZm9sZGVkLCB3aGljaCBpcyB0aGVcbiAqIGJlc3QgaG9uZXN0IGFuc3dlciBhdmFpbGFibGUgYW5kIGlzIGV4YWN0bHkgd2hhdCBgYmFzaXNgIHRoZW4gcmVwb3J0cy5cbiAqXG4gKiBXaXRoIGEgc2luZ2xlIGxlZyB0aGlzIGlzIHRoZSA5LjE3LjAgZm9sZCwgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9sZExlZ3MobGVnczogcmVhZG9ubHkgUmVhZFNvdXJjZVtdLCBsZWdJZHg6IG51bWJlciwgdGhyb3VnaDogbnVtYmVyKTogRm9sZGVkU3RhdGUge1xuICByZXR1cm4gZm9sZExlZ3NGcm9tKGxlZ3MsIGxlZ0lkeCwgdGhyb3VnaCkuZm9sZGVkO1xufVxuXG4vKipcbiAqIFdoYXQgYSBmb2xkIGxlYXZlcyBiZWhpbmQgZm9yIHRoZSBORVhUIG9uZSAoOS4yNS4wKTogdGhlIHByaXZhdGUgd29ya2luZ1xuICogY29weSBhbmQgdGhlIGZhY3RzIGFjY3VtdWxhdGVkIHNvIGZhci4gQSBjdXJzb3Igc3RlcHBpbmcgZm9yd2FyZCBvbiB0aGVcbiAqIHNhbWUgbGVnIGhhbmRzIGl0IGJhY2sgYW5kIG9ubHkgdGhlIGJ1bmRsZXMgYWZ0ZXIgYHRocm91Z2hgIGFyZSBhcHBsaWVkIOKAlFxuICogb25lIGJ1bmRsZSBwZXIgc3RlcCBpbnN0ZWFkIG9mIGEgcmVwbGF5IGZyb20gdGhlIGJhc2UuIEFueSBvdGhlciBhc2sgKGFuXG4gKiBlYXJsaWVyIHN0b3AsIGFub3RoZXIgbGVnKSBmb2xkcyBmcm9tIHNjcmF0Y2g7IHRoZSBtZW1vIGlzIG5ldmVyIGEgY2xhaW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9sZE1lbW8ge1xuICByZWFkb25seSBsZWdJZHg6IG51bWJlcjtcbiAgcmVhZG9ubHkgdGhyb3VnaDogbnVtYmVyO1xuICByZWFkb25seSBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSBiYXNlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVkYWN0ZWRQYXRoczogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgc2tpcHBlZDogcmVhZG9ubHkgTG9nR2FwW10gfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBBcHBseSBgbG9nW2Zyb20gKyAxIC4uIGVuZF1gIG9mIG9uZSBsZWcgaW50byBgb3V0YCwgY29sbGVjdGluZyB0aGUgbGVnJ3MgZmFjdHMuICovXG5mdW5jdGlvbiBhcHBseUxlZyhcbiAgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgbGVnOiBSZWFkU291cmNlLFxuICBmcm9tOiBudW1iZXIsXG4gIGVuZDogbnVtYmVyLFxuICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPixcbiAgc2tpcHBlZDogTG9nR2FwW10gfCB1bmRlZmluZWQsXG4pOiBMb2dHYXBbXSB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgZ2FwIG9mIGxlZy5nYXBzKSB7XG4gICAgaWYgKGdhcC5pbmRleCA+IGZyb20gJiYgZ2FwLmluZGV4IDw9IGVuZCkgKHNraXBwZWQgPz89IFtdKS5wdXNoKGdhcCk7XG4gIH1cbiAgZm9yIChsZXQgaSA9IGZyb20gKyAxOyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgY29uc3QgYnVuZGxlID0gbGVnLmxvZ1tpXTtcbiAgICBpZiAoIWJ1bmRsZSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGJ1bmRsZS5yZWRhY3RlZFBhdGhzID8/IFtdKSByZWRhY3RlZFBhdGhzLmFkZChwYXRoKTtcbiAgICBhcHBseVNtYXJ0TWVyZ2VJbnRvKG91dCwgYnVuZGxlLnVwZGF0ZXMgYXMgTWVtb3J5UGF0Y2gsIGJ1bmRsZS5vdmVyd3JpdGUgYXMgTWVtb3J5UGF0Y2gsIGJ1bmRsZS50cmFjZSk7XG4gIH1cbiAgcmV0dXJuIHNraXBwZWQ7XG59XG5cbi8qKlxuICogVGhlIGZvbGQsIHJlc3VtYWJsZS4gT05FIGNsb25lIHBlciBmb2xkOiB0aGUgYmFzZSBpcyBjbG9uZWQgb25jZSAob3IgYHt9YFxuICogc3RhbmRzIGluKSwgZXZlcnkgYnVuZGxlIGlzIGFwcGxpZWQgSU5UTyB0aGF0IGNvcHksIGFuZCB0aGUgc3RhdGUgaGFuZGVkXG4gKiBvdXQgaXMgb25lIG1vcmUgY2xvbmUsIGZyb3plbiDigJQgc28gdGhlIHdvcmtpbmcgY29weSBzdGF5cyBwcml2YXRlIGFuZCBhXG4gKiBsYXRlciBzdGVwIGNhbiBjb250aW51ZSBmcm9tIGl0LiBTYW1lIGFuc3dlciBhcyB0aGUgOS4xNy4wIGZvbGQsIHBpbm5lZCBieVxuICogdGVzdC9saWIvdGltZS10cmF2ZWwvZm9sZC1tZW1vLnRlc3QudHMgYWdhaW5zdCBhIGZyZXNoIGZvbGQgYXQgZXZlcnkgc3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvbGRMZWdzRnJvbShcbiAgbGVnczogcmVhZG9ubHkgUmVhZFNvdXJjZVtdLFxuICBsZWdJZHg6IG51bWJlcixcbiAgdGhyb3VnaDogbnVtYmVyLFxuICBtZW1vPzogRm9sZE1lbW8sXG4pOiB7IHJlYWRvbmx5IGZvbGRlZDogRm9sZGVkU3RhdGU7IHJlYWRvbmx5IG1lbW86IEZvbGRNZW1vIH0ge1xuICBjb25zdCBsYXN0ID0gbGVnc1tsZWdJZHhdO1xuICBjb25zdCBlbmRPbkxlZyA9IGxhc3QgPyBNYXRoLm1pbih0aHJvdWdoLCBsYXN0LmxvZy5sZW5ndGggLSAxKSA6IC0xO1xuICBjb25zdCBsYXN0VGhyb3VnaCA9IGVuZE9uTGVnIDwgLTEgPyAtMSA6IGVuZE9uTGVnO1xuICBjb25zdCByZXN1bWFibGUgPSBtZW1vICE9PSB1bmRlZmluZWQgJiYgbWVtby5sZWdJZHggPT09IGxlZ0lkeCAmJiBsYXN0VGhyb3VnaCA+PSBtZW1vLnRocm91Z2g7XG5cbiAgbGV0IGJhc2VkID0gcmVzdW1hYmxlID8gbWVtby5iYXNlZCA6IGZhbHNlO1xuICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHJlc3VtYWJsZSA/IG1lbW8ub3V0IDoge307XG4gIGNvbnN0IHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4ocmVzdW1hYmxlID8gbWVtby5yZWRhY3RlZFBhdGhzIDogW10pO1xuICBsZXQgc2tpcHBlZDogTG9nR2FwW10gfCB1bmRlZmluZWQgPSByZXN1bWFibGUgJiYgbWVtby5za2lwcGVkID8gWy4uLm1lbW8uc2tpcHBlZF0gOiB1bmRlZmluZWQ7XG5cbiAgaWYgKHJlc3VtYWJsZSkge1xuICAgIGlmIChsYXN0KSBza2lwcGVkID0gYXBwbHlMZWcob3V0LCBsYXN0LCBtZW1vLnRocm91Z2gsIGxhc3RUaHJvdWdoLCByZWRhY3RlZFBhdGhzLCBza2lwcGVkKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBsZWcgPSAwOyBsZWcgPD0gbGVnSWR4ICYmIGxlZyA8IGxlZ3MubGVuZ3RoOyBsZWcrKykge1xuICAgICAgY29uc3Qgc291cmNlID0gbGVnc1tsZWddO1xuICAgICAgaWYgKHNvdXJjZS5iYXNlICYmIHR5cGVvZiBzb3VyY2UuYmFzZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3V0ID0gc3RydWN0dXJlZENsb25lKHNvdXJjZS5iYXNlKTtcbiAgICAgICAgYmFzZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZW5kID0gbGVnID09PSBsZWdJZHggPyBsYXN0VGhyb3VnaCA6IHNvdXJjZS5sb2cubGVuZ3RoIC0gMTtcbiAgICAgIHNraXBwZWQgPSBhcHBseUxlZyhvdXQsIHNvdXJjZSwgLTEsIGVuZCwgcmVkYWN0ZWRQYXRocywgc2tpcHBlZCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYmFzaXM6IEZvbGRCYXNpcyA9IGJhc2VkID8gJ2luaXRpYWwrbG9nJyA6ICdsb2ctb25seSc7XG4gIGNvbnN0IGZvbGRlZDogRm9sZGVkU3RhdGUgPSB7XG4gICAgLy8gVGhlIG9uZSBmcmVlemUgd2FsayAoYGNhcHR1cmUvZnJlZXplLnRzYCk6IGEgdHlwZWQgYXJyYXkgaW4gc3RhdGUgaXMgc2tpcHBlZCwgbm90IHRocm93biBvbi5cbiAgICBzdGF0ZTogZGVlcEZyZWV6ZShzdHJ1Y3R1cmVkQ2xvbmUob3V0KSksXG4gICAgYmFzaXMsXG4gICAgcmVkYWN0ZWQ6IHJlZGFjdGVkUGF0aHMuc2l6ZSA+IDAsXG4gICAgcmVkYWN0ZWRQYXRoczogT2JqZWN0LmZyZWV6ZShbLi4ucmVkYWN0ZWRQYXRoc10uc29ydCgpKSxcbiAgICB0aHJvdWdoQ29tbWl0SWR4OiBsYXN0VGhyb3VnaCxcbiAgICAuLi4oc2tpcHBlZCA/IHsgc2tpcHBlZDogT2JqZWN0LmZyZWV6ZShza2lwcGVkKSB9IDoge30pLFxuICB9O1xuICByZXR1cm4geyBmb2xkZWQsIG1lbW86IHsgbGVnSWR4LCB0aHJvdWdoOiBsYXN0VGhyb3VnaCwgb3V0LCBiYXNlZCwgcmVkYWN0ZWRQYXRocywgc2tpcHBlZCB9IH07XG59XG5cbi8qKlxuICogRm9sZCBgc291cmNlYCdzIGxvZyBmcm9tIGl0cyBiYXNlIHVwIHRvIGFuZCBpbmNsdWRpbmcgYGNvbW1pdElkeGAuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAgICBBIHJ1biBzbmFwc2hvdCAoYGNvbW1pdExvZ2AgKyBgaW5pdGlhbFN0YXRlYCkgb3IgYSBzdWJmbG93XG4gKiAgICAgICAgICAgICAgICAgIHN1YnRyZWUgKGBoaXN0b3J5YCArIGBpbml0aWFsU3RhdGVgKS4gQm90aCBzcGVsbGluZ3Mgd29yayxcbiAqICAgICAgICAgICAgICAgICAgYW5kIHRoZSByb3dzIG1heSBiZSB1bnZhbGlkYXRlZCAoYHVua25vd25bXWApIOKAlCBhIHJvdyB0aGF0XG4gKiAgICAgICAgICAgICAgICAgIGlzIG5vdCBhIGNvbW1pdCBidW5kbGUgaXMgc2tpcHBlZCBhbmQgUkVQT1JURUQsIGJ5IGluZGV4LFxuICogICAgICAgICAgICAgICAgICBpbiB7QGxpbmsgRm9sZGVkU3RhdGUuc2tpcHBlZH0sIG5ldmVyIGNyYXNoZWQgb24uXG4gKiBAcGFyYW0gY29tbWl0SWR4IEFSUkFZIElOREVYIG9mIHRoZSBsYXN0IGJ1bmRsZSB0byBmb2xkLCBpbmNsdXNpdmUuIGAtMWBcbiAqICAgICAgICAgICAgICAgICAgKG9yIGFueSBuZWdhdGl2ZSkgZm9sZHMgbm90aGluZyBhbmQgcmV0dXJucyB0aGUgYmFzZSDigJRcbiAqICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlIGJlZm9yZSB0aGUgcnVuJ3MgZmlyc3QgY29tbWl0LiBQYXN0IHRoZSBlbmRcbiAqICAgICAgICAgICAgICAgICAgY2xhbXBzIHRvIHRoZSBlbmQ7IHRoZSByZXN1bHQncyBgdGhyb3VnaENvbW1pdElkeGAgcmVwb3J0c1xuICogICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZm9sZCBhY3R1YWxseSBzdG9wcGVkLlxuICpcbiAqIEByZXR1cm5zIEEgZGV0YWNoZWQsIGRlZXBseSBmcm96ZW4gc3RhdGUgcGx1cyBob3cgaXQgd2FzIGRlcml2ZWQ6IGBiYXNpc2BcbiAqICAgc2F5cyB3aGV0aGVyIHRoZSByZWFsIGZvbGQgYmFzZSB3YXMgYXZhaWxhYmxlLCBgcmVkYWN0ZWRgIC9cbiAqICAgYHJlZGFjdGVkUGF0aHNgIHNheSB3aGVyZSB0aGUgbG9nIHdhcyBzY3J1YmJlZCBhdCB3cml0ZSB0aW1lLCBhbmRcbiAqICAgYHNraXBwZWRgIHNheXMgd2hpY2ggcm93cyBjb3VsZCBub3QgYmUgcmVhZC4gVGhlIGVuZ2luZSByZWRhY3RzIHZhbHVlcyBhc1xuICogICBpdCByZWNvcmRzIHRoZW0sIHNvIGEgcmVwbGF5IG9mIGEgcmVkYWN0ZWQgcnVuIHlpZWxkcyBgJ1JFREFDVEVEJ2AgaW5cbiAqICAgdGhvc2UgcGxhY2VzIOKAlCBjb3JyZWN0LCBhbmQgc2FpZCBvdXQgbG91ZCByYXRoZXIgdGhhbiBwcmVzZW50ZWQgYXMgdGhlXG4gKiAgIHJlYWwgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNuYXBzaG90ID0gZXhlY3V0b3IuZ2V0U25hcHNob3QoKTtcbiAqIGNvbnN0IHsgc3RhdGUsIGJhc2lzIH0gPSBzdGF0ZUF0KHNuYXBzaG90LCAzKTsgICAvLyBhZnRlciB0aGUgNHRoIGNvbW1pdFxuICogY29uc29sZS5sb2coYmFzaXMsIHN0YXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAnaW5pdGlhbCtsb2cnIHsgLi4uIH1cbiAqXG4gKiAvLyBBIHN1YmZsb3cncyBvd24gbG9nIGZvbGRzIGlkZW50aWNhbGx5OlxuICogY29uc3QgaW5uZXIgPSBnZXRTdWJ0cmVlU25hcHNob3Qoc25hcHNob3QsICdzZi1wYXltZW50JykhO1xuICogc3RhdGVBdChpbm5lciwgMCkuc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciB0aGUgc3ViZmxvdydzIGZpcnN0IGNvbW1pdFxuICpcbiAqIC8vIEEgU1RPUkVEIHJlY29yZGluZyBuZWVkcyBubyBjYXN0IOKAlCBpdHMgcm93cyBhcmUgYHVua25vd25bXWA6XG4gKiBjb25zdCBzdG9yZWQgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGY4JykpO1xuICogc3RhdGVBdChzdG9yZWQsIDMpLnNraXBwZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQsIG9yIHRoZSBiYWQgcm93c1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGF0ZUF0KHNvdXJjZTogRm9sZFNvdXJjZSB8IHVuZGVmaW5lZCwgY29tbWl0SWR4OiBudW1iZXIpOiBGb2xkZWRTdGF0ZSB7XG4gIC8vIGBOYU5gIGlzIG91dCBvZiBjb250cmFjdDsgdHJlYXQgaXQgYXMgXCJmb2xkIG5vdGhpbmdcIiByYXRoZXIgdGhhbiBsZXR0aW5nXG4gIC8vIGl0IGZsb3cgdGhyb3VnaCB0aGUgYXJpdGhtZXRpYyBpbnRvIGB0aHJvdWdoQ29tbWl0SWR4YCwgd2hlcmUgaXQgd291bGRcbiAgLy8gc2VyaWFsaXplIGFzIGBudWxsYCBhbmQgdGVsbCBhIGNvbnN1bWVyIG5vdGhpbmcgYWJvdXQgd2hlcmUgdGhlIGZvbGRcbiAgLy8gc3RvcHBlZC4gKMKxSW5maW5pdHkgbmVlZHMgbm8gc3BlY2lhbCBjYXNlOiBpdCBjbGFtcHMgbGlrZSBhbnkgaW5kZXggcGFzdFxuICAvLyBlaXRoZXIgZW5kLilcbiAgY29uc3QgYXNrZWQgPSBOdW1iZXIuaXNOYU4oY29tbWl0SWR4KSA/IC0xIDogTWF0aC5mbG9vcihjb21taXRJZHgpO1xuICByZXR1cm4gZm9sZExlZ3MoW3JlYWRTb3VyY2Uoc291cmNlKV0sIDAsIGFza2VkKTtcbn1cbiJdfQ==
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* tagStops — the stops a chart DECLARED, read back off its commit log.
|
|
4
|
-
*
|
|
5
|
-
* WHY THIS FILE EXISTS. `commitStops` is the only stop grammar the substrate
|
|
6
|
-
* knows: one stop per executed stage. Every richer axis — milestones, turns,
|
|
7
|
-
* tool calls — was a consumer's classifier over `runtimeStageId`: a switch
|
|
8
|
-
* that parses `#` and `/`, lives outside the recording, and goes stale when
|
|
9
|
-
* a stage is renamed. Since 9.21.0 the author can put NAMES on a stage at
|
|
10
|
-
* build time (`FlowChartBuilder.tag` / `options.tags`) and the engine stamps
|
|
11
|
-
* them on the stage's commit bundle (`CommitBundle.tags`). This strategy
|
|
12
|
-
* reads them back: a stored recording from ANY chart scrubs by its own
|
|
13
|
-
* milestones, with no id conventions in the reader.
|
|
14
|
-
*
|
|
15
|
-
* WHAT IT IS. One expression over `filterStops(commitStops(...))`: keep the
|
|
16
|
-
* stops whose FIRST bundle carries a tag (any of the asked-for ones, or any
|
|
17
|
-
* tag at all when none are asked for), give the survivors the log back, and
|
|
18
|
-
* carry the bundle's whole tag array as `Stop.meta`. Everything a filtering
|
|
19
|
-
* axis owes — the bookend guard, the re-partition so a dropped stage's
|
|
20
|
-
* commits fold into the tagged stop BEFORE them, `prologue` on a start that
|
|
21
|
-
* absorbed stages — comes from `filterStops`, stated once, in `axis.ts`.
|
|
22
|
-
*
|
|
23
|
-
* WHAT IT IS NOT. Not a second vocabulary: the strings are the consumer's,
|
|
24
|
-
* carried verbatim. Not a derivation: a stage with no declared tag gets no
|
|
25
|
-
* stop here, however recognisable its id — a reader that wants ids classified
|
|
26
|
-
* writes that keep rule itself (`filterStops`), or reads the fold
|
|
27
|
-
* (`stateAt`) and keeps by what changed. And not a re-walk: only a tag the
|
|
28
|
-
* engine actually stamped can put a stop on this axis.
|
|
29
|
-
*/
|
|
30
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.tagStops = void 0;
|
|
32
|
-
const axis_js_1 = require("./axis.js");
|
|
33
|
-
const commitStops_js_1 = require("./commitStops.js");
|
|
34
|
-
/**
|
|
35
|
-
* The tags a stop's first bundle carries, or `undefined` when it carries
|
|
36
|
-
* none. Reads the bundle at `stop.commitIdx` — the FIRST commit of the
|
|
37
|
-
* stage, which is where `StageContext.commit` records the stamp (a fork
|
|
38
|
-
* child's repeat and a mount's exit — the bundles with a `phase` — carry
|
|
39
|
-
* none).
|
|
40
|
-
*/
|
|
41
|
-
function tagsAt(log, stop) {
|
|
42
|
-
const raw = log[stop.commitIdx]?.tags;
|
|
43
|
-
// A stored row is `unknown[]`-shaped until narrowed: keep only the strings,
|
|
44
|
-
// so a damaged row can never put a non-name into `Stop.meta`.
|
|
45
|
-
const tags = Array.isArray(raw) ? raw.filter((t) => typeof t === 'string') : [];
|
|
46
|
-
return tags.length > 0 ? tags : undefined;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* A {@link TimeTravelStrategy} whose stops are the stages that carry a
|
|
50
|
-
* declared tag.
|
|
51
|
-
*
|
|
52
|
-
* **Keep rule: any-of.** A stop survives when its bundle's `tags` shares at
|
|
53
|
-
* least one name with `tags`; with `tags` omitted (or empty), every tagged
|
|
54
|
-
* stop survives. All-of, or a rule over more than the tags, is a
|
|
55
|
-
* `filterStops` call away — the library owns no vocabulary, so it owns no
|
|
56
|
-
* richer rule either.
|
|
57
|
-
*
|
|
58
|
-
* **Attribution by precedence.** An untagged stage's commits fold into the
|
|
59
|
-
* tagged stop BEFORE it (what `filterStops` does); the commits before the
|
|
60
|
-
* first tagged stage are absorbed by `'start'`, which then says
|
|
61
|
-
* `prologue: true`. A run with no tagged stage yields the two bookends only.
|
|
62
|
-
*
|
|
63
|
-
* **`meta` is the array.** Each kept stop carries its bundle's full `tags`
|
|
64
|
-
* (not just the ones asked for), so a reader that filtered on
|
|
65
|
-
* `'milestone:llm-turn'` can still see the stage was also `'audit'`.
|
|
66
|
-
*
|
|
67
|
-
* **The equivalence law.** `stateAt(stop)` at every kept stop equals
|
|
68
|
-
* `commitStops`'s fold at the same commit index — a filtering axis moves the
|
|
69
|
-
* stops, never the log.
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* ```typescript
|
|
73
|
-
* import { flowChart } from 'footprintjs';
|
|
74
|
-
* import { tagStops, timeTravel } from 'footprintjs/trace';
|
|
75
|
-
*
|
|
76
|
-
* const chart = flowChart<State>('Seed', seedFn, 'seed')
|
|
77
|
-
* .addFunction('Call model', callFn, 'call-llm')
|
|
78
|
-
* .tag('milestone:llm-turn')
|
|
79
|
-
* .addFunction('Route', routeFn, 'route')
|
|
80
|
-
* .tag('milestone:decision')
|
|
81
|
-
* .build();
|
|
82
|
-
*
|
|
83
|
-
* // …run it, keep the snapshot…
|
|
84
|
-
* const cursor = timeTravel(snapshot, { strategy: tagStops(['milestone:llm-turn']) });
|
|
85
|
-
* cursor.stops.map((s) => s.label); // ['Run start', 'Call model', 'Run end']
|
|
86
|
-
* cursor.stops[1].meta; // ['milestone:llm-turn']
|
|
87
|
-
* cursor.stops[0].prologue; // true — 'seed' ran before the first turn
|
|
88
|
-
* ```
|
|
89
|
-
*/
|
|
90
|
-
function tagStops(tags) {
|
|
91
|
-
const wanted = tags && tags.length > 0 ? new Set(tags) : undefined;
|
|
92
|
-
return {
|
|
93
|
-
stopsFor(commitLog, executionTree, subflowResults) {
|
|
94
|
-
return (0, axis_js_1.filterStops)((0, commitStops_js_1.commitStops)(commitLog, executionTree, subflowResults), (stop) => {
|
|
95
|
-
const stamped = tagsAt(commitLog, stop);
|
|
96
|
-
if (!stamped)
|
|
97
|
-
return null;
|
|
98
|
-
if (wanted && !stamped.some((tag) => wanted.has(tag)))
|
|
99
|
-
return null;
|
|
100
|
-
return { meta: stamped };
|
|
101
|
-
});
|
|
102
|
-
},
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
exports.tagStops = tagStops;
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnU3RvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL3RhZ1N0b3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHOzs7QUFHSCx1Q0FBd0M7QUFDeEMscURBQStDO0FBRy9DOzs7Ozs7R0FNRztBQUNILFNBQVMsTUFBTSxDQUFDLEdBQTRCLEVBQUUsSUFBbUI7SUFDL0QsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUM7SUFDdEMsNEVBQTRFO0lBQzVFLDhEQUE4RDtJQUM5RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzdGLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzVDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Q0c7QUFDSCxTQUFnQixRQUFRLENBQUMsSUFBd0I7SUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ25FLE9BQU87UUFDTCxRQUFRLENBQ04sU0FBa0MsRUFDbEMsYUFBNkIsRUFDN0IsY0FBd0I7WUFFeEIsT0FBTyxJQUFBLHFCQUFXLEVBQW9CLElBQUEsNEJBQVcsRUFBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3BHLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxPQUFPO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUMxQixJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ25FLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFoQkQsNEJBZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0YWdTdG9wcyDigJQgdGhlIHN0b3BzIGEgY2hhcnQgREVDTEFSRUQsIHJlYWQgYmFjayBvZmYgaXRzIGNvbW1pdCBsb2cuXG4gKlxuICogV0hZIFRISVMgRklMRSBFWElTVFMuIGBjb21taXRTdG9wc2AgaXMgdGhlIG9ubHkgc3RvcCBncmFtbWFyIHRoZSBzdWJzdHJhdGVcbiAqIGtub3dzOiBvbmUgc3RvcCBwZXIgZXhlY3V0ZWQgc3RhZ2UuIEV2ZXJ5IHJpY2hlciBheGlzIOKAlCBtaWxlc3RvbmVzLCB0dXJucyxcbiAqIHRvb2wgY2FsbHMg4oCUIHdhcyBhIGNvbnN1bWVyJ3MgY2xhc3NpZmllciBvdmVyIGBydW50aW1lU3RhZ2VJZGA6IGEgc3dpdGNoXG4gKiB0aGF0IHBhcnNlcyBgI2AgYW5kIGAvYCwgbGl2ZXMgb3V0c2lkZSB0aGUgcmVjb3JkaW5nLCBhbmQgZ29lcyBzdGFsZSB3aGVuXG4gKiBhIHN0YWdlIGlzIHJlbmFtZWQuIFNpbmNlIDkuMjEuMCB0aGUgYXV0aG9yIGNhbiBwdXQgTkFNRVMgb24gYSBzdGFnZSBhdFxuICogYnVpbGQgdGltZSAoYEZsb3dDaGFydEJ1aWxkZXIudGFnYCAvIGBvcHRpb25zLnRhZ3NgKSBhbmQgdGhlIGVuZ2luZSBzdGFtcHNcbiAqIHRoZW0gb24gdGhlIHN0YWdlJ3MgY29tbWl0IGJ1bmRsZSAoYENvbW1pdEJ1bmRsZS50YWdzYCkuIFRoaXMgc3RyYXRlZ3lcbiAqIHJlYWRzIHRoZW0gYmFjazogYSBzdG9yZWQgcmVjb3JkaW5nIGZyb20gQU5ZIGNoYXJ0IHNjcnVicyBieSBpdHMgb3duXG4gKiBtaWxlc3RvbmVzLCB3aXRoIG5vIGlkIGNvbnZlbnRpb25zIGluIHRoZSByZWFkZXIuXG4gKlxuICogV0hBVCBJVCBJUy4gT25lIGV4cHJlc3Npb24gb3ZlciBgZmlsdGVyU3RvcHMoY29tbWl0U3RvcHMoLi4uKSlgOiBrZWVwIHRoZVxuICogc3RvcHMgd2hvc2UgRklSU1QgYnVuZGxlIGNhcnJpZXMgYSB0YWcgKGFueSBvZiB0aGUgYXNrZWQtZm9yIG9uZXMsIG9yIGFueVxuICogdGFnIGF0IGFsbCB3aGVuIG5vbmUgYXJlIGFza2VkIGZvciksIGdpdmUgdGhlIHN1cnZpdm9ycyB0aGUgbG9nIGJhY2ssIGFuZFxuICogY2FycnkgdGhlIGJ1bmRsZSdzIHdob2xlIHRhZyBhcnJheSBhcyBgU3RvcC5tZXRhYC4gRXZlcnl0aGluZyBhIGZpbHRlcmluZ1xuICogYXhpcyBvd2VzIOKAlCB0aGUgYm9va2VuZCBndWFyZCwgdGhlIHJlLXBhcnRpdGlvbiBzbyBhIGRyb3BwZWQgc3RhZ2Unc1xuICogY29tbWl0cyBmb2xkIGludG8gdGhlIHRhZ2dlZCBzdG9wIEJFRk9SRSB0aGVtLCBgcHJvbG9ndWVgIG9uIGEgc3RhcnQgdGhhdFxuICogYWJzb3JiZWQgc3RhZ2VzIOKAlCBjb21lcyBmcm9tIGBmaWx0ZXJTdG9wc2AsIHN0YXRlZCBvbmNlLCBpbiBgYXhpcy50c2AuXG4gKlxuICogV0hBVCBJVCBJUyBOT1QuIE5vdCBhIHNlY29uZCB2b2NhYnVsYXJ5OiB0aGUgc3RyaW5ncyBhcmUgdGhlIGNvbnN1bWVyJ3MsXG4gKiBjYXJyaWVkIHZlcmJhdGltLiBOb3QgYSBkZXJpdmF0aW9uOiBhIHN0YWdlIHdpdGggbm8gZGVjbGFyZWQgdGFnIGdldHMgbm9cbiAqIHN0b3AgaGVyZSwgaG93ZXZlciByZWNvZ25pc2FibGUgaXRzIGlkIOKAlCBhIHJlYWRlciB0aGF0IHdhbnRzIGlkcyBjbGFzc2lmaWVkXG4gKiB3cml0ZXMgdGhhdCBrZWVwIHJ1bGUgaXRzZWxmIChgZmlsdGVyU3RvcHNgKSwgb3IgcmVhZHMgdGhlIGZvbGRcbiAqIChgc3RhdGVBdGApIGFuZCBrZWVwcyBieSB3aGF0IGNoYW5nZWQuIEFuZCBub3QgYSByZS13YWxrOiBvbmx5IGEgdGFnIHRoZVxuICogZW5naW5lIGFjdHVhbGx5IHN0YW1wZWQgY2FuIHB1dCBhIHN0b3Agb24gdGhpcyBheGlzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBFeGVjdXRpb25UcmVlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IGZpbHRlclN0b3BzIH0gZnJvbSAnLi9heGlzLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0b3BzIH0gZnJvbSAnLi9jb21taXRTdG9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0b3AsIFRpbWVUcmF2ZWxTdHJhdGVneSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSB0YWdzIGEgc3RvcCdzIGZpcnN0IGJ1bmRsZSBjYXJyaWVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhcnJpZXNcbiAqIG5vbmUuIFJlYWRzIHRoZSBidW5kbGUgYXQgYHN0b3AuY29tbWl0SWR4YCDigJQgdGhlIEZJUlNUIGNvbW1pdCBvZiB0aGVcbiAqIHN0YWdlLCB3aGljaCBpcyB3aGVyZSBgU3RhZ2VDb250ZXh0LmNvbW1pdGAgcmVjb3JkcyB0aGUgc3RhbXAgKGEgZm9ya1xuICogY2hpbGQncyByZXBlYXQgYW5kIGEgbW91bnQncyBleGl0IOKAlCB0aGUgYnVuZGxlcyB3aXRoIGEgYHBoYXNlYCDigJQgY2FycnlcbiAqIG5vbmUpLlxuICovXG5mdW5jdGlvbiB0YWdzQXQobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwgc3RvcDogU3RvcDx1bmtub3duPik6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gbG9nW3N0b3AuY29tbWl0SWR4XT8udGFncztcbiAgLy8gQSBzdG9yZWQgcm93IGlzIGB1bmtub3duW11gLXNoYXBlZCB1bnRpbCBuYXJyb3dlZDoga2VlcCBvbmx5IHRoZSBzdHJpbmdzLFxuICAvLyBzbyBhIGRhbWFnZWQgcm93IGNhbiBuZXZlciBwdXQgYSBub24tbmFtZSBpbnRvIGBTdG9wLm1ldGFgLlxuICBjb25zdCB0YWdzID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3LmZpbHRlcigodCk6IHQgaXMgc3RyaW5nID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJykgOiBbXTtcbiAgcmV0dXJuIHRhZ3MubGVuZ3RoID4gMCA/IHRhZ3MgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgVGltZVRyYXZlbFN0cmF0ZWd5fSB3aG9zZSBzdG9wcyBhcmUgdGhlIHN0YWdlcyB0aGF0IGNhcnJ5IGFcbiAqIGRlY2xhcmVkIHRhZy5cbiAqXG4gKiAqKktlZXAgcnVsZTogYW55LW9mLioqIEEgc3RvcCBzdXJ2aXZlcyB3aGVuIGl0cyBidW5kbGUncyBgdGFnc2Agc2hhcmVzIGF0XG4gKiBsZWFzdCBvbmUgbmFtZSB3aXRoIGB0YWdzYDsgd2l0aCBgdGFnc2Agb21pdHRlZCAob3IgZW1wdHkpLCBldmVyeSB0YWdnZWRcbiAqIHN0b3Agc3Vydml2ZXMuIEFsbC1vZiwgb3IgYSBydWxlIG92ZXIgbW9yZSB0aGFuIHRoZSB0YWdzLCBpcyBhXG4gKiBgZmlsdGVyU3RvcHNgIGNhbGwgYXdheSDigJQgdGhlIGxpYnJhcnkgb3ducyBubyB2b2NhYnVsYXJ5LCBzbyBpdCBvd25zIG5vXG4gKiByaWNoZXIgcnVsZSBlaXRoZXIuXG4gKlxuICogKipBdHRyaWJ1dGlvbiBieSBwcmVjZWRlbmNlLioqIEFuIHVudGFnZ2VkIHN0YWdlJ3MgY29tbWl0cyBmb2xkIGludG8gdGhlXG4gKiB0YWdnZWQgc3RvcCBCRUZPUkUgaXQgKHdoYXQgYGZpbHRlclN0b3BzYCBkb2VzKTsgdGhlIGNvbW1pdHMgYmVmb3JlIHRoZVxuICogZmlyc3QgdGFnZ2VkIHN0YWdlIGFyZSBhYnNvcmJlZCBieSBgJ3N0YXJ0J2AsIHdoaWNoIHRoZW4gc2F5c1xuICogYHByb2xvZ3VlOiB0cnVlYC4gQSBydW4gd2l0aCBubyB0YWdnZWQgc3RhZ2UgeWllbGRzIHRoZSB0d28gYm9va2VuZHMgb25seS5cbiAqXG4gKiAqKmBtZXRhYCBpcyB0aGUgYXJyYXkuKiogRWFjaCBrZXB0IHN0b3AgY2FycmllcyBpdHMgYnVuZGxlJ3MgZnVsbCBgdGFnc2BcbiAqIChub3QganVzdCB0aGUgb25lcyBhc2tlZCBmb3IpLCBzbyBhIHJlYWRlciB0aGF0IGZpbHRlcmVkIG9uXG4gKiBgJ21pbGVzdG9uZTpsbG0tdHVybidgIGNhbiBzdGlsbCBzZWUgdGhlIHN0YWdlIHdhcyBhbHNvIGAnYXVkaXQnYC5cbiAqXG4gKiAqKlRoZSBlcXVpdmFsZW5jZSBsYXcuKiogYHN0YXRlQXQoc3RvcClgIGF0IGV2ZXJ5IGtlcHQgc3RvcCBlcXVhbHNcbiAqIGBjb21taXRTdG9wc2AncyBmb2xkIGF0IHRoZSBzYW1lIGNvbW1pdCBpbmRleCDigJQgYSBmaWx0ZXJpbmcgYXhpcyBtb3ZlcyB0aGVcbiAqIHN0b3BzLCBuZXZlciB0aGUgbG9nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBmbG93Q2hhcnQgfSBmcm9tICdmb290cHJpbnRqcyc7XG4gKiBpbXBvcnQgeyB0YWdTdG9wcywgdGltZVRyYXZlbCB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbiAqXG4gKiBjb25zdCBjaGFydCA9IGZsb3dDaGFydDxTdGF0ZT4oJ1NlZWQnLCBzZWVkRm4sICdzZWVkJylcbiAqICAgLmFkZEZ1bmN0aW9uKCdDYWxsIG1vZGVsJywgY2FsbEZuLCAnY2FsbC1sbG0nKVxuICogICAudGFnKCdtaWxlc3RvbmU6bGxtLXR1cm4nKVxuICogICAuYWRkRnVuY3Rpb24oJ1JvdXRlJywgcm91dGVGbiwgJ3JvdXRlJylcbiAqICAgLnRhZygnbWlsZXN0b25lOmRlY2lzaW9uJylcbiAqICAgLmJ1aWxkKCk7XG4gKlxuICogLy8g4oCmcnVuIGl0LCBrZWVwIHRoZSBzbmFwc2hvdOKAplxuICogY29uc3QgY3Vyc29yID0gdGltZVRyYXZlbChzbmFwc2hvdCwgeyBzdHJhdGVneTogdGFnU3RvcHMoWydtaWxlc3RvbmU6bGxtLXR1cm4nXSkgfSk7XG4gKiBjdXJzb3Iuc3RvcHMubWFwKChzKSA9PiBzLmxhYmVsKTsgICAvLyBbJ1J1biBzdGFydCcsICdDYWxsIG1vZGVsJywgJ1J1biBlbmQnXVxuICogY3Vyc29yLnN0b3BzWzFdLm1ldGE7ICAgICAgICAgICAgICAgLy8gWydtaWxlc3RvbmU6bGxtLXR1cm4nXVxuICogY3Vyc29yLnN0b3BzWzBdLnByb2xvZ3VlOyAgICAgICAgICAgLy8gdHJ1ZSDigJQgJ3NlZWQnIHJhbiBiZWZvcmUgdGhlIGZpcnN0IHR1cm5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnU3RvcHModGFncz86IHJlYWRvbmx5IHN0cmluZ1tdKTogVGltZVRyYXZlbFN0cmF0ZWd5PHJlYWRvbmx5IHN0cmluZ1tdPiB7XG4gIGNvbnN0IHdhbnRlZCA9IHRhZ3MgJiYgdGFncy5sZW5ndGggPiAwID8gbmV3IFNldCh0YWdzKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBzdG9wc0ZvcihcbiAgICAgIGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sXG4gICAgICBleGVjdXRpb25UcmVlPzogRXhlY3V0aW9uVHJlZSxcbiAgICAgIHN1YmZsb3dSZXN1bHRzPzogdW5rbm93bixcbiAgICApOiBTdG9wPHJlYWRvbmx5IHN0cmluZ1tdPltdIHtcbiAgICAgIHJldHVybiBmaWx0ZXJTdG9wczxyZWFkb25seSBzdHJpbmdbXT4oY29tbWl0U3RvcHMoY29tbWl0TG9nLCBleGVjdXRpb25UcmVlLCBzdWJmbG93UmVzdWx0cyksIChzdG9wKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YW1wZWQgPSB0YWdzQXQoY29tbWl0TG9nLCBzdG9wKTtcbiAgICAgICAgaWYgKCFzdGFtcGVkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHdhbnRlZCAmJiAhc3RhbXBlZC5zb21lKCh0YWcpID0+IHdhbnRlZC5oYXModGFnKSkpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4geyBtZXRhOiBzdGFtcGVkIH07XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuIl19
|