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.
Files changed (227) hide show
  1. package/AGENTS.md +9 -9
  2. package/CLAUDE.md +82 -753
  3. package/README.md +51 -20
  4. package/dist/esm/advanced.d.ts +52 -0
  5. package/dist/esm/detach.d.ts +59 -0
  6. package/dist/esm/index.d.ts +202 -0
  7. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +475 -0
  8. package/dist/esm/lib/builder/FlowChartBuilder.js +4 -3
  9. package/dist/esm/lib/builder/index.d.ts +11 -0
  10. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +349 -0
  11. package/dist/esm/lib/builder/structure/StructureRecorderDispatcher.d.ts +77 -0
  12. package/dist/esm/lib/builder/typedFlowChart.d.ts +25 -0
  13. package/dist/esm/lib/builder/types.d.ts +154 -0
  14. package/dist/esm/lib/capture/envelope.d.ts +169 -0
  15. package/dist/esm/lib/capture/index.d.ts +16 -0
  16. package/dist/esm/lib/capture/policies.d.ts +42 -0
  17. package/dist/esm/lib/capture/summarize.d.ts +65 -0
  18. package/dist/esm/lib/contract/defineContract.d.ts +18 -0
  19. package/dist/esm/lib/contract/index.d.ts +14 -0
  20. package/dist/esm/lib/contract/openapi.d.ts +18 -0
  21. package/dist/esm/lib/contract/schema.d.ts +13 -0
  22. package/dist/esm/lib/contract/types.d.ts +105 -0
  23. package/dist/esm/lib/decide/decide.d.ts +47 -0
  24. package/dist/esm/lib/decide/evaluator.d.ts +39 -0
  25. package/dist/esm/lib/decide/evidence.d.ts +22 -0
  26. package/dist/esm/lib/decide/index.d.ts +12 -0
  27. package/dist/esm/lib/decide/types.d.ts +111 -0
  28. package/dist/esm/lib/detach/drivers/immediate.d.ts +39 -0
  29. package/dist/esm/lib/detach/drivers/microtaskBatch.d.ts +57 -0
  30. package/dist/esm/lib/detach/drivers/sendBeacon.d.ts +38 -0
  31. package/dist/esm/lib/detach/drivers/setImmediate.d.ts +32 -0
  32. package/dist/esm/lib/detach/drivers/setTimeout.d.ts +34 -0
  33. package/dist/esm/lib/detach/drivers/workerThread.d.ts +50 -0
  34. package/dist/esm/lib/detach/flush.d.ts +62 -0
  35. package/dist/esm/lib/detach/handle.d.ts +83 -0
  36. package/dist/esm/lib/detach/registry.d.ts +82 -0
  37. package/dist/esm/lib/detach/runChild.d.ts +41 -0
  38. package/dist/esm/lib/detach/spawn.d.ts +64 -0
  39. package/dist/esm/lib/detach/types.d.ts +200 -0
  40. package/dist/esm/lib/engine/errors/errorInfo.d.ts +46 -0
  41. package/dist/esm/lib/engine/errors/index.d.ts +2 -0
  42. package/dist/esm/lib/engine/graph/StageNode.d.ts +108 -0
  43. package/dist/esm/lib/engine/graph/index.d.ts +2 -0
  44. package/dist/esm/lib/engine/handlers/ChildrenExecutor.d.ts +32 -0
  45. package/dist/esm/lib/engine/handlers/ContinuationResolver.d.ts +95 -0
  46. package/dist/esm/lib/engine/handlers/DeciderHandler.d.ts +56 -0
  47. package/dist/esm/lib/engine/handlers/NodeResolver.d.ts +41 -0
  48. package/dist/esm/lib/engine/handlers/RuntimeStructureManager.d.ts +37 -0
  49. package/dist/esm/lib/engine/handlers/SelectorHandler.d.ts +27 -0
  50. package/dist/esm/lib/engine/handlers/StageRunner.d.ts +17 -0
  51. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +34 -0
  52. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +8 -1
  53. package/dist/esm/lib/engine/handlers/SubflowInputMapper.d.ts +40 -0
  54. package/dist/esm/lib/engine/handlers/index.d.ts +13 -0
  55. package/dist/esm/lib/engine/handlers/types.d.ts +32 -0
  56. package/dist/esm/lib/engine/index.d.ts +28 -0
  57. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +139 -0
  58. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +47 -0
  59. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +34 -0
  60. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +27 -0
  61. package/dist/esm/lib/engine/narrative/index.d.ts +15 -0
  62. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +196 -0
  63. package/dist/esm/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.d.ts +25 -0
  64. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +69 -0
  65. package/dist/esm/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.d.ts +24 -0
  66. package/dist/esm/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.d.ts +30 -0
  67. package/dist/esm/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.d.ts +25 -0
  68. package/dist/esm/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.d.ts +32 -0
  69. package/dist/esm/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.d.ts +25 -0
  70. package/dist/esm/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.d.ts +29 -0
  71. package/dist/esm/lib/engine/narrative/recorders/index.d.ts +9 -0
  72. package/dist/esm/lib/engine/narrative/types.d.ts +384 -0
  73. package/dist/esm/lib/engine/runtimeStageId.d.ts +103 -0
  74. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +376 -0
  75. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +1 -1
  76. package/dist/esm/lib/engine/traversal/index.d.ts +2 -0
  77. package/dist/esm/lib/engine/types.d.ts +417 -0
  78. package/dist/esm/lib/engine/walkSubflowSpec.d.ts +95 -0
  79. package/dist/esm/lib/memory/DiagnosticCollector.d.ts +33 -0
  80. package/dist/esm/lib/memory/EventLog.d.ts +27 -0
  81. package/dist/esm/lib/memory/SharedMemory.d.ts +31 -0
  82. package/dist/esm/lib/memory/StageContext.d.ts +368 -0
  83. package/dist/esm/lib/memory/StageContext.js +44 -2
  84. package/dist/esm/lib/memory/TransactionBuffer.d.ts +183 -0
  85. package/dist/esm/lib/memory/TransactionBuffer.js +35 -13
  86. package/dist/esm/lib/memory/backtrack.d.ts +252 -0
  87. package/dist/esm/lib/memory/backtrack.js +79 -8
  88. package/dist/esm/lib/memory/commitLogUtils.d.ts +41 -0
  89. package/dist/esm/lib/memory/index.d.ts +14 -0
  90. package/dist/esm/lib/memory/pathOps.d.ts +54 -0
  91. package/dist/esm/lib/memory/types.d.ts +230 -0
  92. package/dist/esm/lib/memory/types.js +1 -1
  93. package/dist/esm/lib/memory/utils.d.ts +124 -0
  94. package/dist/esm/lib/observer-queue/deferredDispatcher.d.ts +169 -0
  95. package/dist/esm/lib/observer-queue/flushDriver.d.ts +124 -0
  96. package/dist/esm/lib/observer-queue/index.d.ts +25 -0
  97. package/dist/esm/lib/observer-queue/mergedQueue.d.ts +85 -0
  98. package/dist/esm/lib/observer-queue/ring.d.ts +99 -0
  99. package/dist/esm/lib/pause/index.d.ts +2 -0
  100. package/dist/esm/lib/pause/types.d.ts +238 -0
  101. package/dist/esm/lib/pause/types.js +2 -2
  102. package/dist/esm/lib/reactive/allowlist.d.ts +30 -0
  103. package/dist/esm/lib/reactive/arrayTraps.d.ts +23 -0
  104. package/dist/esm/lib/reactive/createTypedScope.d.ts +24 -0
  105. package/dist/esm/lib/reactive/index.d.ts +14 -0
  106. package/dist/esm/lib/reactive/pathBuilder.d.ts +31 -0
  107. package/dist/esm/lib/reactive/types.d.ts +159 -0
  108. package/dist/esm/lib/reactive/types.js +1 -1
  109. package/dist/esm/lib/recorder/BoundaryStateStore.d.ts +115 -0
  110. package/dist/esm/lib/recorder/CombinedRecorder.d.ts +215 -0
  111. package/dist/esm/lib/recorder/CombinedRecorder.js +2 -2
  112. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +147 -0
  113. package/dist/esm/lib/recorder/CompositeRecorder.d.ts +95 -0
  114. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +133 -0
  115. package/dist/esm/lib/recorder/EmitRecorder.d.ts +135 -0
  116. package/dist/esm/lib/recorder/InOutRecorder.d.ts +176 -0
  117. package/dist/esm/lib/recorder/KeyedStore.d.ts +70 -0
  118. package/dist/esm/lib/recorder/QualityRecorder.d.ts +122 -0
  119. package/dist/esm/lib/recorder/RecorderOperation.d.ts +35 -0
  120. package/dist/esm/lib/recorder/SequenceStore.d.ts +120 -0
  121. package/dist/esm/lib/recorder/TopologyRecorder.d.ts +165 -0
  122. package/dist/esm/lib/recorder/TopologyRecorder.js +1 -1
  123. package/dist/esm/lib/recorder/index.d.ts +9 -0
  124. package/dist/esm/lib/recorder/invokeHook.d.ts +32 -0
  125. package/dist/esm/lib/recorder/qualityTrace.d.ts +54 -0
  126. package/dist/esm/lib/runner/ComposableRunner.d.ts +33 -0
  127. package/dist/esm/lib/runner/DeferredObserverTier.d.ts +204 -0
  128. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +162 -0
  129. package/dist/esm/lib/runner/ExecutionRuntime.js +16 -1
  130. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +660 -0
  131. package/dist/esm/lib/runner/FlowChartExecutor.js +35 -3
  132. package/dist/esm/lib/runner/RunContext.d.ts +42 -0
  133. package/dist/esm/lib/runner/RunnableChart.d.ts +57 -0
  134. package/dist/esm/lib/runner/checkpointSanitize.d.ts +44 -0
  135. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +70 -0
  136. package/dist/esm/lib/runner/index.d.ts +11 -0
  137. package/dist/esm/lib/runner/runId.d.ts +45 -0
  138. package/dist/esm/lib/runner/validateInput.d.ts +11 -0
  139. package/dist/esm/lib/schema/detect.d.ts +32 -0
  140. package/dist/esm/lib/schema/errors.d.ts +36 -0
  141. package/dist/esm/lib/schema/index.d.ts +14 -0
  142. package/dist/esm/lib/schema/validate.d.ts +33 -0
  143. package/dist/esm/lib/scope/ScopeFacade.d.ts +250 -0
  144. package/dist/esm/lib/scope/detectCircular.d.ts +47 -0
  145. package/dist/esm/lib/scope/index.d.ts +16 -0
  146. package/dist/esm/lib/scope/protection/createProtectedScope.d.ts +9 -0
  147. package/dist/esm/lib/scope/protection/index.d.ts +2 -0
  148. package/dist/esm/lib/scope/protection/readonlyInput.d.ts +26 -0
  149. package/dist/esm/lib/scope/protection/types.d.ts +13 -0
  150. package/dist/esm/lib/scope/providers/baseStateCompatible.d.ts +24 -0
  151. package/dist/esm/lib/scope/providers/guards.d.ts +14 -0
  152. package/dist/esm/lib/scope/providers/index.d.ts +6 -0
  153. package/dist/esm/lib/scope/providers/providers.d.ts +8 -0
  154. package/dist/esm/lib/scope/providers/registry.d.ts +11 -0
  155. package/dist/esm/lib/scope/providers/resolve.d.ts +8 -0
  156. package/dist/esm/lib/scope/providers/types.d.ts +40 -0
  157. package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +63 -0
  158. package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +125 -0
  159. package/dist/esm/lib/scope/recorders/index.d.ts +5 -0
  160. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +7 -0
  161. package/dist/esm/lib/scope/recorders/summarizeValue.js +3 -3
  162. package/dist/esm/lib/scope/state/installResolvers.d.ts +4 -0
  163. package/dist/esm/lib/scope/state/zod/defineScopeFromZod.d.ts +9 -0
  164. package/dist/esm/lib/scope/state/zod/index.d.ts +5 -0
  165. package/dist/esm/lib/scope/state/zod/resolver.d.ts +5 -0
  166. package/dist/esm/lib/scope/state/zod/schema/builder.d.ts +12 -0
  167. package/dist/esm/lib/scope/state/zod/scopeFactory.d.ts +9 -0
  168. package/dist/esm/lib/scope/state/zod/utils/validateHelper.d.ts +25 -0
  169. package/dist/esm/lib/scope/types.d.ts +142 -0
  170. package/dist/esm/lib/slice/elementProvenance.d.ts +74 -0
  171. package/dist/esm/lib/slice/elementProvenance.js +181 -0
  172. package/dist/esm/lib/slice/index.d.ts +16 -0
  173. package/dist/esm/lib/slice/index.js +16 -0
  174. package/dist/esm/lib/slice/keysReadSources.d.ts +51 -0
  175. package/dist/esm/lib/slice/keysReadSources.js +96 -0
  176. package/dist/esm/lib/slice/serialize.d.ts +40 -0
  177. package/dist/esm/lib/slice/serialize.js +97 -0
  178. package/dist/esm/lib/slice/sliceForKey.d.ts +47 -0
  179. package/dist/esm/lib/slice/sliceForKey.js +72 -0
  180. package/dist/esm/lib/slice/types.d.ts +240 -0
  181. package/dist/esm/lib/slice/types.js +20 -0
  182. package/dist/esm/recorders.d.ts +70 -0
  183. package/dist/esm/trace.d.ts +57 -0
  184. package/dist/esm/trace.js +2 -1
  185. package/dist/esm/zod.d.ts +18 -0
  186. package/dist/lib/builder/FlowChartBuilder.js +4 -3
  187. package/dist/lib/engine/handlers/SubflowExecutor.js +8 -1
  188. package/dist/lib/engine/traversal/FlowchartTraverser.js +1 -1
  189. package/dist/lib/memory/StageContext.js +44 -2
  190. package/dist/lib/memory/TransactionBuffer.js +35 -13
  191. package/dist/lib/memory/backtrack.js +79 -8
  192. package/dist/lib/memory/types.js +1 -1
  193. package/dist/lib/pause/types.js +2 -2
  194. package/dist/lib/reactive/types.js +1 -1
  195. package/dist/lib/recorder/CombinedRecorder.js +2 -2
  196. package/dist/lib/recorder/TopologyRecorder.js +1 -1
  197. package/dist/lib/runner/ExecutionRuntime.js +16 -1
  198. package/dist/lib/runner/FlowChartExecutor.js +35 -3
  199. package/dist/lib/scope/recorders/summarizeValue.js +3 -3
  200. package/dist/lib/slice/elementProvenance.js +186 -0
  201. package/dist/lib/slice/index.js +28 -0
  202. package/dist/lib/slice/keysReadSources.js +102 -0
  203. package/dist/lib/slice/serialize.js +102 -0
  204. package/dist/lib/slice/sliceForKey.js +77 -0
  205. package/dist/lib/slice/types.js +21 -0
  206. package/dist/trace.js +12 -2
  207. package/dist/types/lib/builder/FlowChartBuilder.d.ts +25 -2
  208. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -1
  209. package/dist/types/lib/memory/StageContext.d.ts +28 -1
  210. package/dist/types/lib/memory/TransactionBuffer.d.ts +10 -1
  211. package/dist/types/lib/memory/backtrack.d.ts +26 -0
  212. package/dist/types/lib/memory/types.d.ts +26 -0
  213. package/dist/types/lib/pause/types.d.ts +4 -3
  214. package/dist/types/lib/reactive/types.d.ts +1 -1
  215. package/dist/types/lib/recorder/CombinedRecorder.d.ts +1 -1
  216. package/dist/types/lib/recorder/TopologyRecorder.d.ts +1 -1
  217. package/dist/types/lib/runner/ExecutionRuntime.d.ts +15 -1
  218. package/dist/types/lib/runner/FlowChartExecutor.d.ts +34 -3
  219. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +2 -2
  220. package/dist/types/lib/slice/elementProvenance.d.ts +74 -0
  221. package/dist/types/lib/slice/index.d.ts +16 -0
  222. package/dist/types/lib/slice/keysReadSources.d.ts +51 -0
  223. package/dist/types/lib/slice/serialize.d.ts +40 -0
  224. package/dist/types/lib/slice/sliceForKey.d.ts +47 -0
  225. package/dist/types/lib/slice/types.d.ts +240 -0
  226. package/dist/types/trace.d.ts +3 -0
  227. 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=