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,247 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* slice/forwardSliceForKey.ts — the FORWARD half of variable-first slicing.
|
|
4
|
-
*
|
|
5
|
-
* `sliceForKey` answers "why is `key` what it is?" by walking backward from
|
|
6
|
-
* the value to its causes. This file answers the opposite question, which no
|
|
7
|
-
* query answered before: **"who READ this value, and what did it FEED?"**
|
|
8
|
-
* (the production shape: *who read `recipeId`, and what did it feed?* — one
|
|
9
|
-
* query, not a manual scan of a trace viewer).
|
|
10
|
-
*
|
|
11
|
-
* ## The algorithm: LIVE RANGES, not steps
|
|
12
|
-
*
|
|
13
|
-
* A backward slice hops writer→writer. Forward, the unit is a value's LIFE:
|
|
14
|
-
*
|
|
15
|
-
* 1. Anchor at a write of `key` — the SAME anchor idiom as `sliceForKey`
|
|
16
|
-
* (the last writer, or the last writer before `before`).
|
|
17
|
-
* 2. That value lives until the key's NEXT write (`nextWriteIdx`). Every
|
|
18
|
-
* stage that READ `key` inside that window saw THIS value — a `read`.
|
|
19
|
-
* (9.33.0: a write that reached the key only through paths INSIDE it — a
|
|
20
|
-
* subflow seed, an outputMapper merge-back — changed part of the value
|
|
21
|
-
* and does NOT end its life: a reader after it still read the rest. Every
|
|
22
|
-
* life such a write starts or crosses carries a `'nested-rows'` note.)
|
|
23
|
-
* 3. A reading stage that also WROTE something carried the value onward —
|
|
24
|
-
* a `fed` edge to that write, which is itself the start of a new life.
|
|
25
|
-
* 4. Descend into fed lives breadth-first (visited-set guarded, budgeted).
|
|
26
|
-
*
|
|
27
|
-
* ### LAW — the live range is `(writeIdx, nextWriteIdx]`
|
|
28
|
-
*
|
|
29
|
-
* Open at the bottom, CLOSED at the top, and both ends follow from the
|
|
30
|
-
* engine's event order (`onRead` fires PRE-commit — see CLAUDE.md):
|
|
31
|
-
* - a read by the writing stage itself (`readIdx === writeIdx`) saw the
|
|
32
|
-
* PREVIOUS value: read-modify-write reads belong to the previous life;
|
|
33
|
-
* - a read by the OVERWRITING stage (`readIdx === nextWriteIdx`) also fired
|
|
34
|
-
* before its commit, so it still saw THIS value.
|
|
35
|
-
* A read after that commit attributes to the NEW write, never the old one.
|
|
36
|
-
* (Granularity limit, stated because it cannot be seen: a stage that writes
|
|
37
|
-
* `key` and then re-reads it within the SAME stage read its own value; at
|
|
38
|
-
* commit-index resolution that read is indistinguishable from the one that
|
|
39
|
-
* opened the stage.)
|
|
40
|
-
*
|
|
41
|
-
* ### LAW — a `fed` edge is EXACT only under recorded read provenance
|
|
42
|
-
*
|
|
43
|
-
* With `writeProvenance: 'reads-prefix'` on, the child write's
|
|
44
|
-
* `TraceEntry.readKeys` names the keys read before it: this key IN that list
|
|
45
|
-
* is an exact edge (`basis: 'per-write'`), and this key ABSENT from it is an
|
|
46
|
-
* exact *exclusion* — no edge at all. With the dial off there is no such
|
|
47
|
-
* evidence, only "the stage read this and wrote that": the edge is stamped
|
|
48
|
-
* `basis: 'stage'` and the slice carries a `'conservative-fed-edges'` note.
|
|
49
|
-
* A conservative edge is never presented as an exact one.
|
|
50
|
-
*
|
|
51
|
-
* Budgets mirror `causalChain`'s (maxDepth 20, maxNodes 100) and a cut is
|
|
52
|
-
* STATED — `root.truncated` plus a `'truncated'` note.
|
|
53
|
-
*
|
|
54
|
-
* DAG position: memory ← slice. Imports memory/ only (see README.md).
|
|
55
|
-
*/
|
|
56
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
-
exports.forwardSliceForKey = void 0;
|
|
58
|
-
const keyPaths_js_1 = require("../memory/keyPaths.js");
|
|
59
|
-
const utils_js_1 = require("../memory/utils.js");
|
|
60
|
-
const keyIndex_js_1 = require("./keyIndex.js");
|
|
61
|
-
const keysReadSources_js_1 = require("./keysReadSources.js");
|
|
62
|
-
const sliceForKey_js_1 = require("./sliceForKey.js");
|
|
63
|
-
/** Identity of one value life: (write position, key). Never parsed. */
|
|
64
|
-
function nodeKey(commitIdx, key) {
|
|
65
|
-
return `${commitIdx ?? 'pre-run'}${utils_js_1.DELIM}${key}`;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Build the node for ONE value life. `writeIdx === undefined` is the pre-run
|
|
69
|
-
* origin: the value was already there before the log's first write of the
|
|
70
|
-
* key, so the writer identity fields stay ABSENT rather than fabricated.
|
|
71
|
-
*/
|
|
72
|
-
function makeNode(commitLog, index, key, writeIdx, depth) {
|
|
73
|
-
// A life ends at the next write that replaces the value — never at one that only wrote a path INSIDE the
|
|
74
|
-
// key (a seed, a merge-back): a reader after that one still read the rest of this value.
|
|
75
|
-
const writes = index.closingWritesOf(key);
|
|
76
|
-
if (writeIdx === undefined) {
|
|
77
|
-
const firstWrite = writes?.[0];
|
|
78
|
-
return {
|
|
79
|
-
key,
|
|
80
|
-
origin: 'pre-run',
|
|
81
|
-
...(firstWrite !== undefined && { nextWriteIdx: firstWrite }),
|
|
82
|
-
depth,
|
|
83
|
-
reads: [],
|
|
84
|
-
fedEdges: [],
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
const bundle = commitLog[writeIdx];
|
|
88
|
-
const entry = (0, keyIndex_js_1.writeEntry)(bundle, key);
|
|
89
|
-
const next = (0, keyIndex_js_1.firstIndexAfter)(writes, writeIdx);
|
|
90
|
-
return {
|
|
91
|
-
key,
|
|
92
|
-
origin: 'write',
|
|
93
|
-
runtimeStageId: bundle.runtimeStageId,
|
|
94
|
-
stageId: bundle.stageId,
|
|
95
|
-
stageName: bundle.stage,
|
|
96
|
-
commitIdx: writeIdx,
|
|
97
|
-
...(entry !== undefined && { verb: entry.verb }),
|
|
98
|
-
...(next !== undefined && { nextWriteIdx: next }),
|
|
99
|
-
depth,
|
|
100
|
-
reads: [],
|
|
101
|
-
fedEdges: [],
|
|
102
|
-
// Untracked-read honesty rides through from the bundle exactly as
|
|
103
|
-
// causalChain stamps CausalNode.incompleteSources.
|
|
104
|
-
...(bundle.untrackedSources !== undefined &&
|
|
105
|
-
bundle.untrackedSources.length > 0 && { incompleteSources: bundle.untrackedSources }),
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Forward slice for one state key: who read this value, and what did it feed?
|
|
110
|
-
*
|
|
111
|
-
* @param commitLog Ordered commit bundles — `getSnapshot().commitLog`.
|
|
112
|
-
* @param key A {@link StateKey}: the plain key string, or a path array
|
|
113
|
-
* (normalised through the SAME `normaliseStateKey` the backward door uses,
|
|
114
|
-
* so both doors accept identical inputs).
|
|
115
|
-
* @param keysRead A {@link KeysReadSource} strategy or a bare lookup — the
|
|
116
|
-
* same reads providers `sliceForKey` takes. Reads are not in the commit
|
|
117
|
-
* log; without a provider a forward walk can see nothing, which the
|
|
118
|
-
* `'reads-not-recorded'` note says out loud.
|
|
119
|
-
* @returns Always a {@link ForwardSlice}. Absence is a RESULT with a reason
|
|
120
|
-
* and, for an unknown key, a bounded list of the keys the log does know.
|
|
121
|
-
*/
|
|
122
|
-
function forwardSliceForKey(commitLog, key, keysRead, options) {
|
|
123
|
-
const source = (0, keysReadSources_js_1.resolveKeysReadSource)(keysRead);
|
|
124
|
-
const normalisedKey = (0, sliceForKey_js_1.normaliseStateKey)(key);
|
|
125
|
-
const base = {
|
|
126
|
-
key: normalisedKey,
|
|
127
|
-
...(options?.before !== undefined && { before: options.before }),
|
|
128
|
-
keysReadKind: source.kind,
|
|
129
|
-
...(source.coverage !== undefined && { readsCoverage: source.coverage }),
|
|
130
|
-
};
|
|
131
|
-
if (commitLog.length === 0)
|
|
132
|
-
return { ...base, missing: 'empty-log', notes: [] };
|
|
133
|
-
const index = (0, keyIndex_js_1.buildKeyIndex)(commitLog, source.lookup);
|
|
134
|
-
const readsRecorded = (0, keyIndex_js_1.hasRecordedReads)(index);
|
|
135
|
-
const notes = [];
|
|
136
|
-
// ── The typo guard, split by what the recording affords ────────────────
|
|
137
|
-
// Unknown key + reads ARE recorded → the log can see readers and this key
|
|
138
|
-
// has none: honest absence with a named reason, no fabricated life.
|
|
139
|
-
// Unknown key + NO reads recorded → a typo and a seeded-but-unread key are
|
|
140
|
-
// genuinely indistinguishable; the pre-run life below is the only honest
|
|
141
|
-
// answer, and it must carry BOTH notes so nobody reads it as "unread".
|
|
142
|
-
const known = index.isKnown(normalisedKey);
|
|
143
|
-
if (!known) {
|
|
144
|
-
notes.push((0, keyIndex_js_1.unknownKeyNote)(index, normalisedKey));
|
|
145
|
-
if (readsRecorded)
|
|
146
|
-
return { ...base, missing: 'never-written', notes };
|
|
147
|
-
}
|
|
148
|
-
if (!readsRecorded)
|
|
149
|
-
notes.push((0, keyIndex_js_1.readsNotRecordedNote)());
|
|
150
|
-
const maxDepth = options?.maxDepth ?? 20;
|
|
151
|
-
const maxNodes = options?.maxNodes ?? 100;
|
|
152
|
-
const nodes = new Map();
|
|
153
|
-
let created = 0;
|
|
154
|
-
let truncatedByDepth = false;
|
|
155
|
-
let truncatedByNodes = false;
|
|
156
|
-
let anyConservative = false;
|
|
157
|
-
const anchorIdx = (0, keyIndex_js_1.lastIndexBefore)(index.writesOf(normalisedKey), options?.before);
|
|
158
|
-
const root = makeNode(commitLog, index, normalisedKey, anchorIdx, 0);
|
|
159
|
-
nodes.set(nodeKey(anchorIdx, normalisedKey), root);
|
|
160
|
-
created = 1;
|
|
161
|
-
const queue = [root];
|
|
162
|
-
while (queue.length > 0) {
|
|
163
|
-
const node = queue.shift();
|
|
164
|
-
// Live range: open below the write, CLOSED at the next write (see LAW).
|
|
165
|
-
const from = node.commitIdx !== undefined ? node.commitIdx + 1 : 0;
|
|
166
|
-
const readers = (0, keyIndex_js_1.indicesInRange)(index.readsOf(node.key), from, node.nextWriteIdx);
|
|
167
|
-
if (node.depth >= maxDepth) {
|
|
168
|
-
// Only a life that still HAD readers to expand counts as a cut.
|
|
169
|
-
if (readers.length > 0)
|
|
170
|
-
truncatedByDepth = true;
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
for (const readerIdx of readers) {
|
|
174
|
-
const bundle = commitLog[readerIdx];
|
|
175
|
-
node.reads.push({
|
|
176
|
-
runtimeStageId: bundle.runtimeStageId,
|
|
177
|
-
stageId: bundle.stageId,
|
|
178
|
-
stageName: bundle.stage,
|
|
179
|
-
commitIdx: readerIdx,
|
|
180
|
-
});
|
|
181
|
-
// The reader IS the writer of everything it committed — each written
|
|
182
|
-
// path is a candidate `fed` edge.
|
|
183
|
-
for (const path of (0, keyIndex_js_1.writtenPaths)(bundle)) {
|
|
184
|
-
const entry = (0, keyIndex_js_1.lastTraceEntry)(bundle, path);
|
|
185
|
-
let basis;
|
|
186
|
-
if (entry?.readKeys !== undefined) {
|
|
187
|
-
// EXACT both ways: recorded provenance can include or EXCLUDE. A read
|
|
188
|
-
// on the key, inside it or around it is a read of its value.
|
|
189
|
-
if (!entry.readKeys.some((read) => (0, keyPaths_js_1.relation)(read, node.key) !== undefined))
|
|
190
|
-
continue;
|
|
191
|
-
basis = 'per-write';
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
basis = 'stage';
|
|
195
|
-
anyConservative = true;
|
|
196
|
-
}
|
|
197
|
-
const id = nodeKey(readerIdx, path);
|
|
198
|
-
let child = nodes.get(id);
|
|
199
|
-
if (!child) {
|
|
200
|
-
if (created >= maxNodes) {
|
|
201
|
-
truncatedByNodes = true;
|
|
202
|
-
continue;
|
|
203
|
-
}
|
|
204
|
-
child = makeNode(commitLog, index, path, readerIdx, node.depth + 1);
|
|
205
|
-
nodes.set(id, child);
|
|
206
|
-
created++;
|
|
207
|
-
queue.push(child);
|
|
208
|
-
}
|
|
209
|
-
// One edge per distinct child life (a stage reads a key once).
|
|
210
|
-
if (!node.fedEdges.some((e) => e.child === child))
|
|
211
|
-
node.fedEdges.push({ child, basis });
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
// ── Honesty envelope, deterministic order ─────────────────────────────
|
|
216
|
-
if (root.origin === 'pre-run')
|
|
217
|
-
notes.push((0, keyIndex_js_1.preRunOriginNote)(normalisedKey));
|
|
218
|
-
// Every life a write INSIDE its key starts or crosses — the anchor's, a pre-run life's, a child's — says so.
|
|
219
|
-
const partial = new Map();
|
|
220
|
-
for (const node of nodes.values()) {
|
|
221
|
-
const start = node.commitIdx ?? -1;
|
|
222
|
-
const crossed = index
|
|
223
|
-
.writesOf(node.key)
|
|
224
|
-
.filter((c) => (c === start || c > start) && (node.nextWriteIdx === undefined || c < node.nextWriteIdx));
|
|
225
|
-
for (const c of (0, keyIndex_js_1.nestedOnlyWrites)(commitLog, node.key, crossed)) {
|
|
226
|
-
const set = partial.get(node.key) ?? new Set();
|
|
227
|
-
set.add(c);
|
|
228
|
-
partial.set(node.key, set);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
for (const [key, commits] of partial)
|
|
232
|
-
notes.push((0, keyIndex_js_1.nestedRowsNote)(key, [...commits].sort((a, b) => a - b)));
|
|
233
|
-
if (anyConservative)
|
|
234
|
-
notes.push((0, keyIndex_js_1.conservativeEdgesNote)(normalisedKey));
|
|
235
|
-
if (truncatedByDepth || truncatedByNodes) {
|
|
236
|
-
root.truncated = { byDepth: truncatedByDepth, byNodes: truncatedByNodes };
|
|
237
|
-
notes.push((0, keyIndex_js_1.truncatedNote)(truncatedByDepth, truncatedByNodes));
|
|
238
|
-
}
|
|
239
|
-
return {
|
|
240
|
-
...base,
|
|
241
|
-
...(anchorIdx !== undefined && { writer: commitLog[anchorIdx] }),
|
|
242
|
-
root,
|
|
243
|
-
notes,
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
exports.forwardSliceForKey = forwardSliceForKey;
|
|
247
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yd2FyZFNsaWNlRm9yS2V5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zbGljZS9mb3J3YXJkU2xpY2VGb3JLZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFERzs7O0FBR0gsdURBQWlEO0FBRWpELGlEQUEyQztBQUMzQywrQ0FpQnVCO0FBQ3ZCLDZEQUE2RDtBQUM3RCxxREFBcUQ7QUFvQnJELHVFQUF1RTtBQUN2RSxTQUFTLE9BQU8sQ0FBQyxTQUE2QixFQUFFLEdBQVc7SUFDekQsT0FBTyxHQUFHLFNBQVMsSUFBSSxTQUFTLEdBQUcsZ0JBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUNmLFNBQXlCLEVBQ3pCLEtBQWUsRUFDZixHQUFXLEVBQ1gsUUFBNEIsRUFDNUIsS0FBYTtJQUViLHlHQUF5RztJQUN6Ryx5RkFBeUY7SUFDekYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixPQUFPO1lBQ0wsR0FBRztZQUNILE1BQU0sRUFBRSxTQUFTO1lBQ2pCLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQzdELEtBQUs7WUFDTCxLQUFLLEVBQUUsRUFBRTtZQUNULFFBQVEsRUFBRSxFQUFFO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBQSx3QkFB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QUFTLEdBQUcsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDMUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFBLDJCQUFhLEVBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxJQUFJO1FBQ1AsR0FBRyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDaEUsSUFBSTtRQUNKLEtBQUs7S0FDTixDQUFDO0FBQ0osQ0FBQztBQXpJRCxnREF5SUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNsaWNlL2ZvcndhcmRTbGljZUZvcktleS50cyDigJQgdGhlIEZPUldBUkQgaGFsZiBvZiB2YXJpYWJsZS1maXJzdCBzbGljaW5nLlxuICpcbiAqIGBzbGljZUZvcktleWAgYW5zd2VycyBcIndoeSBpcyBga2V5YCB3aGF0IGl0IGlzP1wiIGJ5IHdhbGtpbmcgYmFja3dhcmQgZnJvbVxuICogdGhlIHZhbHVlIHRvIGl0cyBjYXVzZXMuIFRoaXMgZmlsZSBhbnN3ZXJzIHRoZSBvcHBvc2l0ZSBxdWVzdGlvbiwgd2hpY2ggbm9cbiAqIHF1ZXJ5IGFuc3dlcmVkIGJlZm9yZTogKipcIndobyBSRUFEIHRoaXMgdmFsdWUsIGFuZCB3aGF0IGRpZCBpdCBGRUVEP1wiKipcbiAqICh0aGUgcHJvZHVjdGlvbiBzaGFwZTogKndobyByZWFkIGByZWNpcGVJZGAsIGFuZCB3aGF0IGRpZCBpdCBmZWVkPyog4oCUIG9uZVxuICogcXVlcnksIG5vdCBhIG1hbnVhbCBzY2FuIG9mIGEgdHJhY2Ugdmlld2VyKS5cbiAqXG4gKiAjIyBUaGUgYWxnb3JpdGhtOiBMSVZFIFJBTkdFUywgbm90IHN0ZXBzXG4gKlxuICogQSBiYWNrd2FyZCBzbGljZSBob3BzIHdyaXRlcuKGkndyaXRlci4gRm9yd2FyZCwgdGhlIHVuaXQgaXMgYSB2YWx1ZSdzIExJRkU6XG4gKlxuICogMS4gQW5jaG9yIGF0IGEgd3JpdGUgb2YgYGtleWAg4oCUIHRoZSBTQU1FIGFuY2hvciBpZGlvbSBhcyBgc2xpY2VGb3JLZXlgXG4gKiAgICAodGhlIGxhc3Qgd3JpdGVyLCBvciB0aGUgbGFzdCB3cml0ZXIgYmVmb3JlIGBiZWZvcmVgKS5cbiAqIDIuIFRoYXQgdmFsdWUgbGl2ZXMgdW50aWwgdGhlIGtleSdzIE5FWFQgd3JpdGUgKGBuZXh0V3JpdGVJZHhgKS4gRXZlcnlcbiAqICAgIHN0YWdlIHRoYXQgUkVBRCBga2V5YCBpbnNpZGUgdGhhdCB3aW5kb3cgc2F3IFRISVMgdmFsdWUg4oCUIGEgYHJlYWRgLlxuICogICAgKDkuMzMuMDogYSB3cml0ZSB0aGF0IHJlYWNoZWQgdGhlIGtleSBvbmx5IHRocm91Z2ggcGF0aHMgSU5TSURFIGl0IOKAlCBhXG4gKiAgICBzdWJmbG93IHNlZWQsIGFuIG91dHB1dE1hcHBlciBtZXJnZS1iYWNrIOKAlCBjaGFuZ2VkIHBhcnQgb2YgdGhlIHZhbHVlXG4gKiAgICBhbmQgZG9lcyBOT1QgZW5kIGl0cyBsaWZlOiBhIHJlYWRlciBhZnRlciBpdCBzdGlsbCByZWFkIHRoZSByZXN0LiBFdmVyeVxuICogICAgbGlmZSBzdWNoIGEgd3JpdGUgc3RhcnRzIG9yIGNyb3NzZXMgY2FycmllcyBhIGAnbmVzdGVkLXJvd3MnYCBub3RlLilcbiAqIDMuIEEgcmVhZGluZyBzdGFnZSB0aGF0IGFsc28gV1JPVEUgc29tZXRoaW5nIGNhcnJpZWQgdGhlIHZhbHVlIG9ud2FyZCDigJRcbiAqICAgIGEgYGZlZGAgZWRnZSB0byB0aGF0IHdyaXRlLCB3aGljaCBpcyBpdHNlbGYgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpZmUuXG4gKiA0LiBEZXNjZW5kIGludG8gZmVkIGxpdmVzIGJyZWFkdGgtZmlyc3QgKHZpc2l0ZWQtc2V0IGd1YXJkZWQsIGJ1ZGdldGVkKS5cbiAqXG4gKiAjIyMgTEFXIOKAlCB0aGUgbGl2ZSByYW5nZSBpcyBgKHdyaXRlSWR4LCBuZXh0V3JpdGVJZHhdYFxuICpcbiAqIE9wZW4gYXQgdGhlIGJvdHRvbSwgQ0xPU0VEIGF0IHRoZSB0b3AsIGFuZCBib3RoIGVuZHMgZm9sbG93IGZyb20gdGhlXG4gKiBlbmdpbmUncyBldmVudCBvcmRlciAoYG9uUmVhZGAgZmlyZXMgUFJFLWNvbW1pdCDigJQgc2VlIENMQVVERS5tZCk6XG4gKiAtIGEgcmVhZCBieSB0aGUgd3JpdGluZyBzdGFnZSBpdHNlbGYgKGByZWFkSWR4ID09PSB3cml0ZUlkeGApIHNhdyB0aGVcbiAqICAgUFJFVklPVVMgdmFsdWU6IHJlYWQtbW9kaWZ5LXdyaXRlIHJlYWRzIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgbGlmZTtcbiAqIC0gYSByZWFkIGJ5IHRoZSBPVkVSV1JJVElORyBzdGFnZSAoYHJlYWRJZHggPT09IG5leHRXcml0ZUlkeGApIGFsc28gZmlyZWRcbiAqICAgYmVmb3JlIGl0cyBjb21taXQsIHNvIGl0IHN0aWxsIHNhdyBUSElTIHZhbHVlLlxuICogQSByZWFkIGFmdGVyIHRoYXQgY29tbWl0IGF0dHJpYnV0ZXMgdG8gdGhlIE5FVyB3cml0ZSwgbmV2ZXIgdGhlIG9sZCBvbmUuXG4gKiAoR3JhbnVsYXJpdHkgbGltaXQsIHN0YXRlZCBiZWNhdXNlIGl0IGNhbm5vdCBiZSBzZWVuOiBhIHN0YWdlIHRoYXQgd3JpdGVzXG4gKiBga2V5YCBhbmQgdGhlbiByZS1yZWFkcyBpdCB3aXRoaW4gdGhlIFNBTUUgc3RhZ2UgcmVhZCBpdHMgb3duIHZhbHVlOyBhdFxuICogY29tbWl0LWluZGV4IHJlc29sdXRpb24gdGhhdCByZWFkIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIG9uZSB0aGF0XG4gKiBvcGVuZWQgdGhlIHN0YWdlLilcbiAqXG4gKiAjIyMgTEFXIOKAlCBhIGBmZWRgIGVkZ2UgaXMgRVhBQ1Qgb25seSB1bmRlciByZWNvcmRlZCByZWFkIHByb3ZlbmFuY2VcbiAqXG4gKiBXaXRoIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBvbiwgdGhlIGNoaWxkIHdyaXRlJ3NcbiAqIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCBuYW1lcyB0aGUga2V5cyByZWFkIGJlZm9yZSBpdDogdGhpcyBrZXkgSU4gdGhhdCBsaXN0XG4gKiBpcyBhbiBleGFjdCBlZGdlIChgYmFzaXM6ICdwZXItd3JpdGUnYCksIGFuZCB0aGlzIGtleSBBQlNFTlQgZnJvbSBpdCBpcyBhblxuICogZXhhY3QgKmV4Y2x1c2lvbiog4oCUIG5vIGVkZ2UgYXQgYWxsLiBXaXRoIHRoZSBkaWFsIG9mZiB0aGVyZSBpcyBubyBzdWNoXG4gKiBldmlkZW5jZSwgb25seSBcInRoZSBzdGFnZSByZWFkIHRoaXMgYW5kIHdyb3RlIHRoYXRcIjogdGhlIGVkZ2UgaXMgc3RhbXBlZFxuICogYGJhc2lzOiAnc3RhZ2UnYCBhbmQgdGhlIHNsaWNlIGNhcnJpZXMgYSBgJ2NvbnNlcnZhdGl2ZS1mZWQtZWRnZXMnYCBub3RlLlxuICogQSBjb25zZXJ2YXRpdmUgZWRnZSBpcyBuZXZlciBwcmVzZW50ZWQgYXMgYW4gZXhhY3Qgb25lLlxuICpcbiAqIEJ1ZGdldHMgbWlycm9yIGBjYXVzYWxDaGFpbmAncyAobWF4RGVwdGggMjAsIG1heE5vZGVzIDEwMCkgYW5kIGEgY3V0IGlzXG4gKiBTVEFURUQg4oCUIGByb290LnRydW5jYXRlZGAgcGx1cyBhIGAndHJ1bmNhdGVkJ2Agbm90ZS5cbiAqXG4gKiBEQUcgcG9zaXRpb246IG1lbW9yeSDihpAgc2xpY2UuIEltcG9ydHMgbWVtb3J5LyBvbmx5IChzZWUgUkVBRE1FLm1kKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEtleXNSZWFkTG9va3VwIH0gZnJvbSAnLi4vbWVtb3J5L2JhY2t0cmFjay5qcyc7XG5pbXBvcnQgeyByZWxhdGlvbiB9IGZyb20gJy4uL21lbW9yeS9rZXlQYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgeyBERUxJTSB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEtleUluZGV4LFxuICBidWlsZEtleUluZGV4LFxuICBjb25zZXJ2YXRpdmVFZGdlc05vdGUsXG4gIGZpcnN0SW5kZXhBZnRlcixcbiAgaGFzUmVjb3JkZWRSZWFkcyxcbiAgaW5kaWNlc0luUmFuZ2UsXG4gIGxhc3RJbmRleEJlZm9yZSxcbiAgbGFzdFRyYWNlRW50cnksXG4gIG5lc3RlZE9ubHlXcml0ZXMsXG4gIG5lc3RlZFJvd3NOb3RlLFxuICBwcmVSdW5PcmlnaW5Ob3RlLFxuICByZWFkc05vdFJlY29yZGVkTm90ZSxcbiAgdHJ1bmNhdGVkTm90ZSxcbiAgdW5rbm93bktleU5vdGUsXG4gIHdyaXRlRW50cnksXG4gIHdyaXR0ZW5QYXRocyxcbn0gZnJvbSAnLi9rZXlJbmRleC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlYWRTb3VyY2UgfSBmcm9tICcuL2tleXNSZWFkU291cmNlcy5qcyc7XG5pbXBvcnQgeyBub3JtYWxpc2VTdGF0ZUtleSB9IGZyb20gJy4vc2xpY2VGb3JLZXkuanMnO1xuaW1wb3J0IHR5cGUgeyBGZWRCYXNpcywgRm9yd2FyZE5vZGUsIEZvcndhcmRTbGljZSwgSG9uZXN0eU5vdGUsIEtleXNSZWFkU291cmNlLCBTdGF0ZUtleSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGZvcndhcmRTbGljZUZvcktleX0g4oCUIGFuY2hvcmluZyBwbHVzIHdhbGsgYnVkZ2V0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZFNsaWNlRm9yS2V5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFeGNsdXNpdmUgY29tbWl0LWFycmF5LWluZGV4IHVwcGVyIGJvdW5kIGZvciB0aGUgQU5DSE9SIHNlYXJjaDogZm9sbG93XG4gICAqIHRoZSB2YWx1ZSBhcyBpdCBzdG9vZCBCRUZPUkUgdGhpcyBpZHguIFNhbWUgY29udHJhY3QgYXNcbiAgICogYHNsaWNlRm9yS2V5YCdzIGBiZWZvcmVgIC8gYGZpbmRMYXN0V3JpdGVyYCdzIGBiZWZvcmVJZHhgLlxuICAgKlxuICAgKiBJdCBib3VuZHMgdGhlIGFuY2hvciBPTkxZIOKAlCB0aGUgd2FsayB0aGVuIHJ1bnMgZm9yd2FyZCBwYXN0IGl0LCBiZWNhdXNlXG4gICAqIFwid2hhdCBkaWQgdGhlIHZhbHVlIGF0IHN0ZXAgMTIgZ28gb24gdG8gZmVlZD9cIiBpcyB0aGUgd2hvbGUgcXVlc3Rpb24uXG4gICAqL1xuICBiZWZvcmU/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCBpbiB2YWx1ZS1saXZlcyAoZGVmYXVsdDogMjAg4oCUIGNhdXNhbENoYWluJ3MpLiAqL1xuICBtYXhEZXB0aD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdG90YWwgbm9kZXMgKGRlZmF1bHQ6IDEwMCDigJQgY2F1c2FsQ2hhaW4ncykuICovXG4gIG1heE5vZGVzPzogbnVtYmVyO1xufVxuXG4vKiogSWRlbnRpdHkgb2Ygb25lIHZhbHVlIGxpZmU6ICh3cml0ZSBwb3NpdGlvbiwga2V5KS4gTmV2ZXIgcGFyc2VkLiAqL1xuZnVuY3Rpb24gbm9kZUtleShjb21taXRJZHg6IG51bWJlciB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Y29tbWl0SWR4ID8/ICdwcmUtcnVuJ30ke0RFTElNfSR7a2V5fWA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG5vZGUgZm9yIE9ORSB2YWx1ZSBsaWZlLiBgd3JpdGVJZHggPT09IHVuZGVmaW5lZGAgaXMgdGhlIHByZS1ydW5cbiAqIG9yaWdpbjogdGhlIHZhbHVlIHdhcyBhbHJlYWR5IHRoZXJlIGJlZm9yZSB0aGUgbG9nJ3MgZmlyc3Qgd3JpdGUgb2YgdGhlXG4gKiBrZXksIHNvIHRoZSB3cml0ZXIgaWRlbnRpdHkgZmllbGRzIHN0YXkgQUJTRU5UIHJhdGhlciB0aGFuIGZhYnJpY2F0ZWQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VOb2RlKFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBpbmRleDogS2V5SW5kZXgsXG4gIGtleTogc3RyaW5nLFxuICB3cml0ZUlkeDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBkZXB0aDogbnVtYmVyLFxuKTogRm9yd2FyZE5vZGUge1xuICAvLyBBIGxpZmUgZW5kcyBhdCB0aGUgbmV4dCB3cml0ZSB0aGF0IHJlcGxhY2VzIHRoZSB2YWx1ZSDigJQgbmV2ZXIgYXQgb25lIHRoYXQgb25seSB3cm90ZSBhIHBhdGggSU5TSURFIHRoZVxuICAvLyBrZXkgKGEgc2VlZCwgYSBtZXJnZS1iYWNrKTogYSByZWFkZXIgYWZ0ZXIgdGhhdCBvbmUgc3RpbGwgcmVhZCB0aGUgcmVzdCBvZiB0aGlzIHZhbHVlLlxuICBjb25zdCB3cml0ZXMgPSBpbmRleC5jbG9zaW5nV3JpdGVzT2Yoa2V5KTtcbiAgaWYgKHdyaXRlSWR4ID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBmaXJzdFdyaXRlID0gd3JpdGVzPy5bMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIG9yaWdpbjogJ3ByZS1ydW4nLFxuICAgICAgLi4uKGZpcnN0V3JpdGUgIT09IHVuZGVmaW5lZCAmJiB7IG5leHRXcml0ZUlkeDogZmlyc3RXcml0ZSB9KSxcbiAgICAgIGRlcHRoLFxuICAgICAgcmVhZHM6IFtdLFxuICAgICAgZmVkRWRnZXM6IFtdLFxuICAgIH07XG4gIH1cbiAgY29uc3QgYnVuZGxlID0gY29tbWl0TG9nW3dyaXRlSWR4XTtcbiAgY29uc3QgZW50cnkgPSB3cml0ZUVudHJ5KGJ1bmRsZSwga2V5KTtcbiAgY29uc3QgbmV4dCA9IGZpcnN0SW5kZXhBZnRlcih3cml0ZXMsIHdyaXRlSWR4KTtcbiAgcmV0dXJuIHtcbiAgICBrZXksXG4gICAgb3JpZ2luOiAnd3JpdGUnLFxuICAgIHJ1bnRpbWVTdGFnZUlkOiBidW5kbGUucnVudGltZVN0YWdlSWQsXG4gICAgc3RhZ2VJZDogYnVuZGxlLnN0YWdlSWQsXG4gICAgc3RhZ2VOYW1lOiBidW5kbGUuc3RhZ2UsXG4gICAgY29tbWl0SWR4OiB3cml0ZUlkeCxcbiAgICAuLi4oZW50cnkgIT09IHVuZGVmaW5lZCAmJiB7IHZlcmI6IGVudHJ5LnZlcmIgfSksXG4gICAgLi4uKG5leHQgIT09IHVuZGVmaW5lZCAmJiB7IG5leHRXcml0ZUlkeDogbmV4dCB9KSxcbiAgICBkZXB0aCxcbiAgICByZWFkczogW10sXG4gICAgZmVkRWRnZXM6IFtdLFxuICAgIC8vIFVudHJhY2tlZC1yZWFkIGhvbmVzdHkgcmlkZXMgdGhyb3VnaCBmcm9tIHRoZSBidW5kbGUgZXhhY3RseSBhc1xuICAgIC8vIGNhdXNhbENoYWluIHN0YW1wcyBDYXVzYWxOb2RlLmluY29tcGxldGVTb3VyY2VzLlxuICAgIC4uLihidW5kbGUudW50cmFja2VkU291cmNlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBidW5kbGUudW50cmFja2VkU291cmNlcy5sZW5ndGggPiAwICYmIHsgaW5jb21wbGV0ZVNvdXJjZXM6IGJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIEZvcndhcmQgc2xpY2UgZm9yIG9uZSBzdGF0ZSBrZXk6IHdobyByZWFkIHRoaXMgdmFsdWUsIGFuZCB3aGF0IGRpZCBpdCBmZWVkP1xuICpcbiAqIEBwYXJhbSBjb21taXRMb2cgT3JkZXJlZCBjb21taXQgYnVuZGxlcyDigJQgYGdldFNuYXBzaG90KCkuY29tbWl0TG9nYC5cbiAqIEBwYXJhbSBrZXkgQSB7QGxpbmsgU3RhdGVLZXl9OiB0aGUgcGxhaW4ga2V5IHN0cmluZywgb3IgYSBwYXRoIGFycmF5XG4gKiAgIChub3JtYWxpc2VkIHRocm91Z2ggdGhlIFNBTUUgYG5vcm1hbGlzZVN0YXRlS2V5YCB0aGUgYmFja3dhcmQgZG9vciB1c2VzLFxuICogICBzbyBib3RoIGRvb3JzIGFjY2VwdCBpZGVudGljYWwgaW5wdXRzKS5cbiAqIEBwYXJhbSBrZXlzUmVhZCBBIHtAbGluayBLZXlzUmVhZFNvdXJjZX0gc3RyYXRlZ3kgb3IgYSBiYXJlIGxvb2t1cCDigJQgdGhlXG4gKiAgIHNhbWUgcmVhZHMgcHJvdmlkZXJzIGBzbGljZUZvcktleWAgdGFrZXMuIFJlYWRzIGFyZSBub3QgaW4gdGhlIGNvbW1pdFxuICogICBsb2c7IHdpdGhvdXQgYSBwcm92aWRlciBhIGZvcndhcmQgd2FsayBjYW4gc2VlIG5vdGhpbmcsIHdoaWNoIHRoZVxuICogICBgJ3JlYWRzLW5vdC1yZWNvcmRlZCdgIG5vdGUgc2F5cyBvdXQgbG91ZC5cbiAqIEByZXR1cm5zIEFsd2F5cyBhIHtAbGluayBGb3J3YXJkU2xpY2V9LiBBYnNlbmNlIGlzIGEgUkVTVUxUIHdpdGggYSByZWFzb25cbiAqICAgYW5kLCBmb3IgYW4gdW5rbm93biBrZXksIGEgYm91bmRlZCBsaXN0IG9mIHRoZSBrZXlzIHRoZSBsb2cgZG9lcyBrbm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZFNsaWNlRm9yS2V5KFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBrZXk6IFN0YXRlS2V5LFxuICBrZXlzUmVhZDogS2V5c1JlYWRTb3VyY2UgfCBLZXlzUmVhZExvb2t1cCxcbiAgb3B0aW9ucz86IEZvcndhcmRTbGljZUZvcktleU9wdGlvbnMsXG4pOiBGb3J3YXJkU2xpY2Uge1xuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlS2V5c1JlYWRTb3VyY2Uoa2V5c1JlYWQpO1xuICBjb25zdCBub3JtYWxpc2VkS2V5ID0gbm9ybWFsaXNlU3RhdGVLZXkoa2V5KTtcbiAgY29uc3QgYmFzZTogUGljazxGb3J3YXJkU2xpY2UsICdrZXknIHwgJ2JlZm9yZScgfCAna2V5c1JlYWRLaW5kJyB8ICdyZWFkc0NvdmVyYWdlJz4gPSB7XG4gICAga2V5OiBub3JtYWxpc2VkS2V5LFxuICAgIC4uLihvcHRpb25zPy5iZWZvcmUgIT09IHVuZGVmaW5lZCAmJiB7IGJlZm9yZTogb3B0aW9ucy5iZWZvcmUgfSksXG4gICAga2V5c1JlYWRLaW5kOiBzb3VyY2Uua2luZCxcbiAgICAuLi4oc291cmNlLmNvdmVyYWdlICE9PSB1bmRlZmluZWQgJiYgeyByZWFkc0NvdmVyYWdlOiBzb3VyY2UuY292ZXJhZ2UgfSksXG4gIH07XG5cbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPT09IDApIHJldHVybiB7IC4uLmJhc2UsIG1pc3Npbmc6ICdlbXB0eS1sb2cnLCBub3RlczogW10gfTtcblxuICBjb25zdCBpbmRleCA9IGJ1aWxkS2V5SW5kZXgoY29tbWl0TG9nLCBzb3VyY2UubG9va3VwKTtcbiAgY29uc3QgcmVhZHNSZWNvcmRlZCA9IGhhc1JlY29yZGVkUmVhZHMoaW5kZXgpO1xuICBjb25zdCBub3RlczogSG9uZXN0eU5vdGVbXSA9IFtdO1xuXG4gIC8vIOKUgOKUgCBUaGUgdHlwbyBndWFyZCwgc3BsaXQgYnkgd2hhdCB0aGUgcmVjb3JkaW5nIGFmZm9yZHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFVua25vd24ga2V5ICsgcmVhZHMgQVJFIHJlY29yZGVkIOKGkiB0aGUgbG9nIGNhbiBzZWUgcmVhZGVycyBhbmQgdGhpcyBrZXlcbiAgLy8gaGFzIG5vbmU6IGhvbmVzdCBhYnNlbmNlIHdpdGggYSBuYW1lZCByZWFzb24sIG5vIGZhYnJpY2F0ZWQgbGlmZS5cbiAgLy8gVW5rbm93biBrZXkgKyBOTyByZWFkcyByZWNvcmRlZCDihpIgYSB0eXBvIGFuZCBhIHNlZWRlZC1idXQtdW5yZWFkIGtleSBhcmVcbiAgLy8gZ2VudWluZWx5IGluZGlzdGluZ3Vpc2hhYmxlOyB0aGUgcHJlLXJ1biBsaWZlIGJlbG93IGlzIHRoZSBvbmx5IGhvbmVzdFxuICAvLyBhbnN3ZXIsIGFuZCBpdCBtdXN0IGNhcnJ5IEJPVEggbm90ZXMgc28gbm9ib2R5IHJlYWRzIGl0IGFzIFwidW5yZWFkXCIuXG4gIGNvbnN0IGtub3duID0gaW5kZXguaXNLbm93bihub3JtYWxpc2VkS2V5KTtcbiAgaWYgKCFrbm93bikge1xuICAgIG5vdGVzLnB1c2godW5rbm93bktleU5vdGUoaW5kZXgsIG5vcm1hbGlzZWRLZXkpKTtcbiAgICBpZiAocmVhZHNSZWNvcmRlZCkgcmV0dXJuIHsgLi4uYmFzZSwgbWlzc2luZzogJ25ldmVyLXdyaXR0ZW4nLCBub3RlcyB9O1xuICB9XG4gIGlmICghcmVhZHNSZWNvcmRlZCkgbm90ZXMucHVzaChyZWFkc05vdFJlY29yZGVkTm90ZSgpKTtcblxuICBjb25zdCBtYXhEZXB0aCA9IG9wdGlvbnM/Lm1heERlcHRoID8/IDIwO1xuICBjb25zdCBtYXhOb2RlcyA9IG9wdGlvbnM/Lm1heE5vZGVzID8/IDEwMDtcblxuICBjb25zdCBub2RlcyA9IG5ldyBNYXA8c3RyaW5nLCBGb3J3YXJkTm9kZT4oKTtcbiAgbGV0IGNyZWF0ZWQgPSAwO1xuICBsZXQgdHJ1bmNhdGVkQnlEZXB0aCA9IGZhbHNlO1xuICBsZXQgdHJ1bmNhdGVkQnlOb2RlcyA9IGZhbHNlO1xuICBsZXQgYW55Q29uc2VydmF0aXZlID0gZmFsc2U7XG5cbiAgY29uc3QgYW5jaG9ySWR4ID0gbGFzdEluZGV4QmVmb3JlKGluZGV4LndyaXRlc09mKG5vcm1hbGlzZWRLZXkpLCBvcHRpb25zPy5iZWZvcmUpO1xuICBjb25zdCByb290ID0gbWFrZU5vZGUoY29tbWl0TG9nLCBpbmRleCwgbm9ybWFsaXNlZEtleSwgYW5jaG9ySWR4LCAwKTtcbiAgbm9kZXMuc2V0KG5vZGVLZXkoYW5jaG9ySWR4LCBub3JtYWxpc2VkS2V5KSwgcm9vdCk7XG4gIGNyZWF0ZWQgPSAxO1xuXG4gIGNvbnN0IHF1ZXVlOiBGb3J3YXJkTm9kZVtdID0gW3Jvb3RdO1xuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSBxdWV1ZS5zaGlmdCgpITtcbiAgICAvLyBMaXZlIHJhbmdlOiBvcGVuIGJlbG93IHRoZSB3cml0ZSwgQ0xPU0VEIGF0IHRoZSBuZXh0IHdyaXRlIChzZWUgTEFXKS5cbiAgICBjb25zdCBmcm9tID0gbm9kZS5jb21taXRJZHggIT09IHVuZGVmaW5lZCA/IG5vZGUuY29tbWl0SWR4ICsgMSA6IDA7XG4gICAgY29uc3QgcmVhZGVycyA9IGluZGljZXNJblJhbmdlKGluZGV4LnJlYWRzT2Yobm9kZS5rZXkpLCBmcm9tLCBub2RlLm5leHRXcml0ZUlkeCk7XG5cbiAgICBpZiAobm9kZS5kZXB0aCA+PSBtYXhEZXB0aCkge1xuICAgICAgLy8gT25seSBhIGxpZmUgdGhhdCBzdGlsbCBIQUQgcmVhZGVycyB0byBleHBhbmQgY291bnRzIGFzIGEgY3V0LlxuICAgICAgaWYgKHJlYWRlcnMubGVuZ3RoID4gMCkgdHJ1bmNhdGVkQnlEZXB0aCA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlYWRlcklkeCBvZiByZWFkZXJzKSB7XG4gICAgICBjb25zdCBidW5kbGUgPSBjb21taXRMb2dbcmVhZGVySWR4XTtcbiAgICAgIG5vZGUucmVhZHMucHVzaCh7XG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBidW5kbGUucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0YWdlSWQ6IGJ1bmRsZS5zdGFnZUlkLFxuICAgICAgICBzdGFnZU5hbWU6IGJ1bmRsZS5zdGFnZSxcbiAgICAgICAgY29tbWl0SWR4OiByZWFkZXJJZHgsXG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIHJlYWRlciBJUyB0aGUgd3JpdGVyIG9mIGV2ZXJ5dGhpbmcgaXQgY29tbWl0dGVkIOKAlCBlYWNoIHdyaXR0ZW5cbiAgICAgIC8vIHBhdGggaXMgYSBjYW5kaWRhdGUgYGZlZGAgZWRnZS5cbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiB3cml0dGVuUGF0aHMoYnVuZGxlKSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IGxhc3RUcmFjZUVudHJ5KGJ1bmRsZSwgcGF0aCk7XG4gICAgICAgIGxldCBiYXNpczogRmVkQmFzaXM7XG4gICAgICAgIGlmIChlbnRyeT8ucmVhZEtleXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEVYQUNUIGJvdGggd2F5czogcmVjb3JkZWQgcHJvdmVuYW5jZSBjYW4gaW5jbHVkZSBvciBFWENMVURFLiBBIHJlYWRcbiAgICAgICAgICAvLyBvbiB0aGUga2V5LCBpbnNpZGUgaXQgb3IgYXJvdW5kIGl0IGlzIGEgcmVhZCBvZiBpdHMgdmFsdWUuXG4gICAgICAgICAgaWYgKCFlbnRyeS5yZWFkS2V5cy5zb21lKChyZWFkKSA9PiByZWxhdGlvbihyZWFkLCBub2RlLmtleSkgIT09IHVuZGVmaW5lZCkpIGNvbnRpbnVlO1xuICAgICAgICAgIGJhc2lzID0gJ3Blci13cml0ZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFzaXMgPSAnc3RhZ2UnO1xuICAgICAgICAgIGFueUNvbnNlcnZhdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZCA9IG5vZGVLZXkocmVhZGVySWR4LCBwYXRoKTtcbiAgICAgICAgbGV0IGNoaWxkID0gbm9kZXMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICAgIGlmIChjcmVhdGVkID49IG1heE5vZGVzKSB7XG4gICAgICAgICAgICB0cnVuY2F0ZWRCeU5vZGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZCA9IG1ha2VOb2RlKGNvbW1pdExvZywgaW5kZXgsIHBhdGgsIHJlYWRlcklkeCwgbm9kZS5kZXB0aCArIDEpO1xuICAgICAgICAgIG5vZGVzLnNldChpZCwgY2hpbGQpO1xuICAgICAgICAgIGNyZWF0ZWQrKztcbiAgICAgICAgICBxdWV1ZS5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmUgZWRnZSBwZXIgZGlzdGluY3QgY2hpbGQgbGlmZSAoYSBzdGFnZSByZWFkcyBhIGtleSBvbmNlKS5cbiAgICAgICAgaWYgKCFub2RlLmZlZEVkZ2VzLnNvbWUoKGUpID0+IGUuY2hpbGQgPT09IGNoaWxkKSkgbm9kZS5mZWRFZGdlcy5wdXNoKHsgY2hpbGQsIGJhc2lzIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBIb25lc3R5IGVudmVsb3BlLCBkZXRlcm1pbmlzdGljIG9yZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBpZiAocm9vdC5vcmlnaW4gPT09ICdwcmUtcnVuJykgbm90ZXMucHVzaChwcmVSdW5PcmlnaW5Ob3RlKG5vcm1hbGlzZWRLZXkpKTtcbiAgLy8gRXZlcnkgbGlmZSBhIHdyaXRlIElOU0lERSBpdHMga2V5IHN0YXJ0cyBvciBjcm9zc2VzIOKAlCB0aGUgYW5jaG9yJ3MsIGEgcHJlLXJ1biBsaWZlJ3MsIGEgY2hpbGQncyDigJQgc2F5cyBzby5cbiAgY29uc3QgcGFydGlhbCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8bnVtYmVyPj4oKTtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzLnZhbHVlcygpKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBub2RlLmNvbW1pdElkeCA/PyAtMTtcbiAgICBjb25zdCBjcm9zc2VkID0gaW5kZXhcbiAgICAgIC53cml0ZXNPZihub2RlLmtleSlcbiAgICAgIC5maWx0ZXIoKGMpID0+IChjID09PSBzdGFydCB8fCBjID4gc3RhcnQpICYmIChub2RlLm5leHRXcml0ZUlkeCA9PT0gdW5kZWZpbmVkIHx8IGMgPCBub2RlLm5leHRXcml0ZUlkeCkpO1xuICAgIGZvciAoY29uc3QgYyBvZiBuZXN0ZWRPbmx5V3JpdGVzKGNvbW1pdExvZywgbm9kZS5rZXksIGNyb3NzZWQpKSB7XG4gICAgICBjb25zdCBzZXQgPSBwYXJ0aWFsLmdldChub2RlLmtleSkgPz8gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICBzZXQuYWRkKGMpO1xuICAgICAgcGFydGlhbC5zZXQobm9kZS5rZXksIHNldCk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgW2tleSwgY29tbWl0c10gb2YgcGFydGlhbClcbiAgICBub3Rlcy5wdXNoKFxuICAgICAgbmVzdGVkUm93c05vdGUoXG4gICAgICAgIGtleSxcbiAgICAgICAgWy4uLmNvbW1pdHNdLnNvcnQoKGEsIGIpID0+IGEgLSBiKSxcbiAgICAgICksXG4gICAgKTtcbiAgaWYgKGFueUNvbnNlcnZhdGl2ZSkgbm90ZXMucHVzaChjb25zZXJ2YXRpdmVFZGdlc05vdGUobm9ybWFsaXNlZEtleSkpO1xuICBpZiAodHJ1bmNhdGVkQnlEZXB0aCB8fCB0cnVuY2F0ZWRCeU5vZGVzKSB7XG4gICAgcm9vdC50cnVuY2F0ZWQgPSB7IGJ5RGVwdGg6IHRydW5jYXRlZEJ5RGVwdGgsIGJ5Tm9kZXM6IHRydW5jYXRlZEJ5Tm9kZXMgfTtcbiAgICBub3Rlcy5wdXNoKHRydW5jYXRlZE5vdGUodHJ1bmNhdGVkQnlEZXB0aCwgdHJ1bmNhdGVkQnlOb2RlcykpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlLFxuICAgIC4uLihhbmNob3JJZHggIT09IHVuZGVmaW5lZCAmJiB7IHdyaXRlcjogY29tbWl0TG9nW2FuY2hvcklkeF0gfSksXG4gICAgcm9vdCxcbiAgICBub3RlcyxcbiAgfTtcbn1cbiJdfQ==
|
package/dist/lib/slice/index.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* slice/ — variable-first slicing, both directions (the triage query layer).
|
|
4
|
-
*
|
|
5
|
-
* One variable, one contract, every surface — asked identically by UI panels
|
|
6
|
-
* (explainable-ui / lens), LLM triage tools (trace toolpacks), and offline
|
|
7
|
-
* autopsy agents:
|
|
8
|
-
*
|
|
9
|
-
* - BACKWARD — "why is this VARIABLE what it is?" (`sliceForKey`,
|
|
10
|
-
* `arrayProvenance` / `elementProvenance`).
|
|
11
|
-
* - FORWARD — "who READ it, and what did it FEED?" (`forwardSliceForKey`),
|
|
12
|
-
* plus the flat chronological view (`keyTimeline`).
|
|
13
|
-
*
|
|
14
|
-
* See README.md for the algorithms (thin-slice composition, append-fold
|
|
15
|
-
* provenance, live-range walking), the honesty model, serialization rules,
|
|
16
|
-
* and the evolution path.
|
|
17
|
-
*
|
|
18
|
-
* DAG position: memory ← slice (leaf-adjacent; imports memory/ only).
|
|
19
|
-
*/
|
|
20
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.sliceForKey = exports.normaliseStateKey = exports.sliceToJSON = exports.forwardSliceToJSON = exports.formatTimeline = exports.formatSlice = exports.formatForwardSlice = exports.keyTimeline = exports.resolveKeysReadSource = exports.keysReadFromMap = exports.keysReadFromExecutionTree = exports.forwardSliceForKey = exports.elementProvenance = exports.arrayProvenance = void 0;
|
|
22
|
-
var elementProvenance_js_1 = require("./elementProvenance.js");
|
|
23
|
-
Object.defineProperty(exports, "arrayProvenance", { enumerable: true, get: function () { return elementProvenance_js_1.arrayProvenance; } });
|
|
24
|
-
Object.defineProperty(exports, "elementProvenance", { enumerable: true, get: function () { return elementProvenance_js_1.elementProvenance; } });
|
|
25
|
-
var forwardSliceForKey_js_1 = require("./forwardSliceForKey.js");
|
|
26
|
-
Object.defineProperty(exports, "forwardSliceForKey", { enumerable: true, get: function () { return forwardSliceForKey_js_1.forwardSliceForKey; } });
|
|
27
|
-
var keysReadSources_js_1 = require("./keysReadSources.js");
|
|
28
|
-
Object.defineProperty(exports, "keysReadFromExecutionTree", { enumerable: true, get: function () { return keysReadSources_js_1.keysReadFromExecutionTree; } });
|
|
29
|
-
Object.defineProperty(exports, "keysReadFromMap", { enumerable: true, get: function () { return keysReadSources_js_1.keysReadFromMap; } });
|
|
30
|
-
Object.defineProperty(exports, "resolveKeysReadSource", { enumerable: true, get: function () { return keysReadSources_js_1.resolveKeysReadSource; } });
|
|
31
|
-
var keyTimeline_js_1 = require("./keyTimeline.js");
|
|
32
|
-
Object.defineProperty(exports, "keyTimeline", { enumerable: true, get: function () { return keyTimeline_js_1.keyTimeline; } });
|
|
33
|
-
var serialize_js_1 = require("./serialize.js");
|
|
34
|
-
Object.defineProperty(exports, "formatForwardSlice", { enumerable: true, get: function () { return serialize_js_1.formatForwardSlice; } });
|
|
35
|
-
Object.defineProperty(exports, "formatSlice", { enumerable: true, get: function () { return serialize_js_1.formatSlice; } });
|
|
36
|
-
Object.defineProperty(exports, "formatTimeline", { enumerable: true, get: function () { return serialize_js_1.formatTimeline; } });
|
|
37
|
-
Object.defineProperty(exports, "forwardSliceToJSON", { enumerable: true, get: function () { return serialize_js_1.forwardSliceToJSON; } });
|
|
38
|
-
Object.defineProperty(exports, "sliceToJSON", { enumerable: true, get: function () { return serialize_js_1.sliceToJSON; } });
|
|
39
|
-
var sliceForKey_js_1 = require("./sliceForKey.js");
|
|
40
|
-
Object.defineProperty(exports, "normaliseStateKey", { enumerable: true, get: function () { return sliceForKey_js_1.normaliseStateKey; } });
|
|
41
|
-
Object.defineProperty(exports, "sliceForKey", { enumerable: true, get: function () { return sliceForKey_js_1.sliceForKey; } });
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3NsaWNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7OztBQUVILCtEQUE0RTtBQUFuRSx1SEFBQSxlQUFlLE9BQUE7QUFBRSx5SEFBQSxpQkFBaUIsT0FBQTtBQUMzQyxpRUFBNkY7QUFBcEQsMkhBQUEsa0JBQWtCLE9BQUE7QUFDM0QsMkRBQXlHO0FBQWhHLCtIQUFBLHlCQUF5QixPQUFBO0FBQUUscUhBQUEsZUFBZSxPQUFBO0FBQUUsMkhBQUEscUJBQXFCLE9BQUE7QUFDMUUsbURBQXdFO0FBQXRDLDZHQUFBLFdBQVcsT0FBQTtBQUM3QywrQ0FBa0g7QUFBekcsa0hBQUEsa0JBQWtCLE9BQUE7QUFBRSwyR0FBQSxXQUFXLE9BQUE7QUFBRSw4R0FBQSxjQUFjLE9BQUE7QUFBRSxrSEFBQSxrQkFBa0IsT0FBQTtBQUFFLDJHQUFBLFdBQVcsT0FBQTtBQUN6RixtREFBMkY7QUFBekQsbUhBQUEsaUJBQWlCLE9BQUE7QUFBRSw2R0FBQSxXQUFXLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNsaWNlLyDigJQgdmFyaWFibGUtZmlyc3Qgc2xpY2luZywgYm90aCBkaXJlY3Rpb25zICh0aGUgdHJpYWdlIHF1ZXJ5IGxheWVyKS5cbiAqXG4gKiBPbmUgdmFyaWFibGUsIG9uZSBjb250cmFjdCwgZXZlcnkgc3VyZmFjZSDigJQgYXNrZWQgaWRlbnRpY2FsbHkgYnkgVUkgcGFuZWxzXG4gKiAoZXhwbGFpbmFibGUtdWkgLyBsZW5zKSwgTExNIHRyaWFnZSB0b29scyAodHJhY2UgdG9vbHBhY2tzKSwgYW5kIG9mZmxpbmVcbiAqIGF1dG9wc3kgYWdlbnRzOlxuICpcbiAqIC0gQkFDS1dBUkQg4oCUIFwid2h5IGlzIHRoaXMgVkFSSUFCTEUgd2hhdCBpdCBpcz9cIiAoYHNsaWNlRm9yS2V5YCxcbiAqICAgYGFycmF5UHJvdmVuYW5jZWAgLyBgZWxlbWVudFByb3ZlbmFuY2VgKS5cbiAqIC0gRk9SV0FSRCDigJQgXCJ3aG8gUkVBRCBpdCwgYW5kIHdoYXQgZGlkIGl0IEZFRUQ/XCIgKGBmb3J3YXJkU2xpY2VGb3JLZXlgKSxcbiAqICAgcGx1cyB0aGUgZmxhdCBjaHJvbm9sb2dpY2FsIHZpZXcgKGBrZXlUaW1lbGluZWApLlxuICpcbiAqIFNlZSBSRUFETUUubWQgZm9yIHRoZSBhbGdvcml0aG1zICh0aGluLXNsaWNlIGNvbXBvc2l0aW9uLCBhcHBlbmQtZm9sZFxuICogcHJvdmVuYW5jZSwgbGl2ZS1yYW5nZSB3YWxraW5nKSwgdGhlIGhvbmVzdHkgbW9kZWwsIHNlcmlhbGl6YXRpb24gcnVsZXMsXG4gKiBhbmQgdGhlIGV2b2x1dGlvbiBwYXRoLlxuICpcbiAqIERBRyBwb3NpdGlvbjogbWVtb3J5IOKGkCBzbGljZSAobGVhZi1hZGphY2VudDsgaW1wb3J0cyBtZW1vcnkvIG9ubHkpLlxuICovXG5cbmV4cG9ydCB7IGFycmF5UHJvdmVuYW5jZSwgZWxlbWVudFByb3ZlbmFuY2UgfSBmcm9tICcuL2VsZW1lbnRQcm92ZW5hbmNlLmpzJztcbmV4cG9ydCB7IHR5cGUgRm9yd2FyZFNsaWNlRm9yS2V5T3B0aW9ucywgZm9yd2FyZFNsaWNlRm9yS2V5IH0gZnJvbSAnLi9mb3J3YXJkU2xpY2VGb3JLZXkuanMnO1xuZXhwb3J0IHsga2V5c1JlYWRGcm9tRXhlY3V0aW9uVHJlZSwga2V5c1JlYWRGcm9tTWFwLCByZXNvbHZlS2V5c1JlYWRTb3VyY2UgfSBmcm9tICcuL2tleXNSZWFkU291cmNlcy5qcyc7XG5leHBvcnQgeyB0eXBlIEtleVRpbWVsaW5lT3B0aW9ucywga2V5VGltZWxpbmUgfSBmcm9tICcuL2tleVRpbWVsaW5lLmpzJztcbmV4cG9ydCB7IGZvcm1hdEZvcndhcmRTbGljZSwgZm9ybWF0U2xpY2UsIGZvcm1hdFRpbWVsaW5lLCBmb3J3YXJkU2xpY2VUb0pTT04sIHNsaWNlVG9KU09OIH0gZnJvbSAnLi9zZXJpYWxpemUuanMnO1xuZXhwb3J0IHsgdHlwZSBTbGljZUZvcktleU9wdGlvbnMsIG5vcm1hbGlzZVN0YXRlS2V5LCBzbGljZUZvcktleSB9IGZyb20gJy4vc2xpY2VGb3JLZXkuanMnO1xuZXhwb3J0IHR5cGUge1xuICBBcnJheVByb3ZlbmFuY2UsXG4gIEF0dHJpYnV0aW9uQmFzaXMsXG4gIEVsZW1lbnRCaXJ0aCxcbiAgRmVkQmFzaXMsXG4gIEZvcndhcmRFZGdlLFxuICBGb3J3YXJkTm9kZSxcbiAgRm9yd2FyZFJlYWQsXG4gIEZvcndhcmRTbGljZSxcbiAgRm9yd2FyZFNsaWNlSlNPTixcbiAgSG9uZXN0eU5vdGUsXG4gIEhvbmVzdHlOb3RlQ29kZSxcbiAgS2V5TW9tZW50LFxuICBLZXlzUmVhZFNvdXJjZSxcbiAgS2V5VGltZWxpbmUsXG4gIE1pc3NpbmdQcm92ZW5hbmNlUmVhc29uLFxuICBNaXNzaW5nU2xpY2VSZWFzb24sXG4gIFJlYWRzQ292ZXJhZ2UsXG4gIFNsaWNlSlNPTixcbiAgU3RhdGVLZXksXG4gIFZhcmlhYmxlU2xpY2UsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuIl19
|