footprintjs 9.9.0 → 9.10.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 +9 -9
- package/CLAUDE.md +82 -753
- package/README.md +51 -20
- package/dist/esm/advanced.d.ts +52 -0
- package/dist/esm/detach.d.ts +59 -0
- package/dist/esm/index.d.ts +202 -0
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +475 -0
- package/dist/esm/lib/builder/FlowChartBuilder.js +4 -3
- package/dist/esm/lib/builder/index.d.ts +11 -0
- package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +349 -0
- package/dist/esm/lib/builder/structure/StructureRecorderDispatcher.d.ts +77 -0
- package/dist/esm/lib/builder/typedFlowChart.d.ts +25 -0
- package/dist/esm/lib/builder/types.d.ts +154 -0
- package/dist/esm/lib/capture/envelope.d.ts +169 -0
- package/dist/esm/lib/capture/index.d.ts +16 -0
- package/dist/esm/lib/capture/policies.d.ts +42 -0
- package/dist/esm/lib/capture/summarize.d.ts +65 -0
- package/dist/esm/lib/contract/defineContract.d.ts +18 -0
- package/dist/esm/lib/contract/index.d.ts +14 -0
- package/dist/esm/lib/contract/openapi.d.ts +18 -0
- package/dist/esm/lib/contract/schema.d.ts +13 -0
- package/dist/esm/lib/contract/types.d.ts +105 -0
- package/dist/esm/lib/decide/decide.d.ts +47 -0
- package/dist/esm/lib/decide/evaluator.d.ts +39 -0
- package/dist/esm/lib/decide/evidence.d.ts +22 -0
- package/dist/esm/lib/decide/index.d.ts +12 -0
- package/dist/esm/lib/decide/types.d.ts +111 -0
- package/dist/esm/lib/detach/drivers/immediate.d.ts +39 -0
- package/dist/esm/lib/detach/drivers/microtaskBatch.d.ts +57 -0
- package/dist/esm/lib/detach/drivers/sendBeacon.d.ts +38 -0
- package/dist/esm/lib/detach/drivers/setImmediate.d.ts +32 -0
- package/dist/esm/lib/detach/drivers/setTimeout.d.ts +34 -0
- package/dist/esm/lib/detach/drivers/workerThread.d.ts +50 -0
- package/dist/esm/lib/detach/flush.d.ts +62 -0
- package/dist/esm/lib/detach/handle.d.ts +83 -0
- package/dist/esm/lib/detach/registry.d.ts +82 -0
- package/dist/esm/lib/detach/runChild.d.ts +41 -0
- package/dist/esm/lib/detach/spawn.d.ts +64 -0
- package/dist/esm/lib/detach/types.d.ts +200 -0
- package/dist/esm/lib/engine/errors/errorInfo.d.ts +46 -0
- package/dist/esm/lib/engine/errors/index.d.ts +2 -0
- package/dist/esm/lib/engine/graph/StageNode.d.ts +108 -0
- package/dist/esm/lib/engine/graph/index.d.ts +2 -0
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.d.ts +32 -0
- package/dist/esm/lib/engine/handlers/ContinuationResolver.d.ts +95 -0
- package/dist/esm/lib/engine/handlers/DeciderHandler.d.ts +56 -0
- package/dist/esm/lib/engine/handlers/NodeResolver.d.ts +41 -0
- package/dist/esm/lib/engine/handlers/RuntimeStructureManager.d.ts +37 -0
- package/dist/esm/lib/engine/handlers/SelectorHandler.d.ts +27 -0
- package/dist/esm/lib/engine/handlers/StageRunner.d.ts +17 -0
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +34 -0
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +8 -1
- package/dist/esm/lib/engine/handlers/SubflowInputMapper.d.ts +40 -0
- package/dist/esm/lib/engine/handlers/index.d.ts +13 -0
- package/dist/esm/lib/engine/handlers/types.d.ts +32 -0
- package/dist/esm/lib/engine/index.d.ts +28 -0
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +139 -0
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +47 -0
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +34 -0
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +27 -0
- package/dist/esm/lib/engine/narrative/index.d.ts +15 -0
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +196 -0
- package/dist/esm/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.d.ts +25 -0
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +69 -0
- package/dist/esm/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.d.ts +24 -0
- package/dist/esm/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.d.ts +30 -0
- package/dist/esm/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.d.ts +25 -0
- package/dist/esm/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.d.ts +32 -0
- package/dist/esm/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.d.ts +25 -0
- package/dist/esm/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.d.ts +29 -0
- package/dist/esm/lib/engine/narrative/recorders/index.d.ts +9 -0
- package/dist/esm/lib/engine/narrative/types.d.ts +384 -0
- package/dist/esm/lib/engine/runtimeStageId.d.ts +103 -0
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +376 -0
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +1 -1
- package/dist/esm/lib/engine/traversal/index.d.ts +2 -0
- package/dist/esm/lib/engine/types.d.ts +417 -0
- package/dist/esm/lib/engine/walkSubflowSpec.d.ts +95 -0
- package/dist/esm/lib/memory/DiagnosticCollector.d.ts +33 -0
- package/dist/esm/lib/memory/EventLog.d.ts +27 -0
- package/dist/esm/lib/memory/SharedMemory.d.ts +31 -0
- package/dist/esm/lib/memory/StageContext.d.ts +368 -0
- package/dist/esm/lib/memory/StageContext.js +44 -2
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +183 -0
- package/dist/esm/lib/memory/TransactionBuffer.js +35 -13
- package/dist/esm/lib/memory/backtrack.d.ts +252 -0
- package/dist/esm/lib/memory/backtrack.js +79 -8
- package/dist/esm/lib/memory/commitLogUtils.d.ts +41 -0
- package/dist/esm/lib/memory/index.d.ts +14 -0
- package/dist/esm/lib/memory/pathOps.d.ts +54 -0
- package/dist/esm/lib/memory/types.d.ts +230 -0
- package/dist/esm/lib/memory/types.js +1 -1
- package/dist/esm/lib/memory/utils.d.ts +124 -0
- package/dist/esm/lib/observer-queue/deferredDispatcher.d.ts +169 -0
- package/dist/esm/lib/observer-queue/flushDriver.d.ts +124 -0
- package/dist/esm/lib/observer-queue/index.d.ts +25 -0
- package/dist/esm/lib/observer-queue/mergedQueue.d.ts +85 -0
- package/dist/esm/lib/observer-queue/ring.d.ts +99 -0
- package/dist/esm/lib/pause/index.d.ts +2 -0
- package/dist/esm/lib/pause/types.d.ts +238 -0
- package/dist/esm/lib/pause/types.js +2 -2
- package/dist/esm/lib/reactive/allowlist.d.ts +30 -0
- package/dist/esm/lib/reactive/arrayTraps.d.ts +23 -0
- package/dist/esm/lib/reactive/createTypedScope.d.ts +24 -0
- package/dist/esm/lib/reactive/index.d.ts +14 -0
- package/dist/esm/lib/reactive/pathBuilder.d.ts +31 -0
- package/dist/esm/lib/reactive/types.d.ts +159 -0
- package/dist/esm/lib/reactive/types.js +1 -1
- package/dist/esm/lib/recorder/BoundaryStateStore.d.ts +115 -0
- package/dist/esm/lib/recorder/CombinedRecorder.d.ts +215 -0
- package/dist/esm/lib/recorder/CombinedRecorder.js +2 -2
- package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +147 -0
- package/dist/esm/lib/recorder/CompositeRecorder.d.ts +95 -0
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +133 -0
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +135 -0
- package/dist/esm/lib/recorder/InOutRecorder.d.ts +176 -0
- package/dist/esm/lib/recorder/KeyedStore.d.ts +70 -0
- package/dist/esm/lib/recorder/QualityRecorder.d.ts +122 -0
- package/dist/esm/lib/recorder/RecorderOperation.d.ts +35 -0
- package/dist/esm/lib/recorder/SequenceStore.d.ts +120 -0
- package/dist/esm/lib/recorder/TopologyRecorder.d.ts +165 -0
- package/dist/esm/lib/recorder/TopologyRecorder.js +1 -1
- package/dist/esm/lib/recorder/index.d.ts +9 -0
- package/dist/esm/lib/recorder/invokeHook.d.ts +32 -0
- package/dist/esm/lib/recorder/qualityTrace.d.ts +54 -0
- package/dist/esm/lib/runner/ComposableRunner.d.ts +33 -0
- package/dist/esm/lib/runner/DeferredObserverTier.d.ts +204 -0
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +162 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +16 -1
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +660 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +35 -3
- package/dist/esm/lib/runner/RunContext.d.ts +42 -0
- package/dist/esm/lib/runner/RunnableChart.d.ts +57 -0
- package/dist/esm/lib/runner/checkpointSanitize.d.ts +44 -0
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +70 -0
- package/dist/esm/lib/runner/index.d.ts +11 -0
- package/dist/esm/lib/runner/runId.d.ts +45 -0
- package/dist/esm/lib/runner/validateInput.d.ts +11 -0
- package/dist/esm/lib/schema/detect.d.ts +32 -0
- package/dist/esm/lib/schema/errors.d.ts +36 -0
- package/dist/esm/lib/schema/index.d.ts +14 -0
- package/dist/esm/lib/schema/validate.d.ts +33 -0
- package/dist/esm/lib/scope/ScopeFacade.d.ts +250 -0
- package/dist/esm/lib/scope/detectCircular.d.ts +47 -0
- package/dist/esm/lib/scope/index.d.ts +16 -0
- package/dist/esm/lib/scope/protection/createProtectedScope.d.ts +9 -0
- package/dist/esm/lib/scope/protection/index.d.ts +2 -0
- package/dist/esm/lib/scope/protection/readonlyInput.d.ts +26 -0
- package/dist/esm/lib/scope/protection/types.d.ts +13 -0
- package/dist/esm/lib/scope/providers/baseStateCompatible.d.ts +24 -0
- package/dist/esm/lib/scope/providers/guards.d.ts +14 -0
- package/dist/esm/lib/scope/providers/index.d.ts +6 -0
- package/dist/esm/lib/scope/providers/providers.d.ts +8 -0
- package/dist/esm/lib/scope/providers/registry.d.ts +11 -0
- package/dist/esm/lib/scope/providers/resolve.d.ts +8 -0
- package/dist/esm/lib/scope/providers/types.d.ts +40 -0
- package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +63 -0
- package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +125 -0
- package/dist/esm/lib/scope/recorders/index.d.ts +5 -0
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +7 -0
- package/dist/esm/lib/scope/recorders/summarizeValue.js +3 -3
- package/dist/esm/lib/scope/state/installResolvers.d.ts +4 -0
- package/dist/esm/lib/scope/state/zod/defineScopeFromZod.d.ts +9 -0
- package/dist/esm/lib/scope/state/zod/index.d.ts +5 -0
- package/dist/esm/lib/scope/state/zod/resolver.d.ts +5 -0
- package/dist/esm/lib/scope/state/zod/schema/builder.d.ts +12 -0
- package/dist/esm/lib/scope/state/zod/scopeFactory.d.ts +9 -0
- package/dist/esm/lib/scope/state/zod/utils/validateHelper.d.ts +25 -0
- package/dist/esm/lib/scope/types.d.ts +142 -0
- package/dist/esm/lib/slice/elementProvenance.d.ts +74 -0
- package/dist/esm/lib/slice/elementProvenance.js +181 -0
- package/dist/esm/lib/slice/index.d.ts +16 -0
- package/dist/esm/lib/slice/index.js +16 -0
- package/dist/esm/lib/slice/keysReadSources.d.ts +51 -0
- package/dist/esm/lib/slice/keysReadSources.js +96 -0
- package/dist/esm/lib/slice/serialize.d.ts +40 -0
- package/dist/esm/lib/slice/serialize.js +97 -0
- package/dist/esm/lib/slice/sliceForKey.d.ts +47 -0
- package/dist/esm/lib/slice/sliceForKey.js +72 -0
- package/dist/esm/lib/slice/types.d.ts +240 -0
- package/dist/esm/lib/slice/types.js +20 -0
- package/dist/esm/recorders.d.ts +70 -0
- package/dist/esm/trace.d.ts +57 -0
- package/dist/esm/trace.js +2 -1
- package/dist/esm/zod.d.ts +18 -0
- package/dist/lib/builder/FlowChartBuilder.js +4 -3
- package/dist/lib/engine/handlers/SubflowExecutor.js +8 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +1 -1
- package/dist/lib/memory/StageContext.js +44 -2
- package/dist/lib/memory/TransactionBuffer.js +35 -13
- package/dist/lib/memory/backtrack.js +79 -8
- package/dist/lib/memory/types.js +1 -1
- package/dist/lib/pause/types.js +2 -2
- package/dist/lib/reactive/types.js +1 -1
- package/dist/lib/recorder/CombinedRecorder.js +2 -2
- package/dist/lib/recorder/TopologyRecorder.js +1 -1
- package/dist/lib/runner/ExecutionRuntime.js +16 -1
- package/dist/lib/runner/FlowChartExecutor.js +35 -3
- package/dist/lib/scope/recorders/summarizeValue.js +3 -3
- package/dist/lib/slice/elementProvenance.js +186 -0
- package/dist/lib/slice/index.js +28 -0
- package/dist/lib/slice/keysReadSources.js +102 -0
- package/dist/lib/slice/serialize.js +102 -0
- package/dist/lib/slice/sliceForKey.js +77 -0
- package/dist/lib/slice/types.js +21 -0
- package/dist/trace.js +12 -2
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +25 -2
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -1
- package/dist/types/lib/memory/StageContext.d.ts +28 -1
- package/dist/types/lib/memory/TransactionBuffer.d.ts +10 -1
- package/dist/types/lib/memory/backtrack.d.ts +26 -0
- package/dist/types/lib/memory/types.d.ts +26 -0
- package/dist/types/lib/pause/types.d.ts +4 -3
- package/dist/types/lib/reactive/types.d.ts +1 -1
- package/dist/types/lib/recorder/CombinedRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +15 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +34 -3
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +2 -2
- package/dist/types/lib/slice/elementProvenance.d.ts +74 -0
- package/dist/types/lib/slice/index.d.ts +16 -0
- package/dist/types/lib/slice/keysReadSources.d.ts +51 -0
- package/dist/types/lib/slice/serialize.d.ts +40 -0
- package/dist/types/lib/slice/sliceForKey.d.ts +47 -0
- package/dist/types/lib/slice/types.d.ts +240 -0
- package/dist/types/trace.d.ts +3 -0
- package/package.json +75 -21
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* slice/serialize.ts — JSON-safe and LLM-safe projections of a slice.
|
|
3
|
+
*
|
|
4
|
+
* WHY (the failure this prevents): `VariableSlice.root` is an in-memory DAG.
|
|
5
|
+
* Nodes are SHARED — a diamond ancestor is one object reached through many
|
|
6
|
+
* paths, and each node appears in both `parents` and `parentEdges[].parent`.
|
|
7
|
+
* `JSON.stringify` knows nothing about sharing: it re-serializes every shared
|
|
8
|
+
* subtree per path, which explodes combinatorially on diamond-heavy slices.
|
|
9
|
+
* The two consumers that would naively stringify are exactly the ones this
|
|
10
|
+
* library exists for — wire transfer (persist / send a slice) and LLM tools
|
|
11
|
+
* (bounded context). Each gets a purpose-built projection:
|
|
12
|
+
*
|
|
13
|
+
* - {@link sliceToJSON} — flat, id-referenced, LINEAR in node count.
|
|
14
|
+
* - {@link formatSlice} — one bounded human/LLM-readable string that also
|
|
15
|
+
* renders the honesty envelope (missing reason, reads coverage, truncation)
|
|
16
|
+
* a raw `formatCausalChain` doesn't know about.
|
|
17
|
+
*/
|
|
18
|
+
import type { SliceJSON, VariableSlice } from './types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Flat, JSON-safe projection: every DAG node exactly once (keyed by
|
|
21
|
+
* runtimeStageId), edges as id references. Linear in node count — safe to
|
|
22
|
+
* persist, send, or feed to structured consumers. Lossless for everything
|
|
23
|
+
* except the in-memory object graph itself (rebuild adjacency from `edges`).
|
|
24
|
+
*/
|
|
25
|
+
export declare function sliceToJSON(slice: VariableSlice): SliceJSON;
|
|
26
|
+
/**
|
|
27
|
+
* One bounded string for LLM triage tools (the `traceToolpack` consumption
|
|
28
|
+
* pattern: tools return plain strings, never recursive objects). Wraps
|
|
29
|
+
* `formatCausalChain` (which is budget-bounded by causalChain's
|
|
30
|
+
* maxDepth/maxNodes and renders shared nodes once as `↳ … (see above)`),
|
|
31
|
+
* and adds the honesty envelope the raw chain doesn't carry:
|
|
32
|
+
*
|
|
33
|
+
* - missing slices render their reason ("value came from initial state /
|
|
34
|
+
* frozen args / a closure — the commit log cannot see those"),
|
|
35
|
+
* - a reads-less provider (`readTracking: 'off'` signature) renders an
|
|
36
|
+
* explicit "⚠ reads were not recorded" instead of silently showing an
|
|
37
|
+
* anchor with no dependencies,
|
|
38
|
+
* - truncation footers pass through from formatCausalChain.
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatSlice(slice: VariableSlice): string;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* slice/serialize.ts — JSON-safe and LLM-safe projections of a slice.
|
|
3
|
+
*
|
|
4
|
+
* WHY (the failure this prevents): `VariableSlice.root` is an in-memory DAG.
|
|
5
|
+
* Nodes are SHARED — a diamond ancestor is one object reached through many
|
|
6
|
+
* paths, and each node appears in both `parents` and `parentEdges[].parent`.
|
|
7
|
+
* `JSON.stringify` knows nothing about sharing: it re-serializes every shared
|
|
8
|
+
* subtree per path, which explodes combinatorially on diamond-heavy slices.
|
|
9
|
+
* The two consumers that would naively stringify are exactly the ones this
|
|
10
|
+
* library exists for — wire transfer (persist / send a slice) and LLM tools
|
|
11
|
+
* (bounded context). Each gets a purpose-built projection:
|
|
12
|
+
*
|
|
13
|
+
* - {@link sliceToJSON} — flat, id-referenced, LINEAR in node count.
|
|
14
|
+
* - {@link formatSlice} — one bounded human/LLM-readable string that also
|
|
15
|
+
* renders the honesty envelope (missing reason, reads coverage, truncation)
|
|
16
|
+
* a raw `formatCausalChain` doesn't know about.
|
|
17
|
+
*/
|
|
18
|
+
import { flattenCausalDAG, formatCausalChain } from '../memory/backtrack.js';
|
|
19
|
+
/**
|
|
20
|
+
* Flat, JSON-safe projection: every DAG node exactly once (keyed by
|
|
21
|
+
* runtimeStageId), edges as id references. Linear in node count — safe to
|
|
22
|
+
* persist, send, or feed to structured consumers. Lossless for everything
|
|
23
|
+
* except the in-memory object graph itself (rebuild adjacency from `edges`).
|
|
24
|
+
*/
|
|
25
|
+
export function sliceToJSON(slice) {
|
|
26
|
+
const out = {
|
|
27
|
+
key: slice.key,
|
|
28
|
+
...(slice.before !== undefined && { before: slice.before }),
|
|
29
|
+
...(slice.missing !== undefined && { missing: slice.missing }),
|
|
30
|
+
keysReadKind: slice.keysReadKind,
|
|
31
|
+
...(slice.readsCoverage !== undefined && { readsCoverage: slice.readsCoverage }),
|
|
32
|
+
};
|
|
33
|
+
if (!slice.root)
|
|
34
|
+
return out;
|
|
35
|
+
out.writerId = slice.root.runtimeStageId;
|
|
36
|
+
const nodes = {};
|
|
37
|
+
const edges = [];
|
|
38
|
+
for (const node of flattenCausalDAG(slice.root)) {
|
|
39
|
+
nodes[node.runtimeStageId] = {
|
|
40
|
+
stageId: node.stageId,
|
|
41
|
+
stageName: node.stageName,
|
|
42
|
+
keysWritten: node.keysWritten,
|
|
43
|
+
depth: node.depth,
|
|
44
|
+
...(node.incompleteSources !== undefined && { incompleteSources: node.incompleteSources }),
|
|
45
|
+
};
|
|
46
|
+
for (const edge of node.parentEdges) {
|
|
47
|
+
edges.push({
|
|
48
|
+
from: node.runtimeStageId,
|
|
49
|
+
to: edge.parent.runtimeStageId,
|
|
50
|
+
kind: edge.kind,
|
|
51
|
+
...(edge.key !== undefined && { key: edge.key }),
|
|
52
|
+
weight: edge.weight,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
out.nodes = nodes;
|
|
57
|
+
out.edges = edges;
|
|
58
|
+
if (slice.root.truncated)
|
|
59
|
+
out.truncated = slice.root.truncated;
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* One bounded string for LLM triage tools (the `traceToolpack` consumption
|
|
64
|
+
* pattern: tools return plain strings, never recursive objects). Wraps
|
|
65
|
+
* `formatCausalChain` (which is budget-bounded by causalChain's
|
|
66
|
+
* maxDepth/maxNodes and renders shared nodes once as `↳ … (see above)`),
|
|
67
|
+
* and adds the honesty envelope the raw chain doesn't carry:
|
|
68
|
+
*
|
|
69
|
+
* - missing slices render their reason ("value came from initial state /
|
|
70
|
+
* frozen args / a closure — the commit log cannot see those"),
|
|
71
|
+
* - a reads-less provider (`readTracking: 'off'` signature) renders an
|
|
72
|
+
* explicit "⚠ reads were not recorded" instead of silently showing an
|
|
73
|
+
* anchor with no dependencies,
|
|
74
|
+
* - truncation footers pass through from formatCausalChain.
|
|
75
|
+
*/
|
|
76
|
+
export function formatSlice(slice) {
|
|
77
|
+
const lines = [];
|
|
78
|
+
const anchor = slice.before !== undefined ? ` (before commit ${slice.before})` : '';
|
|
79
|
+
lines.push(`SLICE for '${slice.key}'${anchor} — reads via: ${slice.keysReadKind}`);
|
|
80
|
+
if (slice.missing === 'empty-log') {
|
|
81
|
+
lines.push('no slice: the commit log is empty (nothing has executed).');
|
|
82
|
+
return lines.join('\n');
|
|
83
|
+
}
|
|
84
|
+
if (slice.missing === 'never-written') {
|
|
85
|
+
lines.push(`no slice: '${slice.key}' was never written in range — the value came from ` +
|
|
86
|
+
'initial state, frozen run input (args), or a closure; the commit log cannot see those.');
|
|
87
|
+
return lines.join('\n');
|
|
88
|
+
}
|
|
89
|
+
const cov = slice.readsCoverage;
|
|
90
|
+
if (cov && cov.steps > 1 && cov.stepsWithReads === 0) {
|
|
91
|
+
lines.push("⚠ reads were not recorded (readTracking may be 'off') — dependencies below are " + 'unknowable, NOT absent.');
|
|
92
|
+
}
|
|
93
|
+
if (slice.root)
|
|
94
|
+
lines.push(formatCausalChain(slice.root));
|
|
95
|
+
return lines.join('\n');
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zbGljZS9zZXJpYWxpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc3RTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBb0I7SUFDOUMsTUFBTSxHQUFHLEdBQWM7UUFDckIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ2QsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlELFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtRQUNoQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxTQUFTLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQ2pGLENBQUM7SUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUU1QixHQUFHLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFvQyxFQUFFLENBQUM7SUFDbEQsTUFBTSxLQUFLLEdBQW9DLEVBQUUsQ0FBQztJQUNsRCxLQUFLLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hELEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUc7WUFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDM0YsQ0FBQztRQUNGLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjO2dCQUN6QixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjO2dCQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBQ0QsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDbEIsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDbEIsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVM7UUFBRSxHQUFHLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQy9ELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQW9CO0lBQzlDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BGLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxLQUFLLENBQUMsR0FBRyxJQUFJLE1BQU0saUJBQWlCLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBRW5GLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFDeEUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssZUFBZSxFQUFFLENBQUM7UUFDdEMsS0FBSyxDQUFDLElBQUksQ0FDUixjQUFjLEtBQUssQ0FBQyxHQUFHLHFEQUFxRDtZQUMxRSx3RkFBd0YsQ0FDM0YsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztJQUNoQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsY0FBYyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JELEtBQUssQ0FBQyxJQUFJLENBQ1IsaUZBQWlGLEdBQUcseUJBQXlCLENBQzlHLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSTtRQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNsaWNlL3NlcmlhbGl6ZS50cyDigJQgSlNPTi1zYWZlIGFuZCBMTE0tc2FmZSBwcm9qZWN0aW9ucyBvZiBhIHNsaWNlLlxuICpcbiAqIFdIWSAodGhlIGZhaWx1cmUgdGhpcyBwcmV2ZW50cyk6IGBWYXJpYWJsZVNsaWNlLnJvb3RgIGlzIGFuIGluLW1lbW9yeSBEQUcuXG4gKiBOb2RlcyBhcmUgU0hBUkVEIOKAlCBhIGRpYW1vbmQgYW5jZXN0b3IgaXMgb25lIG9iamVjdCByZWFjaGVkIHRocm91Z2ggbWFueVxuICogcGF0aHMsIGFuZCBlYWNoIG5vZGUgYXBwZWFycyBpbiBib3RoIGBwYXJlbnRzYCBhbmQgYHBhcmVudEVkZ2VzW10ucGFyZW50YC5cbiAqIGBKU09OLnN0cmluZ2lmeWAga25vd3Mgbm90aGluZyBhYm91dCBzaGFyaW5nOiBpdCByZS1zZXJpYWxpemVzIGV2ZXJ5IHNoYXJlZFxuICogc3VidHJlZSBwZXIgcGF0aCwgd2hpY2ggZXhwbG9kZXMgY29tYmluYXRvcmlhbGx5IG9uIGRpYW1vbmQtaGVhdnkgc2xpY2VzLlxuICogVGhlIHR3byBjb25zdW1lcnMgdGhhdCB3b3VsZCBuYWl2ZWx5IHN0cmluZ2lmeSBhcmUgZXhhY3RseSB0aGUgb25lcyB0aGlzXG4gKiBsaWJyYXJ5IGV4aXN0cyBmb3Ig4oCUIHdpcmUgdHJhbnNmZXIgKHBlcnNpc3QgLyBzZW5kIGEgc2xpY2UpIGFuZCBMTE0gdG9vbHNcbiAqIChib3VuZGVkIGNvbnRleHQpLiBFYWNoIGdldHMgYSBwdXJwb3NlLWJ1aWx0IHByb2plY3Rpb246XG4gKlxuICogLSB7QGxpbmsgc2xpY2VUb0pTT059ICAg4oCUIGZsYXQsIGlkLXJlZmVyZW5jZWQsIExJTkVBUiBpbiBub2RlIGNvdW50LlxuICogLSB7QGxpbmsgZm9ybWF0U2xpY2V9ICAg4oCUIG9uZSBib3VuZGVkIGh1bWFuL0xMTS1yZWFkYWJsZSBzdHJpbmcgdGhhdCBhbHNvXG4gKiAgIHJlbmRlcnMgdGhlIGhvbmVzdHkgZW52ZWxvcGUgKG1pc3NpbmcgcmVhc29uLCByZWFkcyBjb3ZlcmFnZSwgdHJ1bmNhdGlvbilcbiAqICAgYSByYXcgYGZvcm1hdENhdXNhbENoYWluYCBkb2Vzbid0IGtub3cgYWJvdXQuXG4gKi9cblxuaW1wb3J0IHsgZmxhdHRlbkNhdXNhbERBRywgZm9ybWF0Q2F1c2FsQ2hhaW4gfSBmcm9tICcuLi9tZW1vcnkvYmFja3RyYWNrLmpzJztcbmltcG9ydCB0eXBlIHsgU2xpY2VKU09OLCBWYXJpYWJsZVNsaWNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogRmxhdCwgSlNPTi1zYWZlIHByb2plY3Rpb246IGV2ZXJ5IERBRyBub2RlIGV4YWN0bHkgb25jZSAoa2V5ZWQgYnlcbiAqIHJ1bnRpbWVTdGFnZUlkKSwgZWRnZXMgYXMgaWQgcmVmZXJlbmNlcy4gTGluZWFyIGluIG5vZGUgY291bnQg4oCUIHNhZmUgdG9cbiAqIHBlcnNpc3QsIHNlbmQsIG9yIGZlZWQgdG8gc3RydWN0dXJlZCBjb25zdW1lcnMuIExvc3NsZXNzIGZvciBldmVyeXRoaW5nXG4gKiBleGNlcHQgdGhlIGluLW1lbW9yeSBvYmplY3QgZ3JhcGggaXRzZWxmIChyZWJ1aWxkIGFkamFjZW5jeSBmcm9tIGBlZGdlc2ApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VUb0pTT04oc2xpY2U6IFZhcmlhYmxlU2xpY2UpOiBTbGljZUpTT04ge1xuICBjb25zdCBvdXQ6IFNsaWNlSlNPTiA9IHtcbiAgICBrZXk6IHNsaWNlLmtleSxcbiAgICAuLi4oc2xpY2UuYmVmb3JlICE9PSB1bmRlZmluZWQgJiYgeyBiZWZvcmU6IHNsaWNlLmJlZm9yZSB9KSxcbiAgICAuLi4oc2xpY2UubWlzc2luZyAhPT0gdW5kZWZpbmVkICYmIHsgbWlzc2luZzogc2xpY2UubWlzc2luZyB9KSxcbiAgICBrZXlzUmVhZEtpbmQ6IHNsaWNlLmtleXNSZWFkS2luZCxcbiAgICAuLi4oc2xpY2UucmVhZHNDb3ZlcmFnZSAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZHNDb3ZlcmFnZTogc2xpY2UucmVhZHNDb3ZlcmFnZSB9KSxcbiAgfTtcbiAgaWYgKCFzbGljZS5yb290KSByZXR1cm4gb3V0O1xuXG4gIG91dC53cml0ZXJJZCA9IHNsaWNlLnJvb3QucnVudGltZVN0YWdlSWQ7XG4gIGNvbnN0IG5vZGVzOiBOb25OdWxsYWJsZTxTbGljZUpTT05bJ25vZGVzJ10+ID0ge307XG4gIGNvbnN0IGVkZ2VzOiBOb25OdWxsYWJsZTxTbGljZUpTT05bJ2VkZ2VzJ10+ID0gW107XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBmbGF0dGVuQ2F1c2FsREFHKHNsaWNlLnJvb3QpKSB7XG4gICAgbm9kZXNbbm9kZS5ydW50aW1lU3RhZ2VJZF0gPSB7XG4gICAgICBzdGFnZUlkOiBub2RlLnN0YWdlSWQsXG4gICAgICBzdGFnZU5hbWU6IG5vZGUuc3RhZ2VOYW1lLFxuICAgICAga2V5c1dyaXR0ZW46IG5vZGUua2V5c1dyaXR0ZW4sXG4gICAgICBkZXB0aDogbm9kZS5kZXB0aCxcbiAgICAgIC4uLihub2RlLmluY29tcGxldGVTb3VyY2VzICE9PSB1bmRlZmluZWQgJiYgeyBpbmNvbXBsZXRlU291cmNlczogbm9kZS5pbmNvbXBsZXRlU291cmNlcyB9KSxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiBub2RlLnBhcmVudEVkZ2VzKSB7XG4gICAgICBlZGdlcy5wdXNoKHtcbiAgICAgICAgZnJvbTogbm9kZS5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgdG86IGVkZ2UucGFyZW50LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBraW5kOiBlZGdlLmtpbmQsXG4gICAgICAgIC4uLihlZGdlLmtleSAhPT0gdW5kZWZpbmVkICYmIHsga2V5OiBlZGdlLmtleSB9KSxcbiAgICAgICAgd2VpZ2h0OiBlZGdlLndlaWdodCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBvdXQubm9kZXMgPSBub2RlcztcbiAgb3V0LmVkZ2VzID0gZWRnZXM7XG4gIGlmIChzbGljZS5yb290LnRydW5jYXRlZCkgb3V0LnRydW5jYXRlZCA9IHNsaWNlLnJvb3QudHJ1bmNhdGVkO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE9uZSBib3VuZGVkIHN0cmluZyBmb3IgTExNIHRyaWFnZSB0b29scyAodGhlIGB0cmFjZVRvb2xwYWNrYCBjb25zdW1wdGlvblxuICogcGF0dGVybjogdG9vbHMgcmV0dXJuIHBsYWluIHN0cmluZ3MsIG5ldmVyIHJlY3Vyc2l2ZSBvYmplY3RzKS4gV3JhcHNcbiAqIGBmb3JtYXRDYXVzYWxDaGFpbmAgKHdoaWNoIGlzIGJ1ZGdldC1ib3VuZGVkIGJ5IGNhdXNhbENoYWluJ3NcbiAqIG1heERlcHRoL21heE5vZGVzIGFuZCByZW5kZXJzIHNoYXJlZCBub2RlcyBvbmNlIGFzIGDihrMg4oCmIChzZWUgYWJvdmUpYCksXG4gKiBhbmQgYWRkcyB0aGUgaG9uZXN0eSBlbnZlbG9wZSB0aGUgcmF3IGNoYWluIGRvZXNuJ3QgY2Fycnk6XG4gKlxuICogLSBtaXNzaW5nIHNsaWNlcyByZW5kZXIgdGhlaXIgcmVhc29uIChcInZhbHVlIGNhbWUgZnJvbSBpbml0aWFsIHN0YXRlIC9cbiAqICAgZnJvemVuIGFyZ3MgLyBhIGNsb3N1cmUg4oCUIHRoZSBjb21taXQgbG9nIGNhbm5vdCBzZWUgdGhvc2VcIiksXG4gKiAtIGEgcmVhZHMtbGVzcyBwcm92aWRlciAoYHJlYWRUcmFja2luZzogJ29mZidgIHNpZ25hdHVyZSkgcmVuZGVycyBhblxuICogICBleHBsaWNpdCBcIuKaoCByZWFkcyB3ZXJlIG5vdCByZWNvcmRlZFwiIGluc3RlYWQgb2Ygc2lsZW50bHkgc2hvd2luZyBhblxuICogICBhbmNob3Igd2l0aCBubyBkZXBlbmRlbmNpZXMsXG4gKiAtIHRydW5jYXRpb24gZm9vdGVycyBwYXNzIHRocm91Z2ggZnJvbSBmb3JtYXRDYXVzYWxDaGFpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNsaWNlKHNsaWNlOiBWYXJpYWJsZVNsaWNlKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFuY2hvciA9IHNsaWNlLmJlZm9yZSAhPT0gdW5kZWZpbmVkID8gYCAoYmVmb3JlIGNvbW1pdCAke3NsaWNlLmJlZm9yZX0pYCA6ICcnO1xuICBsaW5lcy5wdXNoKGBTTElDRSBmb3IgJyR7c2xpY2Uua2V5fScke2FuY2hvcn0g4oCUIHJlYWRzIHZpYTogJHtzbGljZS5rZXlzUmVhZEtpbmR9YCk7XG5cbiAgaWYgKHNsaWNlLm1pc3NpbmcgPT09ICdlbXB0eS1sb2cnKSB7XG4gICAgbGluZXMucHVzaCgnbm8gc2xpY2U6IHRoZSBjb21taXQgbG9nIGlzIGVtcHR5IChub3RoaW5nIGhhcyBleGVjdXRlZCkuJyk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG4gIGlmIChzbGljZS5taXNzaW5nID09PSAnbmV2ZXItd3JpdHRlbicpIHtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYG5vIHNsaWNlOiAnJHtzbGljZS5rZXl9JyB3YXMgbmV2ZXIgd3JpdHRlbiBpbiByYW5nZSDigJQgdGhlIHZhbHVlIGNhbWUgZnJvbSBgICtcbiAgICAgICAgJ2luaXRpYWwgc3RhdGUsIGZyb3plbiBydW4gaW5wdXQgKGFyZ3MpLCBvciBhIGNsb3N1cmU7IHRoZSBjb21taXQgbG9nIGNhbm5vdCBzZWUgdGhvc2UuJyxcbiAgICApO1xuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGNvbnN0IGNvdiA9IHNsaWNlLnJlYWRzQ292ZXJhZ2U7XG4gIGlmIChjb3YgJiYgY292LnN0ZXBzID4gMSAmJiBjb3Yuc3RlcHNXaXRoUmVhZHMgPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgXCLimqAgcmVhZHMgd2VyZSBub3QgcmVjb3JkZWQgKHJlYWRUcmFja2luZyBtYXkgYmUgJ29mZicpIOKAlCBkZXBlbmRlbmNpZXMgYmVsb3cgYXJlIFwiICsgJ3Vua25vd2FibGUsIE5PVCBhYnNlbnQuJyxcbiAgICApO1xuICB9XG4gIGlmIChzbGljZS5yb290KSBsaW5lcy5wdXNoKGZvcm1hdENhdXNhbENoYWluKHNsaWNlLnJvb3QpKTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuIl19
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* slice/sliceForKey.ts — the variable-first backward slice query.
|
|
3
|
+
*
|
|
4
|
+
* "Why is `key` what it is?" — the ONE question every triage surface asks:
|
|
5
|
+
* a human clicking a key in explainable-ui, an LLM calling a `backtrack`
|
|
6
|
+
* tool mid-conversation, an offline autopsy agent over a stored run.
|
|
7
|
+
*
|
|
8
|
+
* WHY this is deliberately a composition and not a new algorithm:
|
|
9
|
+
* `findLastWriter` already answers "who made the value what it is" and
|
|
10
|
+
* `causalChain` already answers "what influenced that step" (thin backward
|
|
11
|
+
* slicing, Weiser 1984). What was missing is the shared CONTRACT — without
|
|
12
|
+
* it, every surface hand-rolls the anchor step differently and their answers
|
|
13
|
+
* disagree. The value of this function is that they can't.
|
|
14
|
+
*/
|
|
15
|
+
import { type CausalChainOptions, type KeysReadLookup } from '../memory/backtrack.js';
|
|
16
|
+
import type { CommitBundle } from '../memory/types.js';
|
|
17
|
+
import type { KeysReadSource, StateKey, VariableSlice } from './types.js';
|
|
18
|
+
/**
|
|
19
|
+
* Normalise a consumer-facing {@link StateKey} to the engine's canonical
|
|
20
|
+
* string form (the `TraceEntry.path` space). Path arrays go through the same
|
|
21
|
+
* normaliser the engine writes with — the delimiter never leaks into the
|
|
22
|
+
* public contract.
|
|
23
|
+
*/
|
|
24
|
+
export declare function normaliseStateKey(key: StateKey): string;
|
|
25
|
+
/** Options for {@link sliceForKey} — causalChain's options plus anchoring. */
|
|
26
|
+
export interface SliceForKeyOptions extends CausalChainOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Exclusive commit-array-index upper bound: slice the value as it stood
|
|
29
|
+
* BEFORE this idx (time-travel triage — "why was it X at step 12?").
|
|
30
|
+
* Same contract as `findLastWriter`'s `beforeIdx`. Omit for the current
|
|
31
|
+
* value. Chained-triage idiom: to slice at an {@link ElementBirth}, pass
|
|
32
|
+
* `before: birth.commitIdx + 1` (birth idx is inclusive, this bound is
|
|
33
|
+
* exclusive — the +1 makes the birth commit itself the anchor).
|
|
34
|
+
*/
|
|
35
|
+
before?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Backward slice for one state key: anchor at the key's last writer, then
|
|
39
|
+
* walk read→write (and optional control) dependencies transitively.
|
|
40
|
+
*
|
|
41
|
+
* Honest-absence contract: a missing slice is a RESULT, not an error —
|
|
42
|
+
* `missing: 'never-written'` tells a triage tool (or its LLM caller) that
|
|
43
|
+
* the value came from initial state / frozen args / a closure, which is
|
|
44
|
+
* itself diagnostic information. See {@link VariableSlice} — including its
|
|
45
|
+
* SERIALIZATION WARNING before you stringify the result.
|
|
46
|
+
*/
|
|
47
|
+
export declare function sliceForKey(commitLog: CommitBundle[], key: StateKey, keysRead: KeysReadSource | KeysReadLookup, options?: SliceForKeyOptions): VariableSlice;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* slice/sliceForKey.ts — the variable-first backward slice query.
|
|
3
|
+
*
|
|
4
|
+
* "Why is `key` what it is?" — the ONE question every triage surface asks:
|
|
5
|
+
* a human clicking a key in explainable-ui, an LLM calling a `backtrack`
|
|
6
|
+
* tool mid-conversation, an offline autopsy agent over a stored run.
|
|
7
|
+
*
|
|
8
|
+
* WHY this is deliberately a composition and not a new algorithm:
|
|
9
|
+
* `findLastWriter` already answers "who made the value what it is" and
|
|
10
|
+
* `causalChain` already answers "what influenced that step" (thin backward
|
|
11
|
+
* slicing, Weiser 1984). What was missing is the shared CONTRACT — without
|
|
12
|
+
* it, every surface hand-rolls the anchor step differently and their answers
|
|
13
|
+
* disagree. The value of this function is that they can't.
|
|
14
|
+
*/
|
|
15
|
+
import { causalChain } from '../memory/backtrack.js';
|
|
16
|
+
import { findLastWriter } from '../memory/commitLogUtils.js';
|
|
17
|
+
import { normalisePath } from '../memory/utils.js';
|
|
18
|
+
import { resolveKeysReadSource } from './keysReadSources.js';
|
|
19
|
+
/**
|
|
20
|
+
* Normalise a consumer-facing {@link StateKey} to the engine's canonical
|
|
21
|
+
* string form (the `TraceEntry.path` space). Path arrays go through the same
|
|
22
|
+
* normaliser the engine writes with — the delimiter never leaks into the
|
|
23
|
+
* public contract.
|
|
24
|
+
*/
|
|
25
|
+
export function normaliseStateKey(key) {
|
|
26
|
+
return typeof key === 'string' ? key : normalisePath([...key]);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Backward slice for one state key: anchor at the key's last writer, then
|
|
30
|
+
* walk read→write (and optional control) dependencies transitively.
|
|
31
|
+
*
|
|
32
|
+
* Honest-absence contract: a missing slice is a RESULT, not an error —
|
|
33
|
+
* `missing: 'never-written'` tells a triage tool (or its LLM caller) that
|
|
34
|
+
* the value came from initial state / frozen args / a closure, which is
|
|
35
|
+
* itself diagnostic information. See {@link VariableSlice} — including its
|
|
36
|
+
* SERIALIZATION WARNING before you stringify the result.
|
|
37
|
+
*/
|
|
38
|
+
export function sliceForKey(commitLog, key, keysRead, options) {
|
|
39
|
+
const source = resolveKeysReadSource(keysRead);
|
|
40
|
+
const normalisedKey = normaliseStateKey(key);
|
|
41
|
+
const base = {
|
|
42
|
+
key: normalisedKey,
|
|
43
|
+
...(options?.before !== undefined && { before: options.before }),
|
|
44
|
+
keysReadKind: source.kind,
|
|
45
|
+
...(source.coverage !== undefined && { readsCoverage: source.coverage }),
|
|
46
|
+
};
|
|
47
|
+
if (commitLog.length === 0)
|
|
48
|
+
return { ...base, missing: 'empty-log' };
|
|
49
|
+
const writer = findLastWriter(commitLog, normalisedKey, options?.before);
|
|
50
|
+
if (!writer)
|
|
51
|
+
return { ...base, missing: 'never-written' };
|
|
52
|
+
// INVARIANT: `writer` came FROM this commitLog, so its runtimeStageId is
|
|
53
|
+
// always present in causalChain's index — causalChain cannot return
|
|
54
|
+
// undefined here (it only does for ids absent from the log). The non-null
|
|
55
|
+
// assertion keeps the VariableSlice contract airtight: `missing` is the
|
|
56
|
+
// ONLY absent-root state. Options pass straight through (controlDeps /
|
|
57
|
+
// weigh / maxDepth / maxNodes keep their causalChain semantics).
|
|
58
|
+
//
|
|
59
|
+
// edgeAttribution defaults to 'per-write' HERE (unlike causalChain's
|
|
60
|
+
// 'stage' default): a variable-first slice knows exactly which written key
|
|
61
|
+
// anchors the question, and per-write attribution is strictly-safe — logs
|
|
62
|
+
// without `TraceEntry.readKeys` (the writeProvenance dial off) fall back
|
|
63
|
+
// to stage-level expansion per node, byte-identically. Consumers can force
|
|
64
|
+
// 'stage' via options.
|
|
65
|
+
const root = causalChain(commitLog, writer.runtimeStageId, source.lookup, {
|
|
66
|
+
...options,
|
|
67
|
+
edgeAttribution: options?.edgeAttribution ?? 'per-write',
|
|
68
|
+
rootLinkKeys: options?.rootLinkKeys ?? [normalisedKey],
|
|
69
|
+
});
|
|
70
|
+
return { ...base, writer, root };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VGb3JLZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NsaWNlL3NsaWNlRm9yS2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQWdELFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHN0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBYTtJQUM3QyxPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQWVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLFNBQXlCLEVBQ3pCLEdBQWEsRUFDYixRQUF5QyxFQUN6QyxPQUE0QjtJQUU1QixNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxNQUFNLElBQUksR0FBNkU7UUFDckYsR0FBRyxFQUFFLGFBQWE7UUFDbEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRSxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDekIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUN6RSxDQUFDO0lBRUYsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBRXJFLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RSxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUM7SUFFMUQseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxpRUFBaUU7SUFDakUsRUFBRTtJQUNGLHFFQUFxRTtJQUNyRSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsdUJBQXVCO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQ3hFLEdBQUcsT0FBTztRQUNWLGVBQWUsRUFBRSxPQUFPLEVBQUUsZUFBZSxJQUFJLFdBQVc7UUFDeEQsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLElBQUksQ0FBQyxhQUFhLENBQUM7S0FDdkQsQ0FBRSxDQUFDO0lBQ0osT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzbGljZS9zbGljZUZvcktleS50cyDigJQgdGhlIHZhcmlhYmxlLWZpcnN0IGJhY2t3YXJkIHNsaWNlIHF1ZXJ5LlxuICpcbiAqIFwiV2h5IGlzIGBrZXlgIHdoYXQgaXQgaXM/XCIg4oCUIHRoZSBPTkUgcXVlc3Rpb24gZXZlcnkgdHJpYWdlIHN1cmZhY2UgYXNrczpcbiAqIGEgaHVtYW4gY2xpY2tpbmcgYSBrZXkgaW4gZXhwbGFpbmFibGUtdWksIGFuIExMTSBjYWxsaW5nIGEgYGJhY2t0cmFja2BcbiAqIHRvb2wgbWlkLWNvbnZlcnNhdGlvbiwgYW4gb2ZmbGluZSBhdXRvcHN5IGFnZW50IG92ZXIgYSBzdG9yZWQgcnVuLlxuICpcbiAqIFdIWSB0aGlzIGlzIGRlbGliZXJhdGVseSBhIGNvbXBvc2l0aW9uIGFuZCBub3QgYSBuZXcgYWxnb3JpdGhtOlxuICogYGZpbmRMYXN0V3JpdGVyYCBhbHJlYWR5IGFuc3dlcnMgXCJ3aG8gbWFkZSB0aGUgdmFsdWUgd2hhdCBpdCBpc1wiIGFuZFxuICogYGNhdXNhbENoYWluYCBhbHJlYWR5IGFuc3dlcnMgXCJ3aGF0IGluZmx1ZW5jZWQgdGhhdCBzdGVwXCIgKHRoaW4gYmFja3dhcmRcbiAqIHNsaWNpbmcsIFdlaXNlciAxOTg0KS4gV2hhdCB3YXMgbWlzc2luZyBpcyB0aGUgc2hhcmVkIENPTlRSQUNUIOKAlCB3aXRob3V0XG4gKiBpdCwgZXZlcnkgc3VyZmFjZSBoYW5kLXJvbGxzIHRoZSBhbmNob3Igc3RlcCBkaWZmZXJlbnRseSBhbmQgdGhlaXIgYW5zd2Vyc1xuICogZGlzYWdyZWUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgdGhleSBjYW4ndC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIENhdXNhbENoYWluT3B0aW9ucywgdHlwZSBLZXlzUmVhZExvb2t1cCwgY2F1c2FsQ2hhaW4gfSBmcm9tICcuLi9tZW1vcnkvYmFja3RyYWNrLmpzJztcbmltcG9ydCB7IGZpbmRMYXN0V3JpdGVyIH0gZnJvbSAnLi4vbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IG5vcm1hbGlzZVBhdGggfSBmcm9tICcuLi9tZW1vcnkvdXRpbHMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUtleXNSZWFkU291cmNlIH0gZnJvbSAnLi9rZXlzUmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBLZXlzUmVhZFNvdXJjZSwgU3RhdGVLZXksIFZhcmlhYmxlU2xpY2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBOb3JtYWxpc2UgYSBjb25zdW1lci1mYWNpbmcge0BsaW5rIFN0YXRlS2V5fSB0byB0aGUgZW5naW5lJ3MgY2Fub25pY2FsXG4gKiBzdHJpbmcgZm9ybSAodGhlIGBUcmFjZUVudHJ5LnBhdGhgIHNwYWNlKS4gUGF0aCBhcnJheXMgZ28gdGhyb3VnaCB0aGUgc2FtZVxuICogbm9ybWFsaXNlciB0aGUgZW5naW5lIHdyaXRlcyB3aXRoIOKAlCB0aGUgZGVsaW1pdGVyIG5ldmVyIGxlYWtzIGludG8gdGhlXG4gKiBwdWJsaWMgY29udHJhY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpc2VTdGF0ZUtleShrZXk6IFN0YXRlS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8ga2V5IDogbm9ybWFsaXNlUGF0aChbLi4ua2V5XSk7XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgc2xpY2VGb3JLZXl9IOKAlCBjYXVzYWxDaGFpbidzIG9wdGlvbnMgcGx1cyBhbmNob3JpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlRm9yS2V5T3B0aW9ucyBleHRlbmRzIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFeGNsdXNpdmUgY29tbWl0LWFycmF5LWluZGV4IHVwcGVyIGJvdW5kOiBzbGljZSB0aGUgdmFsdWUgYXMgaXQgc3Rvb2RcbiAgICogQkVGT1JFIHRoaXMgaWR4ICh0aW1lLXRyYXZlbCB0cmlhZ2Ug4oCUIFwid2h5IHdhcyBpdCBYIGF0IHN0ZXAgMTI/XCIpLlxuICAgKiBTYW1lIGNvbnRyYWN0IGFzIGBmaW5kTGFzdFdyaXRlcmAncyBgYmVmb3JlSWR4YC4gT21pdCBmb3IgdGhlIGN1cnJlbnRcbiAgICogdmFsdWUuIENoYWluZWQtdHJpYWdlIGlkaW9tOiB0byBzbGljZSBhdCBhbiB7QGxpbmsgRWxlbWVudEJpcnRofSwgcGFzc1xuICAgKiBgYmVmb3JlOiBiaXJ0aC5jb21taXRJZHggKyAxYCAoYmlydGggaWR4IGlzIGluY2x1c2l2ZSwgdGhpcyBib3VuZCBpc1xuICAgKiBleGNsdXNpdmUg4oCUIHRoZSArMSBtYWtlcyB0aGUgYmlydGggY29tbWl0IGl0c2VsZiB0aGUgYW5jaG9yKS5cbiAgICovXG4gIGJlZm9yZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCYWNrd2FyZCBzbGljZSBmb3Igb25lIHN0YXRlIGtleTogYW5jaG9yIGF0IHRoZSBrZXkncyBsYXN0IHdyaXRlciwgdGhlblxuICogd2FsayByZWFk4oaSd3JpdGUgKGFuZCBvcHRpb25hbCBjb250cm9sKSBkZXBlbmRlbmNpZXMgdHJhbnNpdGl2ZWx5LlxuICpcbiAqIEhvbmVzdC1hYnNlbmNlIGNvbnRyYWN0OiBhIG1pc3Npbmcgc2xpY2UgaXMgYSBSRVNVTFQsIG5vdCBhbiBlcnJvciDigJRcbiAqIGBtaXNzaW5nOiAnbmV2ZXItd3JpdHRlbidgIHRlbGxzIGEgdHJpYWdlIHRvb2wgKG9yIGl0cyBMTE0gY2FsbGVyKSB0aGF0XG4gKiB0aGUgdmFsdWUgY2FtZSBmcm9tIGluaXRpYWwgc3RhdGUgLyBmcm96ZW4gYXJncyAvIGEgY2xvc3VyZSwgd2hpY2ggaXNcbiAqIGl0c2VsZiBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBTZWUge0BsaW5rIFZhcmlhYmxlU2xpY2V9IOKAlCBpbmNsdWRpbmcgaXRzXG4gKiBTRVJJQUxJWkFUSU9OIFdBUk5JTkcgYmVmb3JlIHlvdSBzdHJpbmdpZnkgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlRm9yS2V5KFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBrZXk6IFN0YXRlS2V5LFxuICBrZXlzUmVhZDogS2V5c1JlYWRTb3VyY2UgfCBLZXlzUmVhZExvb2t1cCxcbiAgb3B0aW9ucz86IFNsaWNlRm9yS2V5T3B0aW9ucyxcbik6IFZhcmlhYmxlU2xpY2Uge1xuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlS2V5c1JlYWRTb3VyY2Uoa2V5c1JlYWQpO1xuICBjb25zdCBub3JtYWxpc2VkS2V5ID0gbm9ybWFsaXNlU3RhdGVLZXkoa2V5KTtcbiAgY29uc3QgYmFzZTogUGljazxWYXJpYWJsZVNsaWNlLCAna2V5JyB8ICdiZWZvcmUnIHwgJ2tleXNSZWFkS2luZCcgfCAncmVhZHNDb3ZlcmFnZSc+ID0ge1xuICAgIGtleTogbm9ybWFsaXNlZEtleSxcbiAgICAuLi4ob3B0aW9ucz8uYmVmb3JlICE9PSB1bmRlZmluZWQgJiYgeyBiZWZvcmU6IG9wdGlvbnMuYmVmb3JlIH0pLFxuICAgIGtleXNSZWFkS2luZDogc291cmNlLmtpbmQsXG4gICAgLi4uKHNvdXJjZS5jb3ZlcmFnZSAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZHNDb3ZlcmFnZTogc291cmNlLmNvdmVyYWdlIH0pLFxuICB9O1xuXG4gIGlmIChjb21taXRMb2cubGVuZ3RoID09PSAwKSByZXR1cm4geyAuLi5iYXNlLCBtaXNzaW5nOiAnZW1wdHktbG9nJyB9O1xuXG4gIGNvbnN0IHdyaXRlciA9IGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZywgbm9ybWFsaXNlZEtleSwgb3B0aW9ucz8uYmVmb3JlKTtcbiAgaWYgKCF3cml0ZXIpIHJldHVybiB7IC4uLmJhc2UsIG1pc3Npbmc6ICduZXZlci13cml0dGVuJyB9O1xuXG4gIC8vIElOVkFSSUFOVDogYHdyaXRlcmAgY2FtZSBGUk9NIHRoaXMgY29tbWl0TG9nLCBzbyBpdHMgcnVudGltZVN0YWdlSWQgaXNcbiAgLy8gYWx3YXlzIHByZXNlbnQgaW4gY2F1c2FsQ2hhaW4ncyBpbmRleCDigJQgY2F1c2FsQ2hhaW4gY2Fubm90IHJldHVyblxuICAvLyB1bmRlZmluZWQgaGVyZSAoaXQgb25seSBkb2VzIGZvciBpZHMgYWJzZW50IGZyb20gdGhlIGxvZykuIFRoZSBub24tbnVsbFxuICAvLyBhc3NlcnRpb24ga2VlcHMgdGhlIFZhcmlhYmxlU2xpY2UgY29udHJhY3QgYWlydGlnaHQ6IGBtaXNzaW5nYCBpcyB0aGVcbiAgLy8gT05MWSBhYnNlbnQtcm9vdCBzdGF0ZS4gT3B0aW9ucyBwYXNzIHN0cmFpZ2h0IHRocm91Z2ggKGNvbnRyb2xEZXBzIC9cbiAgLy8gd2VpZ2ggLyBtYXhEZXB0aCAvIG1heE5vZGVzIGtlZXAgdGhlaXIgY2F1c2FsQ2hhaW4gc2VtYW50aWNzKS5cbiAgLy9cbiAgLy8gZWRnZUF0dHJpYnV0aW9uIGRlZmF1bHRzIHRvICdwZXItd3JpdGUnIEhFUkUgKHVubGlrZSBjYXVzYWxDaGFpbidzXG4gIC8vICdzdGFnZScgZGVmYXVsdCk6IGEgdmFyaWFibGUtZmlyc3Qgc2xpY2Uga25vd3MgZXhhY3RseSB3aGljaCB3cml0dGVuIGtleVxuICAvLyBhbmNob3JzIHRoZSBxdWVzdGlvbiwgYW5kIHBlci13cml0ZSBhdHRyaWJ1dGlvbiBpcyBzdHJpY3RseS1zYWZlIOKAlCBsb2dzXG4gIC8vIHdpdGhvdXQgYFRyYWNlRW50cnkucmVhZEtleXNgICh0aGUgd3JpdGVQcm92ZW5hbmNlIGRpYWwgb2ZmKSBmYWxsIGJhY2tcbiAgLy8gdG8gc3RhZ2UtbGV2ZWwgZXhwYW5zaW9uIHBlciBub2RlLCBieXRlLWlkZW50aWNhbGx5LiBDb25zdW1lcnMgY2FuIGZvcmNlXG4gIC8vICdzdGFnZScgdmlhIG9wdGlvbnMuXG4gIGNvbnN0IHJvb3QgPSBjYXVzYWxDaGFpbihjb21taXRMb2csIHdyaXRlci5ydW50aW1lU3RhZ2VJZCwgc291cmNlLmxvb2t1cCwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZWRnZUF0dHJpYnV0aW9uOiBvcHRpb25zPy5lZGdlQXR0cmlidXRpb24gPz8gJ3Blci13cml0ZScsXG4gICAgcm9vdExpbmtLZXlzOiBvcHRpb25zPy5yb290TGlua0tleXMgPz8gW25vcm1hbGlzZWRLZXldLFxuICB9KSE7XG4gIHJldHVybiB7IC4uLmJhc2UsIHdyaXRlciwgcm9vdCB9O1xufVxuIl19
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* slice/types.ts — data shapes of the variable-first slicing layer.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS LIBRARY EXISTS (context for future readers, human or LLM):
|
|
5
|
+
* `causalChain()` (memory/backtrack.ts) answers "what influenced this STEP?"
|
|
6
|
+
* — its address space is runtimeStageIds. But every triage consumer starts
|
|
7
|
+
* from a VARIABLE: a human clicks the key `creditTier` in a UI; an LLM tool
|
|
8
|
+
* call asks "where did history[7] come from?". This library is the address
|
|
9
|
+
* translation layer: variable in → slice out. It deliberately adds NO new
|
|
10
|
+
* capture and NO new graph algorithm — it composes the commit-log primitives
|
|
11
|
+
* (findLastWriter / causalChain / the per-key verb fold) so every surface
|
|
12
|
+
* (UI panel, LLM tool, offline autopsy agent) asks the question the same way
|
|
13
|
+
* and gets the same, honestly-labeled answer.
|
|
14
|
+
*
|
|
15
|
+
* DAG position: memory ← slice. This module may import ONLY from memory/.
|
|
16
|
+
* Recorders, engine, and runner must never be imported here — that is what
|
|
17
|
+
* keeps it a tiny, separately-evolvable library (see README.md).
|
|
18
|
+
*/
|
|
19
|
+
import type { CausalNode, KeysReadLookup } from '../memory/backtrack.js';
|
|
20
|
+
import type { CommitBundle, TraceEntry, UntrackedSource } from '../memory/types.js';
|
|
21
|
+
/**
|
|
22
|
+
* A state key as consumers know it: either the plain top-level key string, or
|
|
23
|
+
* a path array for nested keys (`['customer', 'address']`). Path arrays are
|
|
24
|
+
* normalised internally — the engine's path delimiter never appears in this
|
|
25
|
+
* public contract.
|
|
26
|
+
*/
|
|
27
|
+
export type StateKey = string | ReadonlyArray<string | number>;
|
|
28
|
+
/**
|
|
29
|
+
* STRATEGY INTERFACE: where per-stage read keys come from. THE canonical
|
|
30
|
+
* strategy list lives here (implementations in keysReadSources.ts):
|
|
31
|
+
*
|
|
32
|
+
* Reads are deliberately NOT in the commit log (CommitBundle carries only the
|
|
33
|
+
* `untrackedSources` honesty flags), so a slice needs a reads provider. There
|
|
34
|
+
* are several legitimate providers with different trade-offs, and new ones
|
|
35
|
+
* will appear — hence an interface rather than a hardcoded path:
|
|
36
|
+
*
|
|
37
|
+
* - `keysReadFromExecutionTree` — post-hoc, ZERO setup: reads live in the
|
|
38
|
+
* snapshot's `StageSnapshot.stageReads` whenever `readTracking` ≠ 'off'
|
|
39
|
+
* (default 'full'; 'summary' still keeps the keys). Use when you have a
|
|
40
|
+
* finished run's snapshot.
|
|
41
|
+
* - `keysReadFromMap` — a prebuilt Map/object, e.g. collected live from
|
|
42
|
+
* `ScopeRecorder.onRead` events or deserialized from a stored trace.
|
|
43
|
+
* - a bare `KeysReadLookup` function — anything else (e.g. QualityRecorder:
|
|
44
|
+
* `(id) => rec.getByKey(id)?.keysRead ?? []`). Wrapped as kind 'custom-fn'.
|
|
45
|
+
*
|
|
46
|
+
* `kind` is a debugging/honesty breadcrumb: `VariableSlice.keysReadKind`
|
|
47
|
+
* records which strategy produced the slice, so a surprising slice can be
|
|
48
|
+
* traced back to its reads provider.
|
|
49
|
+
*/
|
|
50
|
+
export interface KeysReadSource {
|
|
51
|
+
/** Discriminator surfaced on {@link VariableSlice.keysReadKind}. */
|
|
52
|
+
readonly kind: string;
|
|
53
|
+
/** The lookup `causalChain` will call per visited node. */
|
|
54
|
+
readonly lookup: KeysReadLookup;
|
|
55
|
+
/**
|
|
56
|
+
* OPTIONAL honesty telemetry a strategy can compute while it builds:
|
|
57
|
+
* how many execution steps it saw, and how many actually had read entries.
|
|
58
|
+
* `stepsWithReads === 0` over a multi-step run is the machine-detectable
|
|
59
|
+
* signature of `readTracking: 'off'` — WITHOUT this, a reads-less slice is
|
|
60
|
+
* indistinguishable from "genuinely no upstream dependencies", which is a
|
|
61
|
+
* lie a triage tool must never tell. Copied onto
|
|
62
|
+
* {@link VariableSlice.readsCoverage}.
|
|
63
|
+
*/
|
|
64
|
+
readonly coverage?: ReadsCoverage;
|
|
65
|
+
}
|
|
66
|
+
/** See {@link KeysReadSource.coverage}. */
|
|
67
|
+
export interface ReadsCoverage {
|
|
68
|
+
/** Execution steps the strategy saw (nodes with a runtimeStageId). */
|
|
69
|
+
readonly steps: number;
|
|
70
|
+
/** Of those, steps that had at least one recorded read key. */
|
|
71
|
+
readonly stepsWithReads: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Why a slice could not be produced. Honest absence is a first-class result:
|
|
75
|
+
* - `'empty-log'` — there are no commits at all (run never executed, or
|
|
76
|
+
* snapshot came from elsewhere).
|
|
77
|
+
* - `'never-written'` — no commit in range wrote `key`. The value (if any)
|
|
78
|
+
* came from the run's INITIAL state, run `input` (frozen args channel), or
|
|
79
|
+
* a closure — none of which the commit log can see. Same blind spot as
|
|
80
|
+
* `findLastWriter`.
|
|
81
|
+
*/
|
|
82
|
+
export type MissingSliceReason = 'empty-log' | 'never-written';
|
|
83
|
+
/**
|
|
84
|
+
* The result of a variable-first backward slice: "why is `key` what it is?".
|
|
85
|
+
*
|
|
86
|
+
* Anchoring rule: the slice is rooted at the LAST writer of `key` (before
|
|
87
|
+
* `before`, when given) — the commit that made the value what it currently
|
|
88
|
+
* is. Everything upstream of that writer is reached through the causal DAG.
|
|
89
|
+
*
|
|
90
|
+
* SERIALIZATION WARNING: `root` is an in-memory DAG — nodes appear in BOTH
|
|
91
|
+
* `parents` and `parentEdges[].parent`, and shared ancestors (diamonds) are
|
|
92
|
+
* the same object reached through many paths. `JSON.stringify(slice)`
|
|
93
|
+
* duplicates every shared subtree per path and explodes combinatorially.
|
|
94
|
+
* Never stringify it: use `sliceToJSON()` (flat, id-referenced, linear) for
|
|
95
|
+
* wire transfer or `formatSlice()` (bounded string) for LLM tools.
|
|
96
|
+
*/
|
|
97
|
+
export interface VariableSlice {
|
|
98
|
+
/** The state key that was asked about (normalised string form). */
|
|
99
|
+
key: string;
|
|
100
|
+
/**
|
|
101
|
+
* Exclusive commit-array-index upper bound the writer search was anchored
|
|
102
|
+
* at ("as it stood before this idx"). Undefined = the whole log (current
|
|
103
|
+
* value).
|
|
104
|
+
*/
|
|
105
|
+
before?: number;
|
|
106
|
+
/** The commit that last wrote `key` — the slice anchor. Absent when missing. */
|
|
107
|
+
writer?: CommitBundle;
|
|
108
|
+
/**
|
|
109
|
+
* The backward causal DAG rooted at the writer (same `CausalNode` shape as
|
|
110
|
+
* `causalChain` — parentEdges carry keyed data/control edges, honesty via
|
|
111
|
+
* `incompleteSources`/`truncated`). Absent when missing. See the
|
|
112
|
+
* serialization warning on this interface before stringifying.
|
|
113
|
+
*/
|
|
114
|
+
root?: CausalNode;
|
|
115
|
+
/** Present ONLY when `root` is absent — why there is no slice. */
|
|
116
|
+
missing?: MissingSliceReason;
|
|
117
|
+
/** Which {@link KeysReadSource} strategy resolved reads (honesty/debug). */
|
|
118
|
+
keysReadKind: string;
|
|
119
|
+
/**
|
|
120
|
+
* Honesty telemetry copied from the strategy when it provides one — see
|
|
121
|
+
* {@link KeysReadSource.coverage}. A root with no parents AND
|
|
122
|
+
* `stepsWithReads === 0` means "reads were not recorded", NOT "no
|
|
123
|
+
* dependencies"; triage tools must say so.
|
|
124
|
+
*/
|
|
125
|
+
readsCoverage?: ReadsCoverage;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* How an element's birth commit was determined — the honesty axis of
|
|
129
|
+
* append-fold provenance. Ordered strongest → weakest:
|
|
130
|
+
*
|
|
131
|
+
* - `'append-verb'` — the engine RECORDED this tail append
|
|
132
|
+
* (`commitValues: 'delta'`). Exact by construction.
|
|
133
|
+
* - `'prefix-inference'` — a full-value write preserved the previous array as
|
|
134
|
+
* a strict prefix, so the new tail is attributed to this commit. Heuristic:
|
|
135
|
+
* a writer that REPLACED the array with one that happens to share the old
|
|
136
|
+
* prefix is indistinguishable from an append. Right in practice (push-style
|
|
137
|
+
* growth), labeled honestly so consumers can tell.
|
|
138
|
+
* - `'whole-value'` — the array was (re)placed wholesale; every
|
|
139
|
+
* element's provenance resets to this commit. Exact but coarse.
|
|
140
|
+
*/
|
|
141
|
+
export type AttributionBasis = 'append-verb' | 'prefix-inference' | 'whole-value';
|
|
142
|
+
/**
|
|
143
|
+
* The birth record of ONE array element: which commit (and therefore which
|
|
144
|
+
* stage execution) first put it there. This is what turns the agent
|
|
145
|
+
* mega-key problem ("everything depends on `history`") into element-level
|
|
146
|
+
* answers ("history[7] was appended by tool-calls#41 in iteration 3").
|
|
147
|
+
*
|
|
148
|
+
* @see elementProvenance — the query that returns this record.
|
|
149
|
+
*/
|
|
150
|
+
export interface ElementBirth {
|
|
151
|
+
/** Element index in the reconstructed array at query time. */
|
|
152
|
+
index: number;
|
|
153
|
+
/** Commit ARRAY position (the `CommitBundle.idx` space) of the birth. */
|
|
154
|
+
commitIdx: number;
|
|
155
|
+
/** Execution step that wrote it — joins to slices, recorders, UIs. */
|
|
156
|
+
runtimeStageId: string;
|
|
157
|
+
/** Stable stage identifier of the writer. */
|
|
158
|
+
stageId: string;
|
|
159
|
+
/** Human-readable stage name of the writer. */
|
|
160
|
+
stageName: string;
|
|
161
|
+
/** The trace verb of the birth commit's entry for this key. */
|
|
162
|
+
verb: TraceEntry['verb'];
|
|
163
|
+
/** How the attribution was determined — see {@link AttributionBasis}. */
|
|
164
|
+
basis: AttributionBasis;
|
|
165
|
+
/**
|
|
166
|
+
* The element's value as of the fold (detached clone). Redaction note:
|
|
167
|
+
* values are re-served exactly as the commit log stored them — a redacted
|
|
168
|
+
* key's `'[REDACTED]'` placeholder stays redacted; this layer never
|
|
169
|
+
* resurrects originals.
|
|
170
|
+
*/
|
|
171
|
+
value: unknown;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Why element provenance could not be produced (mirrors
|
|
175
|
+
* {@link MissingSliceReason} — one honest-absence pattern module-wide):
|
|
176
|
+
* - `'empty-log'` — no commits at all.
|
|
177
|
+
* - `'never-written'` — no commit in range touched the key.
|
|
178
|
+
* - `'not-an-array'` — the key WAS written but its folded value is not an
|
|
179
|
+
* array at the queried point: a scalar/object key, a deleted key, or a
|
|
180
|
+
* merge that degraded it. Element provenance is an array concept — for
|
|
181
|
+
* scalar keys the right query is `sliceForKey`.
|
|
182
|
+
*/
|
|
183
|
+
export type MissingProvenanceReason = 'empty-log' | 'never-written' | 'not-an-array';
|
|
184
|
+
/**
|
|
185
|
+
* Element-level provenance for one array-valued key. Mirrors
|
|
186
|
+
* {@link VariableSlice}'s honest-absence shape: on success `atIdx`/`length`/
|
|
187
|
+
* `births` are set; otherwise `missing` says why (present ONLY when `births`
|
|
188
|
+
* is absent).
|
|
189
|
+
*
|
|
190
|
+
* @see arrayProvenance — the query that returns this.
|
|
191
|
+
* @see ElementBirth — one record per element, index-aligned.
|
|
192
|
+
*/
|
|
193
|
+
export interface ArrayProvenance {
|
|
194
|
+
/** The state key (normalised string form). */
|
|
195
|
+
key: string;
|
|
196
|
+
/** Inclusive commit array idx the fold ran to. Absent when missing. */
|
|
197
|
+
atIdx?: number;
|
|
198
|
+
/** Length of the reconstructed array (births.length === length). */
|
|
199
|
+
length?: number;
|
|
200
|
+
/** One birth per element, index-aligned with the reconstructed array. */
|
|
201
|
+
births?: ElementBirth[];
|
|
202
|
+
/** Present ONLY when `births` is absent — why there is no provenance. */
|
|
203
|
+
missing?: MissingProvenanceReason;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Flat, id-referenced, JSON-safe projection of a {@link VariableSlice} —
|
|
207
|
+
* linear in node count (each node serialized exactly once; edges reference
|
|
208
|
+
* ids). THE shape to persist, send over the wire, or hand to structured
|
|
209
|
+
* consumers. See the serialization warning on {@link VariableSlice}.
|
|
210
|
+
*/
|
|
211
|
+
export interface SliceJSON {
|
|
212
|
+
key: string;
|
|
213
|
+
before?: number;
|
|
214
|
+
missing?: MissingSliceReason;
|
|
215
|
+
keysReadKind: string;
|
|
216
|
+
readsCoverage?: ReadsCoverage;
|
|
217
|
+
/** runtimeStageId of the anchor writer. Absent when missing. */
|
|
218
|
+
writerId?: string;
|
|
219
|
+
/** Every DAG node exactly once, keyed by runtimeStageId. */
|
|
220
|
+
nodes?: Record<string, {
|
|
221
|
+
stageId: string;
|
|
222
|
+
stageName: string;
|
|
223
|
+
keysWritten: string[];
|
|
224
|
+
depth: number;
|
|
225
|
+
incompleteSources?: ReadonlyArray<UntrackedSource>;
|
|
226
|
+
}>;
|
|
227
|
+
/** Id-referenced edges: child (`from`) depends on parent (`to`). */
|
|
228
|
+
edges?: Array<{
|
|
229
|
+
from: string;
|
|
230
|
+
to: string;
|
|
231
|
+
kind: 'data' | 'control';
|
|
232
|
+
key?: string;
|
|
233
|
+
weight: number;
|
|
234
|
+
}>;
|
|
235
|
+
/** Copied from the root when a budget cut the slice. */
|
|
236
|
+
truncated?: {
|
|
237
|
+
byDepth: boolean;
|
|
238
|
+
byNodes: boolean;
|
|
239
|
+
};
|
|
240
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* slice/types.ts — data shapes of the variable-first slicing layer.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS LIBRARY EXISTS (context for future readers, human or LLM):
|
|
5
|
+
* `causalChain()` (memory/backtrack.ts) answers "what influenced this STEP?"
|
|
6
|
+
* — its address space is runtimeStageIds. But every triage consumer starts
|
|
7
|
+
* from a VARIABLE: a human clicks the key `creditTier` in a UI; an LLM tool
|
|
8
|
+
* call asks "where did history[7] come from?". This library is the address
|
|
9
|
+
* translation layer: variable in → slice out. It deliberately adds NO new
|
|
10
|
+
* capture and NO new graph algorithm — it composes the commit-log primitives
|
|
11
|
+
* (findLastWriter / causalChain / the per-key verb fold) so every surface
|
|
12
|
+
* (UI panel, LLM tool, offline autopsy agent) asks the question the same way
|
|
13
|
+
* and gets the same, honestly-labeled answer.
|
|
14
|
+
*
|
|
15
|
+
* DAG position: memory ← slice. This module may import ONLY from memory/.
|
|
16
|
+
* Recorders, engine, and runner must never be imported here — that is what
|
|
17
|
+
* keeps it a tiny, separately-evolvable library (see README.md).
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NsaWNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc2xpY2UvdHlwZXMudHMg4oCUIGRhdGEgc2hhcGVzIG9mIHRoZSB2YXJpYWJsZS1maXJzdCBzbGljaW5nIGxheWVyLlxuICpcbiAqIFdIWSBUSElTIExJQlJBUlkgRVhJU1RTIChjb250ZXh0IGZvciBmdXR1cmUgcmVhZGVycywgaHVtYW4gb3IgTExNKTpcbiAqIGBjYXVzYWxDaGFpbigpYCAobWVtb3J5L2JhY2t0cmFjay50cykgYW5zd2VycyBcIndoYXQgaW5mbHVlbmNlZCB0aGlzIFNURVA/XCJcbiAqIOKAlCBpdHMgYWRkcmVzcyBzcGFjZSBpcyBydW50aW1lU3RhZ2VJZHMuIEJ1dCBldmVyeSB0cmlhZ2UgY29uc3VtZXIgc3RhcnRzXG4gKiBmcm9tIGEgVkFSSUFCTEU6IGEgaHVtYW4gY2xpY2tzIHRoZSBrZXkgYGNyZWRpdFRpZXJgIGluIGEgVUk7IGFuIExMTSB0b29sXG4gKiBjYWxsIGFza3MgXCJ3aGVyZSBkaWQgaGlzdG9yeVs3XSBjb21lIGZyb20/XCIuIFRoaXMgbGlicmFyeSBpcyB0aGUgYWRkcmVzc1xuICogdHJhbnNsYXRpb24gbGF5ZXI6IHZhcmlhYmxlIGluIOKGkiBzbGljZSBvdXQuIEl0IGRlbGliZXJhdGVseSBhZGRzIE5PIG5ld1xuICogY2FwdHVyZSBhbmQgTk8gbmV3IGdyYXBoIGFsZ29yaXRobSDigJQgaXQgY29tcG9zZXMgdGhlIGNvbW1pdC1sb2cgcHJpbWl0aXZlc1xuICogKGZpbmRMYXN0V3JpdGVyIC8gY2F1c2FsQ2hhaW4gLyB0aGUgcGVyLWtleSB2ZXJiIGZvbGQpIHNvIGV2ZXJ5IHN1cmZhY2VcbiAqIChVSSBwYW5lbCwgTExNIHRvb2wsIG9mZmxpbmUgYXV0b3BzeSBhZ2VudCkgYXNrcyB0aGUgcXVlc3Rpb24gdGhlIHNhbWUgd2F5XG4gKiBhbmQgZ2V0cyB0aGUgc2FtZSwgaG9uZXN0bHktbGFiZWxlZCBhbnN3ZXIuXG4gKlxuICogREFHIHBvc2l0aW9uOiBtZW1vcnkg4oaQIHNsaWNlLiBUaGlzIG1vZHVsZSBtYXkgaW1wb3J0IE9OTFkgZnJvbSBtZW1vcnkvLlxuICogUmVjb3JkZXJzLCBlbmdpbmUsIGFuZCBydW5uZXIgbXVzdCBuZXZlciBiZSBpbXBvcnRlZCBoZXJlIOKAlCB0aGF0IGlzIHdoYXRcbiAqIGtlZXBzIGl0IGEgdGlueSwgc2VwYXJhdGVseS1ldm9sdmFibGUgbGlicmFyeSAoc2VlIFJFQURNRS5tZCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDYXVzYWxOb2RlLCBLZXlzUmVhZExvb2t1cCB9IGZyb20gJy4uL21lbW9yeS9iYWNrdHJhY2suanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIFRyYWNlRW50cnksIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBLZXlzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEEgc3RhdGUga2V5IGFzIGNvbnN1bWVycyBrbm93IGl0OiBlaXRoZXIgdGhlIHBsYWluIHRvcC1sZXZlbCBrZXkgc3RyaW5nLCBvclxuICogYSBwYXRoIGFycmF5IGZvciBuZXN0ZWQga2V5cyAoYFsnY3VzdG9tZXInLCAnYWRkcmVzcyddYCkuIFBhdGggYXJyYXlzIGFyZVxuICogbm9ybWFsaXNlZCBpbnRlcm5hbGx5IOKAlCB0aGUgZW5naW5lJ3MgcGF0aCBkZWxpbWl0ZXIgbmV2ZXIgYXBwZWFycyBpbiB0aGlzXG4gKiBwdWJsaWMgY29udHJhY3QuXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXRlS2V5ID0gc3RyaW5nIHwgUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+O1xuXG4vLyDilIDilIAgS2V5c1JlYWQgc291cmNpbmcgKHN0cmF0ZWd5IGludGVyZmFjZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogU1RSQVRFR1kgSU5URVJGQUNFOiB3aGVyZSBwZXItc3RhZ2UgcmVhZCBrZXlzIGNvbWUgZnJvbS4gVEhFIGNhbm9uaWNhbFxuICogc3RyYXRlZ3kgbGlzdCBsaXZlcyBoZXJlIChpbXBsZW1lbnRhdGlvbnMgaW4ga2V5c1JlYWRTb3VyY2VzLnRzKTpcbiAqXG4gKiBSZWFkcyBhcmUgZGVsaWJlcmF0ZWx5IE5PVCBpbiB0aGUgY29tbWl0IGxvZyAoQ29tbWl0QnVuZGxlIGNhcnJpZXMgb25seSB0aGVcbiAqIGB1bnRyYWNrZWRTb3VyY2VzYCBob25lc3R5IGZsYWdzKSwgc28gYSBzbGljZSBuZWVkcyBhIHJlYWRzIHByb3ZpZGVyLiBUaGVyZVxuICogYXJlIHNldmVyYWwgbGVnaXRpbWF0ZSBwcm92aWRlcnMgd2l0aCBkaWZmZXJlbnQgdHJhZGUtb2ZmcywgYW5kIG5ldyBvbmVzXG4gKiB3aWxsIGFwcGVhciDigJQgaGVuY2UgYW4gaW50ZXJmYWNlIHJhdGhlciB0aGFuIGEgaGFyZGNvZGVkIHBhdGg6XG4gKlxuICogLSBga2V5c1JlYWRGcm9tRXhlY3V0aW9uVHJlZWAg4oCUIHBvc3QtaG9jLCBaRVJPIHNldHVwOiByZWFkcyBsaXZlIGluIHRoZVxuICogICBzbmFwc2hvdCdzIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgIHdoZW5ldmVyIGByZWFkVHJhY2tpbmdgIOKJoCAnb2ZmJ1xuICogICAoZGVmYXVsdCAnZnVsbCc7ICdzdW1tYXJ5JyBzdGlsbCBrZWVwcyB0aGUga2V5cykuIFVzZSB3aGVuIHlvdSBoYXZlIGFcbiAqICAgZmluaXNoZWQgcnVuJ3Mgc25hcHNob3QuXG4gKiAtIGBrZXlzUmVhZEZyb21NYXBgIOKAlCBhIHByZWJ1aWx0IE1hcC9vYmplY3QsIGUuZy4gY29sbGVjdGVkIGxpdmUgZnJvbVxuICogICBgU2NvcGVSZWNvcmRlci5vblJlYWRgIGV2ZW50cyBvciBkZXNlcmlhbGl6ZWQgZnJvbSBhIHN0b3JlZCB0cmFjZS5cbiAqIC0gYSBiYXJlIGBLZXlzUmVhZExvb2t1cGAgZnVuY3Rpb24g4oCUIGFueXRoaW5nIGVsc2UgKGUuZy4gUXVhbGl0eVJlY29yZGVyOlxuICogICBgKGlkKSA9PiByZWMuZ2V0QnlLZXkoaWQpPy5rZXlzUmVhZCA/PyBbXWApLiBXcmFwcGVkIGFzIGtpbmQgJ2N1c3RvbS1mbicuXG4gKlxuICogYGtpbmRgIGlzIGEgZGVidWdnaW5nL2hvbmVzdHkgYnJlYWRjcnVtYjogYFZhcmlhYmxlU2xpY2Uua2V5c1JlYWRLaW5kYFxuICogcmVjb3JkcyB3aGljaCBzdHJhdGVneSBwcm9kdWNlZCB0aGUgc2xpY2UsIHNvIGEgc3VycHJpc2luZyBzbGljZSBjYW4gYmVcbiAqIHRyYWNlZCBiYWNrIHRvIGl0cyByZWFkcyBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlzUmVhZFNvdXJjZSB7XG4gIC8qKiBEaXNjcmltaW5hdG9yIHN1cmZhY2VkIG9uIHtAbGluayBWYXJpYWJsZVNsaWNlLmtleXNSZWFkS2luZH0uICovXG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcbiAgLyoqIFRoZSBsb29rdXAgYGNhdXNhbENoYWluYCB3aWxsIGNhbGwgcGVyIHZpc2l0ZWQgbm9kZS4gKi9cbiAgcmVhZG9ubHkgbG9va3VwOiBLZXlzUmVhZExvb2t1cDtcbiAgLyoqXG4gICAqIE9QVElPTkFMIGhvbmVzdHkgdGVsZW1ldHJ5IGEgc3RyYXRlZ3kgY2FuIGNvbXB1dGUgd2hpbGUgaXQgYnVpbGRzOlxuICAgKiBob3cgbWFueSBleGVjdXRpb24gc3RlcHMgaXQgc2F3LCBhbmQgaG93IG1hbnkgYWN0dWFsbHkgaGFkIHJlYWQgZW50cmllcy5cbiAgICogYHN0ZXBzV2l0aFJlYWRzID09PSAwYCBvdmVyIGEgbXVsdGktc3RlcCBydW4gaXMgdGhlIG1hY2hpbmUtZGV0ZWN0YWJsZVxuICAgKiBzaWduYXR1cmUgb2YgYHJlYWRUcmFja2luZzogJ29mZidgIOKAlCBXSVRIT1VUIHRoaXMsIGEgcmVhZHMtbGVzcyBzbGljZSBpc1xuICAgKiBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIFwiZ2VudWluZWx5IG5vIHVwc3RyZWFtIGRlcGVuZGVuY2llc1wiLCB3aGljaCBpcyBhXG4gICAqIGxpZSBhIHRyaWFnZSB0b29sIG11c3QgbmV2ZXIgdGVsbC4gQ29waWVkIG9udG9cbiAgICoge0BsaW5rIFZhcmlhYmxlU2xpY2UucmVhZHNDb3ZlcmFnZX0uXG4gICAqL1xuICByZWFkb25seSBjb3ZlcmFnZT86IFJlYWRzQ292ZXJhZ2U7XG59XG5cbi8qKiBTZWUge0BsaW5rIEtleXNSZWFkU291cmNlLmNvdmVyYWdlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHNDb3ZlcmFnZSB7XG4gIC8qKiBFeGVjdXRpb24gc3RlcHMgdGhlIHN0cmF0ZWd5IHNhdyAobm9kZXMgd2l0aCBhIHJ1bnRpbWVTdGFnZUlkKS4gKi9cbiAgcmVhZG9ubHkgc3RlcHM6IG51bWJlcjtcbiAgLyoqIE9mIHRob3NlLCBzdGVwcyB0aGF0IGhhZCBhdCBsZWFzdCBvbmUgcmVjb3JkZWQgcmVhZCBrZXkuICovXG4gIHJlYWRvbmx5IHN0ZXBzV2l0aFJlYWRzOiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgCBWYXJpYWJsZSBzbGljZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBXaHkgYSBzbGljZSBjb3VsZCBub3QgYmUgcHJvZHVjZWQuIEhvbmVzdCBhYnNlbmNlIGlzIGEgZmlyc3QtY2xhc3MgcmVzdWx0OlxuICogLSBgJ2VtcHR5LWxvZydgICAgICDigJQgdGhlcmUgYXJlIG5vIGNvbW1pdHMgYXQgYWxsIChydW4gbmV2ZXIgZXhlY3V0ZWQsIG9yXG4gKiAgIHNuYXBzaG90IGNhbWUgZnJvbSBlbHNld2hlcmUpLlxuICogLSBgJ25ldmVyLXdyaXR0ZW4nYCDigJQgbm8gY29tbWl0IGluIHJhbmdlIHdyb3RlIGBrZXlgLiBUaGUgdmFsdWUgKGlmIGFueSlcbiAqICAgY2FtZSBmcm9tIHRoZSBydW4ncyBJTklUSUFMIHN0YXRlLCBydW4gYGlucHV0YCAoZnJvemVuIGFyZ3MgY2hhbm5lbCksIG9yXG4gKiAgIGEgY2xvc3VyZSDigJQgbm9uZSBvZiB3aGljaCB0aGUgY29tbWl0IGxvZyBjYW4gc2VlLiBTYW1lIGJsaW5kIHNwb3QgYXNcbiAqICAgYGZpbmRMYXN0V3JpdGVyYC5cbiAqL1xuZXhwb3J0IHR5cGUgTWlzc2luZ1NsaWNlUmVhc29uID0gJ2VtcHR5LWxvZycgfCAnbmV2ZXItd3JpdHRlbic7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBhIHZhcmlhYmxlLWZpcnN0IGJhY2t3YXJkIHNsaWNlOiBcIndoeSBpcyBga2V5YCB3aGF0IGl0IGlzP1wiLlxuICpcbiAqIEFuY2hvcmluZyBydWxlOiB0aGUgc2xpY2UgaXMgcm9vdGVkIGF0IHRoZSBMQVNUIHdyaXRlciBvZiBga2V5YCAoYmVmb3JlXG4gKiBgYmVmb3JlYCwgd2hlbiBnaXZlbikg4oCUIHRoZSBjb21taXQgdGhhdCBtYWRlIHRoZSB2YWx1ZSB3aGF0IGl0IGN1cnJlbnRseVxuICogaXMuIEV2ZXJ5dGhpbmcgdXBzdHJlYW0gb2YgdGhhdCB3cml0ZXIgaXMgcmVhY2hlZCB0aHJvdWdoIHRoZSBjYXVzYWwgREFHLlxuICpcbiAqIFNFUklBTElaQVRJT04gV0FSTklORzogYHJvb3RgIGlzIGFuIGluLW1lbW9yeSBEQUcg4oCUIG5vZGVzIGFwcGVhciBpbiBCT1RIXG4gKiBgcGFyZW50c2AgYW5kIGBwYXJlbnRFZGdlc1tdLnBhcmVudGAsIGFuZCBzaGFyZWQgYW5jZXN0b3JzIChkaWFtb25kcykgYXJlXG4gKiB0aGUgc2FtZSBvYmplY3QgcmVhY2hlZCB0aHJvdWdoIG1hbnkgcGF0aHMuIGBKU09OLnN0cmluZ2lmeShzbGljZSlgXG4gKiBkdXBsaWNhdGVzIGV2ZXJ5IHNoYXJlZCBzdWJ0cmVlIHBlciBwYXRoIGFuZCBleHBsb2RlcyBjb21iaW5hdG9yaWFsbHkuXG4gKiBOZXZlciBzdHJpbmdpZnkgaXQ6IHVzZSBgc2xpY2VUb0pTT04oKWAgKGZsYXQsIGlkLXJlZmVyZW5jZWQsIGxpbmVhcikgZm9yXG4gKiB3aXJlIHRyYW5zZmVyIG9yIGBmb3JtYXRTbGljZSgpYCAoYm91bmRlZCBzdHJpbmcpIGZvciBMTE0gdG9vbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVTbGljZSB7XG4gIC8qKiBUaGUgc3RhdGUga2V5IHRoYXQgd2FzIGFza2VkIGFib3V0IChub3JtYWxpc2VkIHN0cmluZyBmb3JtKS4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeGNsdXNpdmUgY29tbWl0LWFycmF5LWluZGV4IHVwcGVyIGJvdW5kIHRoZSB3cml0ZXIgc2VhcmNoIHdhcyBhbmNob3JlZFxuICAgKiBhdCAoXCJhcyBpdCBzdG9vZCBiZWZvcmUgdGhpcyBpZHhcIikuIFVuZGVmaW5lZCA9IHRoZSB3aG9sZSBsb2cgKGN1cnJlbnRcbiAgICogdmFsdWUpLlxuICAgKi9cbiAgYmVmb3JlPzogbnVtYmVyO1xuICAvKiogVGhlIGNvbW1pdCB0aGF0IGxhc3Qgd3JvdGUgYGtleWAg4oCUIHRoZSBzbGljZSBhbmNob3IuIEFic2VudCB3aGVuIG1pc3NpbmcuICovXG4gIHdyaXRlcj86IENvbW1pdEJ1bmRsZTtcbiAgLyoqXG4gICAqIFRoZSBiYWNrd2FyZCBjYXVzYWwgREFHIHJvb3RlZCBhdCB0aGUgd3JpdGVyIChzYW1lIGBDYXVzYWxOb2RlYCBzaGFwZSBhc1xuICAgKiBgY2F1c2FsQ2hhaW5gIOKAlCBwYXJlbnRFZGdlcyBjYXJyeSBrZXllZCBkYXRhL2NvbnRyb2wgZWRnZXMsIGhvbmVzdHkgdmlhXG4gICAqIGBpbmNvbXBsZXRlU291cmNlc2AvYHRydW5jYXRlZGApLiBBYnNlbnQgd2hlbiBtaXNzaW5nLiBTZWUgdGhlXG4gICAqIHNlcmlhbGl6YXRpb24gd2FybmluZyBvbiB0aGlzIGludGVyZmFjZSBiZWZvcmUgc3RyaW5naWZ5aW5nLlxuICAgKi9cbiAgcm9vdD86IENhdXNhbE5vZGU7XG4gIC8qKiBQcmVzZW50IE9OTFkgd2hlbiBgcm9vdGAgaXMgYWJzZW50IOKAlCB3aHkgdGhlcmUgaXMgbm8gc2xpY2UuICovXG4gIG1pc3Npbmc/OiBNaXNzaW5nU2xpY2VSZWFzb247XG4gIC8qKiBXaGljaCB7QGxpbmsgS2V5c1JlYWRTb3VyY2V9IHN0cmF0ZWd5IHJlc29sdmVkIHJlYWRzIChob25lc3R5L2RlYnVnKS4gKi9cbiAga2V5c1JlYWRLaW5kOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb25lc3R5IHRlbGVtZXRyeSBjb3BpZWQgZnJvbSB0aGUgc3RyYXRlZ3kgd2hlbiBpdCBwcm92aWRlcyBvbmUg4oCUIHNlZVxuICAgKiB7QGxpbmsgS2V5c1JlYWRTb3VyY2UuY292ZXJhZ2V9LiBBIHJvb3Qgd2l0aCBubyBwYXJlbnRzIEFORFxuICAgKiBgc3RlcHNXaXRoUmVhZHMgPT09IDBgIG1lYW5zIFwicmVhZHMgd2VyZSBub3QgcmVjb3JkZWRcIiwgTk9UIFwibm9cbiAgICogZGVwZW5kZW5jaWVzXCI7IHRyaWFnZSB0b29scyBtdXN0IHNheSBzby5cbiAgICovXG4gIHJlYWRzQ292ZXJhZ2U/OiBSZWFkc0NvdmVyYWdlO1xufVxuXG4vLyDilIDilIAgRWxlbWVudCBwcm92ZW5hbmNlIChhcHBlbmQtZm9sZCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSG93IGFuIGVsZW1lbnQncyBiaXJ0aCBjb21taXQgd2FzIGRldGVybWluZWQg4oCUIHRoZSBob25lc3R5IGF4aXMgb2ZcbiAqIGFwcGVuZC1mb2xkIHByb3ZlbmFuY2UuIE9yZGVyZWQgc3Ryb25nZXN0IOKGkiB3ZWFrZXN0OlxuICpcbiAqIC0gYCdhcHBlbmQtdmVyYidgICAgICAg4oCUIHRoZSBlbmdpbmUgUkVDT1JERUQgdGhpcyB0YWlsIGFwcGVuZFxuICogICAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2ApLiBFeGFjdCBieSBjb25zdHJ1Y3Rpb24uXG4gKiAtIGAncHJlZml4LWluZmVyZW5jZSdgIOKAlCBhIGZ1bGwtdmFsdWUgd3JpdGUgcHJlc2VydmVkIHRoZSBwcmV2aW91cyBhcnJheSBhc1xuICogICBhIHN0cmljdCBwcmVmaXgsIHNvIHRoZSBuZXcgdGFpbCBpcyBhdHRyaWJ1dGVkIHRvIHRoaXMgY29tbWl0LiBIZXVyaXN0aWM6XG4gKiAgIGEgd3JpdGVyIHRoYXQgUkVQTEFDRUQgdGhlIGFycmF5IHdpdGggb25lIHRoYXQgaGFwcGVucyB0byBzaGFyZSB0aGUgb2xkXG4gKiAgIHByZWZpeCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGFwcGVuZC4gUmlnaHQgaW4gcHJhY3RpY2UgKHB1c2gtc3R5bGVcbiAqICAgZ3Jvd3RoKSwgbGFiZWxlZCBob25lc3RseSBzbyBjb25zdW1lcnMgY2FuIHRlbGwuXG4gKiAtIGAnd2hvbGUtdmFsdWUnYCAgICAgIOKAlCB0aGUgYXJyYXkgd2FzIChyZSlwbGFjZWQgd2hvbGVzYWxlOyBldmVyeVxuICogICBlbGVtZW50J3MgcHJvdmVuYW5jZSByZXNldHMgdG8gdGhpcyBjb21taXQuIEV4YWN0IGJ1dCBjb2Fyc2UuXG4gKi9cbmV4cG9ydCB0eXBlIEF0dHJpYnV0aW9uQmFzaXMgPSAnYXBwZW5kLXZlcmInIHwgJ3ByZWZpeC1pbmZlcmVuY2UnIHwgJ3dob2xlLXZhbHVlJztcblxuLyoqXG4gKiBUaGUgYmlydGggcmVjb3JkIG9mIE9ORSBhcnJheSBlbGVtZW50OiB3aGljaCBjb21taXQgKGFuZCB0aGVyZWZvcmUgd2hpY2hcbiAqIHN0YWdlIGV4ZWN1dGlvbikgZmlyc3QgcHV0IGl0IHRoZXJlLiBUaGlzIGlzIHdoYXQgdHVybnMgdGhlIGFnZW50XG4gKiBtZWdhLWtleSBwcm9ibGVtIChcImV2ZXJ5dGhpbmcgZGVwZW5kcyBvbiBgaGlzdG9yeWBcIikgaW50byBlbGVtZW50LWxldmVsXG4gKiBhbnN3ZXJzIChcImhpc3RvcnlbN10gd2FzIGFwcGVuZGVkIGJ5IHRvb2wtY2FsbHMjNDEgaW4gaXRlcmF0aW9uIDNcIikuXG4gKlxuICogQHNlZSBlbGVtZW50UHJvdmVuYW5jZSDigJQgdGhlIHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGlzIHJlY29yZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50QmlydGgge1xuICAvKiogRWxlbWVudCBpbmRleCBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBhcnJheSBhdCBxdWVyeSB0aW1lLiAqL1xuICBpbmRleDogbnVtYmVyO1xuICAvKiogQ29tbWl0IEFSUkFZIHBvc2l0aW9uICh0aGUgYENvbW1pdEJ1bmRsZS5pZHhgIHNwYWNlKSBvZiB0aGUgYmlydGguICovXG4gIGNvbW1pdElkeDogbnVtYmVyO1xuICAvKiogRXhlY3V0aW9uIHN0ZXAgdGhhdCB3cm90ZSBpdCDigJQgam9pbnMgdG8gc2xpY2VzLCByZWNvcmRlcnMsIFVJcy4gKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIG9mIHRoZSB3cml0ZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUgb2YgdGhlIHdyaXRlci4gKi9cbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgdHJhY2UgdmVyYiBvZiB0aGUgYmlydGggY29tbWl0J3MgZW50cnkgZm9yIHRoaXMga2V5LiAqL1xuICB2ZXJiOiBUcmFjZUVudHJ5Wyd2ZXJiJ107XG4gIC8qKiBIb3cgdGhlIGF0dHJpYnV0aW9uIHdhcyBkZXRlcm1pbmVkIOKAlCBzZWUge0BsaW5rIEF0dHJpYnV0aW9uQmFzaXN9LiAqL1xuICBiYXNpczogQXR0cmlidXRpb25CYXNpcztcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50J3MgdmFsdWUgYXMgb2YgdGhlIGZvbGQgKGRldGFjaGVkIGNsb25lKS4gUmVkYWN0aW9uIG5vdGU6XG4gICAqIHZhbHVlcyBhcmUgcmUtc2VydmVkIGV4YWN0bHkgYXMgdGhlIGNvbW1pdCBsb2cgc3RvcmVkIHRoZW0g4oCUIGEgcmVkYWN0ZWRcbiAgICoga2V5J3MgYCdbUkVEQUNURURdJ2AgcGxhY2Vob2xkZXIgc3RheXMgcmVkYWN0ZWQ7IHRoaXMgbGF5ZXIgbmV2ZXJcbiAgICogcmVzdXJyZWN0cyBvcmlnaW5hbHMuXG4gICAqL1xuICB2YWx1ZTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBXaHkgZWxlbWVudCBwcm92ZW5hbmNlIGNvdWxkIG5vdCBiZSBwcm9kdWNlZCAobWlycm9yc1xuICoge0BsaW5rIE1pc3NpbmdTbGljZVJlYXNvbn0g4oCUIG9uZSBob25lc3QtYWJzZW5jZSBwYXR0ZXJuIG1vZHVsZS13aWRlKTpcbiAqIC0gYCdlbXB0eS1sb2cnYCAgICAg4oCUIG5vIGNvbW1pdHMgYXQgYWxsLlxuICogLSBgJ25ldmVyLXdyaXR0ZW4nYCDigJQgbm8gY29tbWl0IGluIHJhbmdlIHRvdWNoZWQgdGhlIGtleS5cbiAqIC0gYCdub3QtYW4tYXJyYXknYCAg4oCUIHRoZSBrZXkgV0FTIHdyaXR0ZW4gYnV0IGl0cyBmb2xkZWQgdmFsdWUgaXMgbm90IGFuXG4gKiAgIGFycmF5IGF0IHRoZSBxdWVyaWVkIHBvaW50OiBhIHNjYWxhci9vYmplY3Qga2V5LCBhIGRlbGV0ZWQga2V5LCBvciBhXG4gKiAgIG1lcmdlIHRoYXQgZGVncmFkZWQgaXQuIEVsZW1lbnQgcHJvdmVuYW5jZSBpcyBhbiBhcnJheSBjb25jZXB0IOKAlCBmb3JcbiAqICAgc2NhbGFyIGtleXMgdGhlIHJpZ2h0IHF1ZXJ5IGlzIGBzbGljZUZvcktleWAuXG4gKi9cbmV4cG9ydCB0eXBlIE1pc3NpbmdQcm92ZW5hbmNlUmVhc29uID0gJ2VtcHR5LWxvZycgfCAnbmV2ZXItd3JpdHRlbicgfCAnbm90LWFuLWFycmF5JztcblxuLyoqXG4gKiBFbGVtZW50LWxldmVsIHByb3ZlbmFuY2UgZm9yIG9uZSBhcnJheS12YWx1ZWQga2V5LiBNaXJyb3JzXG4gKiB7QGxpbmsgVmFyaWFibGVTbGljZX0ncyBob25lc3QtYWJzZW5jZSBzaGFwZTogb24gc3VjY2VzcyBgYXRJZHhgL2BsZW5ndGhgL1xuICogYGJpcnRoc2AgYXJlIHNldDsgb3RoZXJ3aXNlIGBtaXNzaW5nYCBzYXlzIHdoeSAocHJlc2VudCBPTkxZIHdoZW4gYGJpcnRoc2BcbiAqIGlzIGFic2VudCkuXG4gKlxuICogQHNlZSBhcnJheVByb3ZlbmFuY2Ug4oCUIHRoZSBxdWVyeSB0aGF0IHJldHVybnMgdGhpcy5cbiAqIEBzZWUgRWxlbWVudEJpcnRoIOKAlCBvbmUgcmVjb3JkIHBlciBlbGVtZW50LCBpbmRleC1hbGlnbmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFycmF5UHJvdmVuYW5jZSB7XG4gIC8qKiBUaGUgc3RhdGUga2V5IChub3JtYWxpc2VkIHN0cmluZyBmb3JtKS4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBJbmNsdXNpdmUgY29tbWl0IGFycmF5IGlkeCB0aGUgZm9sZCByYW4gdG8uIEFic2VudCB3aGVuIG1pc3NpbmcuICovXG4gIGF0SWR4PzogbnVtYmVyO1xuICAvKiogTGVuZ3RoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGFycmF5IChiaXJ0aHMubGVuZ3RoID09PSBsZW5ndGgpLiAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG4gIC8qKiBPbmUgYmlydGggcGVyIGVsZW1lbnQsIGluZGV4LWFsaWduZWQgd2l0aCB0aGUgcmVjb25zdHJ1Y3RlZCBhcnJheS4gKi9cbiAgYmlydGhzPzogRWxlbWVudEJpcnRoW107XG4gIC8qKiBQcmVzZW50IE9OTFkgd2hlbiBgYmlydGhzYCBpcyBhYnNlbnQg4oCUIHdoeSB0aGVyZSBpcyBubyBwcm92ZW5hbmNlLiAqL1xuICBtaXNzaW5nPzogTWlzc2luZ1Byb3ZlbmFuY2VSZWFzb247XG59XG5cbi8vIOKUgOKUgCBKU09OLXNhZmUgc2VyaWFsaXphdGlvbiAoZm9yIHdpcmUgdHJhbnNmZXIgLyBMTE0gdG9vbHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEZsYXQsIGlkLXJlZmVyZW5jZWQsIEpTT04tc2FmZSBwcm9qZWN0aW9uIG9mIGEge0BsaW5rIFZhcmlhYmxlU2xpY2V9IOKAlFxuICogbGluZWFyIGluIG5vZGUgY291bnQgKGVhY2ggbm9kZSBzZXJpYWxpemVkIGV4YWN0bHkgb25jZTsgZWRnZXMgcmVmZXJlbmNlXG4gKiBpZHMpLiBUSEUgc2hhcGUgdG8gcGVyc2lzdCwgc2VuZCBvdmVyIHRoZSB3aXJlLCBvciBoYW5kIHRvIHN0cnVjdHVyZWRcbiAqIGNvbnN1bWVycy4gU2VlIHRoZSBzZXJpYWxpemF0aW9uIHdhcm5pbmcgb24ge0BsaW5rIFZhcmlhYmxlU2xpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlSlNPTiB7XG4gIGtleTogc3RyaW5nO1xuICBiZWZvcmU/OiBudW1iZXI7XG4gIG1pc3Npbmc/OiBNaXNzaW5nU2xpY2VSZWFzb247XG4gIGtleXNSZWFkS2luZDogc3RyaW5nO1xuICByZWFkc0NvdmVyYWdlPzogUmVhZHNDb3ZlcmFnZTtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBhbmNob3Igd3JpdGVyLiBBYnNlbnQgd2hlbiBtaXNzaW5nLiAqL1xuICB3cml0ZXJJZD86IHN0cmluZztcbiAgLyoqIEV2ZXJ5IERBRyBub2RlIGV4YWN0bHkgb25jZSwga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuICovXG4gIG5vZGVzPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBzdGFnZUlkOiBzdHJpbmc7XG4gICAgICBzdGFnZU5hbWU6IHN0cmluZztcbiAgICAgIGtleXNXcml0dGVuOiBzdHJpbmdbXTtcbiAgICAgIGRlcHRoOiBudW1iZXI7XG4gICAgICBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgICB9XG4gID47XG4gIC8qKiBJZC1yZWZlcmVuY2VkIGVkZ2VzOiBjaGlsZCAoYGZyb21gKSBkZXBlbmRzIG9uIHBhcmVudCAoYHRvYCkuICovXG4gIGVkZ2VzPzogQXJyYXk8eyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmc7IGtpbmQ6ICdkYXRhJyB8ICdjb250cm9sJzsga2V5Pzogc3RyaW5nOyB3ZWlnaHQ6IG51bWJlciB9PjtcbiAgLyoqIENvcGllZCBmcm9tIHRoZSByb290IHdoZW4gYSBidWRnZXQgY3V0IHRoZSBzbGljZS4gKi9cbiAgdHJ1bmNhdGVkPzogeyBieURlcHRoOiBib29sZWFuOyBieU5vZGVzOiBib29sZWFuIH07XG59XG4iXX0=
|