footprintjs 10.4.0 → 10.5.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 (80) hide show
  1. package/README.md +63 -25
  2. package/dist/esm/lib/capture/historyData.d.ts +6 -2
  3. package/dist/esm/lib/capture/historyData.js +18 -1
  4. package/dist/esm/lib/capture/historyNote.d.ts +2 -2
  5. package/dist/esm/lib/capture/historyNote.js +11 -6
  6. package/dist/esm/lib/capture/historyTypes.d.ts +1 -1
  7. package/dist/esm/lib/capture/historyTypes.js +1 -1
  8. package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
  9. package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
  10. package/dist/esm/lib/capture/readSources.d.ts +7 -1
  11. package/dist/esm/lib/capture/readSources.js +32 -11
  12. package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
  13. package/dist/esm/lib/capture/sinkSettlement.js +10 -0
  14. package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
  15. package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
  16. package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
  17. package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
  18. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +3 -0
  19. package/dist/esm/lib/capture/storedReadSourceCounts.js +78 -0
  20. package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
  21. package/dist/esm/lib/capture/storedReadSources.js +104 -0
  22. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +11 -2
  23. package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
  24. package/dist/esm/lib/engine/types.d.ts +2 -1
  25. package/dist/esm/lib/engine/types.js +1 -1
  26. package/dist/esm/lib/memory/StageContext.d.ts +1 -0
  27. package/dist/esm/lib/memory/StageContext.js +14 -2
  28. package/dist/esm/lib/memory/frameTypes.d.ts +3 -0
  29. package/dist/esm/lib/memory/frameTypes.js +1 -1
  30. package/dist/esm/lib/memory/logAddress.d.ts +3 -0
  31. package/dist/esm/lib/memory/logAddress.js +7 -0
  32. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -0
  33. package/dist/esm/lib/runner/ExecutionRuntime.js +65 -8
  34. package/dist/esm/lib/runner/FlowChartExecutor.js +4 -2
  35. package/dist/esm/lib/runner/captureHistory.js +16 -10
  36. package/dist/esm/lib/runner/readStoredCapture.d.ts +4 -2
  37. package/dist/esm/lib/runner/readStoredCapture.js +3 -3
  38. package/dist/esm/lib/runner/recordSink.js +2 -10
  39. package/dist/esm/lib/runner/storedCaptureAdmission.js +10 -8
  40. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  41. package/dist/lib/capture/historyData.js +21 -2
  42. package/dist/lib/capture/historyNote.js +9 -4
  43. package/dist/lib/capture/historyTypes.js +1 -1
  44. package/dist/lib/capture/nativeSourceAddress.js +19 -0
  45. package/dist/lib/capture/readSources.js +35 -12
  46. package/dist/lib/capture/sinkSettlement.js +14 -0
  47. package/dist/lib/capture/sourceReadCounts.js +31 -0
  48. package/dist/lib/capture/sourceReferenceBudget.js +25 -0
  49. package/dist/lib/capture/storedReadSourceCounts.js +82 -0
  50. package/dist/lib/capture/storedReadSources.js +108 -0
  51. package/dist/lib/engine/handlers/SubflowExecutor.js +11 -2
  52. package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
  53. package/dist/lib/engine/types.js +1 -1
  54. package/dist/lib/memory/StageContext.js +14 -2
  55. package/dist/lib/memory/frameTypes.js +1 -1
  56. package/dist/lib/memory/logAddress.js +11 -0
  57. package/dist/lib/runner/ExecutionRuntime.js +65 -8
  58. package/dist/lib/runner/FlowChartExecutor.js +4 -2
  59. package/dist/lib/runner/captureHistory.js +15 -9
  60. package/dist/lib/runner/readStoredCapture.js +2 -2
  61. package/dist/lib/runner/recordSink.js +6 -14
  62. package/dist/lib/runner/storedCaptureAdmission.js +9 -7
  63. package/dist/lib/scope/ScopeFacade.js +2 -2
  64. package/dist/types/lib/capture/historyData.d.ts +6 -2
  65. package/dist/types/lib/capture/historyNote.d.ts +2 -2
  66. package/dist/types/lib/capture/historyTypes.d.ts +1 -1
  67. package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
  68. package/dist/types/lib/capture/readSources.d.ts +7 -1
  69. package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
  70. package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
  71. package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
  72. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +3 -0
  73. package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
  74. package/dist/types/lib/engine/types.d.ts +2 -1
  75. package/dist/types/lib/memory/StageContext.d.ts +1 -0
  76. package/dist/types/lib/memory/frameTypes.d.ts +3 -0
  77. package/dist/types/lib/memory/logAddress.d.ts +3 -0
  78. package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -0
  79. package/dist/types/lib/runner/readStoredCapture.d.ts +4 -2
  80. package/package.json +1 -1
package/README.md CHANGED
@@ -1,14 +1,36 @@
1
- # FootPrint
2
-
3
- **Connected runtime logs for people and AI agents.**
4
-
5
- > Don't make the agent guess connections your program already knew.
1
+ <div align="center">
2
+ <h1>FootPrint</h1>
3
+ <p><strong>Connected runtime logs for people and AI agents.</strong></p>
4
+ <p><em>Don't make the agent guess connections your program already knew.</em></p>
5
+
6
+ <p>
7
+ <a href="https://github.com/footprintjs/footPrint/actions/workflows/ci.yml"><img src="https://github.com/footprintjs/footPrint/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI status"></a>
8
+ <a href="https://www.npmjs.com/package/footprintjs"><img src="https://img.shields.io/npm/v/footprintjs.svg" alt="npm version"></a>
9
+ <a href="https://www.npmjs.com/package/footprintjs"><img src="https://img.shields.io/npm/dm/footprintjs.svg?label=downloads" alt="Monthly npm downloads"></a>
10
+ <a href="https://github.com/footprintjs/footPrint/blob/main/CONTRIBUTING.md#making-changes"><!-- coverage-badge --><img src="https://img.shields.io/badge/coverage-98%25-brightgreen.svg" alt="coverage: 98%"><!-- /coverage-badge --></a>
11
+ <a href="https://github.com/footprintjs/footPrint/blob/main/package.json"><img src="https://img.shields.io/node/v/footprintjs?label=Node.js" alt="Supported Node.js versions"></a>
12
+ <a href="https://github.com/footprintjs/footPrint/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/footprintjs?color=blue" alt="MIT license"></a>
13
+ </p>
14
+
15
+ <p>
16
+ <a href="https://footprintjs.github.io/footPrint/"><strong>Documentation</strong></a> &middot;
17
+ <a href="https://footprintjs.github.io/footprint-playground/"><strong>Playground</strong></a> &middot;
18
+ <a href="https://github.com/footprintjs/footPrint/tree/main/ai-instructions"><strong>AI instructions</strong></a> &middot;
19
+ <a href="https://github.com/footprintjs/footPrint/blob/main/docs/provenance-governance-and-limits.md"><strong>Provenance and limits</strong></a>
20
+ </p>
21
+ </div>
6
22
 
7
23
  FootPrint is the **flowchart pattern for inspectable workflows**. Write your logic as named stages, tracked state, and explicit decisions. As the workflow executes, FootPrint captures connected evidence of its data activity, execution path, and evaluated decisions.
8
24
 
9
25
  **The evidence is captured during execution—not reconstructed by an LLM afterward.** People and AI agents can investigate the same recorded run. No model is required to generate the record.
10
26
 
11
- [Documentation](https://footprintjs.github.io/footPrint/) · [Playground](https://footprintjs.github.io/footprint-playground/) · [AI instructions](https://github.com/footprintjs/footPrint/tree/main/ai-instructions) · [Provenance, governance and limits](docs/provenance-governance-and-limits.md)
27
+ <p align="center">
28
+ <a href="https://footprintjs.github.io/footprint-playground/">
29
+ <img src="https://raw.githubusercontent.com/footprintjs/footPrint/main/assets/hero.gif" alt="FootPrint demo: run a sample loan workflow and inspect its stages, state and recorded dependencies" width="800">
30
+ </a>
31
+ <br>
32
+ <sub>A recorded workflow in action. Open the playground to try it.</sub>
33
+ </p>
12
34
 
13
35
  ## AI can read your logs. Can it follow the decision?
14
36
 
@@ -130,29 +152,45 @@ The next question might be: **“Did `LoadImage` load a thumbnail instead of the
130
152
 
131
153
  ### An agent building your application
132
154
 
133
- Give the coding agent a workflow it can investigate:
155
+ FootPrint works in ordinary applications that have **no LLM at runtime**. Your coding agent can use the recorded run while it builds and debugs the application.
156
+
157
+ The development loop is straightforward:
158
+
159
+ 1. **Build** the workflow as named stages with tracked state and explicit decisions.
160
+ 2. **Run** the application with the required recorders enabled.
161
+ 3. **Inspect** a wrong outcome: follow its recorded producer, relevant reads, and governing decisions.
162
+ 4. **Repair and verify** with a regression test and a fresh run.
163
+
164
+ Send the relevant trace slice to the coding agent. A focused slice can reduce the log context you need to provide; actual token use and development speed depend on the model, tooling, and workflow. The record gives the agent evidence to work from, while missing evidence stays unknown.
165
+
166
+ Give your coding agent this instruction:
134
167
 
135
- > Build this workflow with FootPrint. Track relevant state, use explicit decision helpers, and attach the required recorders before execution. When an outcome is wrong, inspect its recorded producer, inputs, and governing decisions. Separate evidence from hypotheses, then verify the repair with regression tests.
168
+ > Build this workflow with FootPrint. Track relevant state, use explicit decision helpers, and attach the required recorders before execution. When an outcome is wrong, inspect its recorded producer, inputs, and governing decisions. Separate established evidence from hypotheses, keep missing evidence unknown, and verify each repair with a regression test and a new run.
136
169
 
137
- The application does **not** need an LLM at runtime. Start with the [AI instruction files](https://github.com/footprintjs/footPrint/tree/main/ai-instructions) and [AGENTS.md](https://github.com/footprintjs/footPrint/blob/main/AGENTS.md).
170
+ Start with the [AI instruction files](https://github.com/footprintjs/footPrint/tree/main/ai-instructions) and [AGENTS.md](https://github.com/footprintjs/footPrint/blob/main/AGENTS.md).
138
171
 
139
172
  ### An agent inside your application
140
173
 
141
174
  A running agent can consume workflow results and their evidence to investigate or explain an outcome. [AgentFootprint](https://github.com/footprintjs/agentfootprint) applies this approach to agent workflows, including context and tool activity. In both uses, the model reads evidence; it does not create the execution history.
142
175
 
143
- ## Workflows and libraries—not only backends
176
+ ## An ecosystem of reusable libraries
144
177
 
145
- Use the pattern at meaningful workflow boundaries, not necessarily around every helper function.
178
+ FootPrint can be the execution foundation for a reusable library, as well as an application. Use it at meaningful workflow boundaries, not necessarily around every helper function. A library can expose a focused API while retaining the recorded steps and decisions behind its results.
146
179
 
147
- | Project | Focus |
180
+ | Library | What it adds |
148
181
  | --- | --- |
149
- | [AgentFootprint](https://github.com/footprintjs/agentfootprint) | Agent execution, context, and tool-call evidence. |
182
+ | [AgentFootprint](https://github.com/footprintjs/agentfootprint) | An agent runtime with context, tools, and execution evidence. |
183
+ | [StoryDeck](https://github.com/footprintjs/storydeck) | One structured content model with article, scroll, and presentation views; optional FootPrint integration. |
184
+ | [StoryReel](https://github.com/footprintjs/storyreel) | A filmmaking pipeline with FootPrint stages and a making-of record. |
185
+ | [Blueprint](https://www.npmjs.com/package/footprint-blueprint) | A modular platform framework with shared execution evidence and focused import paths. |
186
+ | [Smallbusiness](https://www.npmjs.com/package/smallbusiness-footprint) | Configurable commerce workflows built on Blueprint for different shop types. |
187
+ | [Datapipeline](https://www.npmjs.com/package/footprintjs-datapipeline) | Collection and derivation flows with traceable execution evidence. |
150
188
  | [HCI Footprint](https://github.com/footprintjs/hcifootprint) | Explicit application actions and journeys for human–agent interaction. |
151
189
  | [VizFootprint](https://github.com/footprintjs/vizfootprint) | Analysis workflows and recorded exploration. |
152
- | [StoryDeck](https://github.com/footprintjs/storydeck) | One content model with article, scroll, and presentation views. |
153
- | [StoryReel](https://github.com/footprintjs/storyreel) | A film-making pipeline with FootPrint stages and a making-of record. |
154
190
 
155
- These projects have different dependencies and maturity; they are not identical wrappers. StoryReel's [pipeline](https://github.com/footprintjs/storyreel/blob/main/src/pipeline.mjs) is a concrete example beyond agent applications.
191
+ These libraries have different dependencies and maturity. They do not all require AgentFootprint: StoryReel and Datapipeline use FootPrint directly, Smallbusiness builds on Blueprint, and StoryDeck makes its FootPrint integration optional. StoryReel's [pipeline](https://github.com/footprintjs/storyreel/blob/main/src/pipeline.mjs) is a concrete example beyond agent applications.
192
+
193
+ When those workflows capture the required evidence, a person or coding agent can follow a result back through the library's recorded execution instead of working from disconnected messages. Evidence that was not captured remains unknown.
156
194
 
157
195
  ## Two packages, separate responsibilities
158
196
 
@@ -171,6 +209,15 @@ Use `addRetryLoop` when an outside operation may happen even though its response
171
209
 
172
210
  See the [builder rule and in-memory example](src/lib/builder/README.md#explicit-retries-that-reconcile-an-outside-operation) and the [runnable keyed-retry example](examples/runtime-features/retry/06-explicit-reconciliation.ts). Physical call outcomes remain unchanged; separate `retryLoop` metadata records the workflow pass and decision.
173
211
 
212
+ ## Attempt metrics and evidence references
213
+
214
+ `attempts()` from `footprintjs/recorders` collects payload-free attempt facts during traversal. Use `byTarget()`,
215
+ `byRun()`, bounded `slowest()` exemplars and `series()` to follow native calls and explicit retry decisions; optional
216
+ `AttemptStore` adapters support cross-run queries. Row/exemplar/I/O limits disclose omitted or pending evidence.
217
+ `toOTel()` returns histogram/sum JSON without sending it anywhere. Durations are summed work time; orchestration
218
+ completion is not provider confirmation. See [the metric guide](docs/guides/attempt-metrics.md) and
219
+ [the stored-trace navigation example](examples/runtime-features/retry/07-attempt-metrics-and-trace.ts).
220
+
174
221
  ## What the record cannot prove
175
222
 
176
223
  - **Correctness or real-world cause.** Recorded program dependencies do not prove the requirement is right, the result is correct, or a model's interpretation is sound.
@@ -184,12 +231,3 @@ For provenance, European governance terminology, disclosure controls, OpenTeleme
184
231
  [API and guides](https://footprintjs.github.io/footPrint/) · [Examples](https://footprintjs.github.io/footprint-playground/) · [Contributing](https://github.com/footprintjs/footPrint/blob/main/CONTRIBUTING.md) · [MIT license](https://github.com/footprintjs/footPrint/blob/main/LICENSE)
185
232
 
186
233
  **Capture the connections during execution. Let people and agents investigate the evidence.**
187
-
188
- ### Attempt metrics and evidence references
189
-
190
- `attempts()` from `footprintjs/recorders` collects payload-free attempt facts during traversal. Use `byTarget()`,
191
- `byRun()`, bounded `slowest()` exemplars and `series()` to follow native calls and explicit retry decisions; optional
192
- `AttemptStore` adapters support cross-run queries. Row/exemplar/I/O limits disclose omitted or pending evidence.
193
- `toOTel()` returns histogram/sum JSON without sending it anywhere. Durations are summed work time; orchestration
194
- completion is not provider confirmation. See [the metric guide](docs/guides/attempt-metrics.md) and
195
- [the stored-trace navigation example](examples/runtime-features/retry/07-attempt-metrics-and-trace.ts).
@@ -1,9 +1,13 @@
1
1
  /** @internal Fixed diagnostic only; never carries source values, paths or adapter errors. */
2
2
  export declare class HistoryDataError extends Error {
3
- readonly code: 'too-large' | 'invalid-data';
4
- constructor(code: 'too-large' | 'invalid-data');
3
+ readonly code: 'too-large' | 'invalid-data' | 'source-validation-limit';
4
+ constructor(code: 'too-large' | 'invalid-data' | 'source-validation-limit');
5
5
  }
6
+ /** Fixed boundary reasons; no untrusted error text leaves the engine. */
7
+ export declare function historyFailureReason(error: unknown, boundary: 'evidence' | 'history'): string;
6
8
  /** @internal Copy bounded inert JSON data without invoking accessors, toJSON or application coercion. */
7
9
  export declare function copyHistoryData(value: unknown, maxBytes: number, onOmitted?: (path: readonly string[]) => void): unknown;
8
10
  /** @internal Integrity of this JSON representation, not a value fingerprint or an authenticity signature. */
9
11
  export declare function historyDigest(value: unknown): Promise<string>;
12
+ /** One field order for both sides of the evidence digest; optional source/absence fields cannot drift. */
13
+ export declare function historyEvidence(value: Record<string, unknown>): Record<string, unknown>;
@@ -6,6 +6,16 @@ export class HistoryDataError extends Error {
6
6
  this.code = code;
7
7
  }
8
8
  }
9
+ /** Fixed boundary reasons; no untrusted error text leaves the engine. */
10
+ export function historyFailureReason(error, boundary) {
11
+ if (error instanceof HistoryDataError) {
12
+ if (error.code === 'source-validation-limit')
13
+ return 'source-validation-limit';
14
+ if (error.code === 'too-large')
15
+ return `${boundary}-too-large`;
16
+ }
17
+ return `${boundary}-refused`;
18
+ }
9
19
  /** @internal Copy bounded inert JSON data without invoking accessors, toJSON or application coercion. */
10
20
  export function copyHistoryData(value, maxBytes, onOmitted) {
11
21
  let bytes = 0;
@@ -76,4 +86,11 @@ export async function historyDigest(value) {
76
86
  const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes);
77
87
  return Array.from(new Uint8Array(digest), (n) => n.toString(16).padStart(2, '0')).join('');
78
88
  }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeURhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvaGlzdG9yeURhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkZBQTZGO0FBQzdGLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxLQUFLO0lBQ3BCO0lBQXJCLFlBQXFCLElBQWtDO1FBQ3JELEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUQ3RSxTQUFJLEdBQUosSUFBSSxDQUE4QjtJQUV2RCxDQUFDO0NBQ0Y7QUFFRCx5R0FBeUc7QUFDekcsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsS0FBYyxFQUNkLFFBQWdCLEVBQ2hCLFNBQTZDO0lBRTdDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNsQyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQVksRUFBUSxFQUFFO1FBQ3BDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsS0FBSztZQUFFLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RSxLQUFLLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDckMsSUFBSSxLQUFLLEdBQUcsUUFBUTtZQUFFLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRSxDQUFDLENBQUM7SUFDRixNQUFNLElBQUksR0FBRyxDQUFDLElBQWEsRUFBRSxLQUFhLEVBQUUsSUFBYyxFQUFXLEVBQUU7UUFDckUsSUFBSSxFQUFFLEtBQUssR0FBRyxP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Q0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAaW50ZXJuYWwgRml4ZWQgZGlhZ25vc3RpYyBvbmx5OyBuZXZlciBjYXJyaWVzIHNvdXJjZSB2YWx1ZXMsIHBhdGhzIG9yIGFkYXB0ZXIgZXJyb3JzLiAqL1xuZXhwb3J0IGNsYXNzIEhpc3RvcnlEYXRhRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvZGU6ICd0b28tbGFyZ2UnIHwgJ2ludmFsaWQtZGF0YScpIHtcbiAgICBzdXBlcihjb2RlID09PSAndG9vLWxhcmdlJyA/ICdDYXB0dXJlIGhpc3RvcnkgZGF0YSB0b28gbGFyZ2UnIDogJ0NhcHR1cmUgaGlzdG9yeSBkYXRhIHJlZnVzZWQnKTtcbiAgfVxufVxuXG4vKiogQGludGVybmFsIENvcHkgYm91bmRlZCBpbmVydCBKU09OIGRhdGEgd2l0aG91dCBpbnZva2luZyBhY2Nlc3NvcnMsIHRvSlNPTiBvciBhcHBsaWNhdGlvbiBjb2VyY2lvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5SGlzdG9yeURhdGEoXG4gIHZhbHVlOiB1bmtub3duLFxuICBtYXhCeXRlczogbnVtYmVyLFxuICBvbk9taXR0ZWQ/OiAocGF0aDogcmVhZG9ubHkgc3RyaW5nW10pID0+IHZvaWQsXG4pOiB1bmtub3duIHtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgbGV0IG5vZGVzID0gMDtcbiAgY29uc3QgYW5jZXN0b3JzID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgY2hhcmdlID0gKHRleHQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA+IG1heEJ5dGVzIC0gYnl0ZXMpIHRocm93IG5ldyBIaXN0b3J5RGF0YUVycm9yKCd0b28tbGFyZ2UnKTtcbiAgICBieXRlcyArPSBlbmNvZGVyLmVuY29kZSh0ZXh0KS5sZW5ndGg7XG4gICAgaWYgKGJ5dGVzID4gbWF4Qnl0ZXMpIHRocm93IG5ldyBIaXN0b3J5RGF0YUVycm9yKCd0b28tbGFyZ2UnKTtcbiAgfTtcbiAgY29uc3QgY29weSA9IChpdGVtOiB1bmtub3duLCBkZXB0aDogbnVtYmVyLCBwYXRoOiBzdHJpbmdbXSk6IHVua25vd24gPT4ge1xuICAgIGlmICgrK25vZGVzID4gMTAwXzAwMCB8fCBkZXB0aCA+IDI1NikgdGhyb3cgbmV3IEhpc3RvcnlEYXRhRXJyb3IoJ2ludmFsaWQtZGF0YScpO1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgaXRlbSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyAmJiAoIU51bWJlci5pc0Zpbml0ZShpdGVtKSB8fCBPYmplY3QuaXMoaXRlbSwgLTApKSlcbiAgICAgICAgdGhyb3cgbmV3IEhpc3RvcnlEYXRhRXJyb3IoJ2ludmFsaWQtZGF0YScpO1xuICAgICAgY2hhcmdlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKTtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09ICdvYmplY3QnIHx8IGFuY2VzdG9ycy5oYXMoaXRlbSkpIHRocm93IG5ldyBIaXN0b3J5RGF0YUVycm9yKCdpbnZhbGlkLWRhdGEnKTtcbiAgICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkoaXRlbSk7XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihpdGVtKSAhPT0gKGFycmF5ID8gQXJyYXkucHJvdG90eXBlIDogT2JqZWN0LnByb3RvdHlwZSkpXG4gICAgICB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignaW52YWxpZC1kYXRhJyk7XG4gICAgYW5jZXN0b3JzLmFkZChpdGVtKTtcbiAgICBjaGFyZ2UoYXJyYXkgPyAnW10nIDogJ3t9Jyk7XG4gICAgY29uc3Qgb3V0cHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd25bXSA9IGFycmF5ID8gW10gOiB7fTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSk7XG4gICAgaWYgKGtleXMubGVuZ3RoID4gMTAwXzAwMCAtIG5vZGVzKSB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignaW52YWxpZC1kYXRhJyk7XG4gICAgLy8gQXJyYXlzIG11c3QgYmUgZGVuc2UgSlNPTiBhcnJheXMgd2l0aG91dCBleHRyYSBwcm9wZXJ0aWVzLiBObyBzaWxlbnQgZHJvcHBpbmcgb2YgaG9sZXMgb3IgZXhwYW5kb3MuXG4gICAgaWYgKGFycmF5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXRlbSwgJ2xlbmd0aCcpPy52YWx1ZSAhPT0ga2V5cy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignaW52YWxpZC1kYXRhJyk7XG4gICAgbGV0IHdyaXR0ZW4gPSAwO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdGVtLCBrZXkpO1xuICAgICAgaWYgKCFwcm9wZXJ0eSB8fCAhT2JqZWN0Lmhhc093bihwcm9wZXJ0eSwgJ3ZhbHVlJykpIHRocm93IG5ldyBIaXN0b3J5RGF0YUVycm9yKCdpbnZhbGlkLWRhdGEnKTtcbiAgICAgIGlmIChhcnJheSAmJiBrZXkgIT09IFN0cmluZyh3cml0dGVuKSkgdGhyb3cgbmV3IEhpc3RvcnlEYXRhRXJyb3IoJ2ludmFsaWQtZGF0YScpO1xuICAgICAgLy8gT3JkaW5hcnkgSlNPTiBvYmplY3Qgb21pc3Npb24uIEFycmF5cy9yb290IHVuZGVmaW5lZCByZW1haW4gcmVmdXNlZDsgbm8gc25hcHNob3QtZmllbGQgYWxsb3ctbGlzdC5cbiAgICAgIGlmIChwcm9wZXJ0eS52YWx1ZSA9PT0gdW5kZWZpbmVkICYmICFhcnJheSkge1xuICAgICAgICBvbk9taXR0ZWQ/LihbLi4ucGF0aCwga2V5XSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHdyaXR0ZW4rKykgY2hhcmdlKCcsJyk7XG4gICAgICBpZiAoIWFycmF5KSBjaGFyZ2UoSlNPTi5zdHJpbmdpZnkoa2V5KSArICc6Jyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0cHV0LCBrZXksIHtcbiAgICAgICAgdmFsdWU6IGNvcHkocHJvcGVydHkudmFsdWUsIGRlcHRoICsgMSwgWy4uLnBhdGgsIGtleV0pLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGFuY2VzdG9ycy5kZWxldGUoaXRlbSk7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUob3V0cHV0KTtcbiAgfTtcbiAgcmV0dXJuIGNvcHkodmFsdWUsIDAsIFtdKTtcbn1cblxuLyoqIEBpbnRlcm5hbCBJbnRlZ3JpdHkgb2YgdGhpcyBKU09OIHJlcHJlc2VudGF0aW9uLCBub3QgYSB2YWx1ZSBmaW5nZXJwcmludCBvciBhbiBhdXRoZW50aWNpdHkgc2lnbmF0dXJlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhpc3RvcnlEaWdlc3QodmFsdWU6IHVua25vd24pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICBjb25zdCBkaWdlc3QgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgYnl0ZXMpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShkaWdlc3QpLCAobikgPT4gbi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG59XG4iXX0=
89
+ /** One field order for both sides of the evidence digest; optional source/absence fields cannot drift. */
90
+ export function historyEvidence(value) {
91
+ const fields = ['capture', 'executionTree', 'recorders', 'readSources', 'absent'];
92
+ if (Object.keys(value).some((key) => key !== 'target' && !fields.includes(key)))
93
+ throw new HistoryDataError('invalid-data');
94
+ return Object.fromEntries(fields.filter((key) => Object.hasOwn(value, key)).map((key) => [key, value[key]]));
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeURhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvaGlzdG9yeURhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkZBQTZGO0FBQzdGLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxLQUFLO0lBQ3BCO0lBQXJCLFlBQXFCLElBQThEO1FBQ2pGLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUQ3RSxTQUFJLEdBQUosSUFBSSxDQUEwRDtJQUVuRixDQUFDO0NBQ0Y7QUFFRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEtBQWMsRUFBRSxRQUFnQztJQUNuRixJQUFJLEtBQUssWUFBWSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyx5QkFBeUI7WUFBRSxPQUFPLHlCQUF5QixDQUFDO1FBQy9FLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXO1lBQUUsT0FBTyxHQUFHLFFBQVEsWUFBWSxDQUFDO0lBQ2pFLENBQUM7SUFDRCxPQUFPLEdBQUcsUUFBUSxVQUFVLENBQUM7QUFDL0IsQ0FBQztBQUVELHlHQUF5RztBQUN6RyxNQUFNLFVBQVUsZUFBZSxDQUM3QixLQUFjLEVBQ2QsUUFBZ0IsRUFDaEIsU0FBNkM7SUFFN0MsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBWSxFQUFRLEVBQUU7UUFDcEMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsR0FBRyxLQUFLO1lB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b25seTsgbmV2ZXIgY2FycmllcyBzb3VyY2UgdmFsdWVzLCBwYXRocyBvciBhZGFwdGVyIGVycm9ycy4gKi9cbmV4cG9ydCBjbGFzcyBIaXN0b3J5RGF0YUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjb2RlOiAndG9vLWxhcmdlJyB8ICdpbnZhbGlkLWRhdGEnIHwgJ3NvdXJjZS12YWxpZGF0aW9uLWxpbWl0Jykge1xuICAgIHN1cGVyKGNvZGUgPT09ICd0b28tbGFyZ2UnID8gJ0NhcHR1cmUgaGlzdG9yeSBkYXRhIHRvbyBsYXJnZScgOiAnQ2FwdHVyZSBoaXN0b3J5IGRhdGEgcmVmdXNlZCcpO1xuICB9XG59XG5cbi8qKiBGaXhlZCBib3VuZGFyeSByZWFzb25zOyBubyB1bnRydXN0ZWQgZXJyb3IgdGV4dCBsZWF2ZXMgdGhlIGVuZ2luZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaXN0b3J5RmFpbHVyZVJlYXNvbihlcnJvcjogdW5rbm93biwgYm91bmRhcnk6ICdldmlkZW5jZScgfCAnaGlzdG9yeScpOiBzdHJpbmcge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIaXN0b3J5RGF0YUVycm9yKSB7XG4gICAgaWYgKGVycm9yLmNvZGUgPT09ICdzb3VyY2UtdmFsaWRhdGlvbi1saW1pdCcpIHJldHVybiAnc291cmNlLXZhbGlkYXRpb24tbGltaXQnO1xuICAgIGlmIChlcnJvci5jb2RlID09PSAndG9vLWxhcmdlJykgcmV0dXJuIGAke2JvdW5kYXJ5fS10b28tbGFyZ2VgO1xuICB9XG4gIHJldHVybiBgJHtib3VuZGFyeX0tcmVmdXNlZGA7XG59XG5cbi8qKiBAaW50ZXJuYWwgQ29weSBib3VuZGVkIGluZXJ0IEpTT04gZGF0YSB3aXRob3V0IGludm9raW5nIGFjY2Vzc29ycywgdG9KU09OIG9yIGFwcGxpY2F0aW9uIGNvZXJjaW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlIaXN0b3J5RGF0YShcbiAgdmFsdWU6IHVua25vd24sXG4gIG1heEJ5dGVzOiBudW1iZXIsXG4gIG9uT21pdHRlZD86IChwYXRoOiByZWFkb25seSBzdHJpbmdbXSkgPT4gdm9pZCxcbik6IHVua25vd24ge1xuICBsZXQgYnl0ZXMgPSAwO1xuICBsZXQgbm9kZXMgPSAwO1xuICBjb25zdCBhbmNlc3RvcnMgPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICBjb25zdCBjaGFyZ2UgPSAodGV4dDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKHRleHQubGVuZ3RoID4gbWF4Qnl0ZXMgLSBieXRlcykgdGhyb3cgbmV3IEhpc3RvcnlEYXRhRXJyb3IoJ3Rvby1sYXJnZScpO1xuICAgIGJ5dGVzICs9IGVuY29kZXIuZW5jb2RlKHRleHQpLmxlbmd0aDtcbiAgICBpZiAoYnl0ZXMgPiBtYXhCeXRlcykgdGhyb3cgbmV3IEhpc3RvcnlEYXRhRXJyb3IoJ3Rvby1sYXJnZScpO1xuICB9O1xuICBjb25zdCBjb3B5ID0gKGl0ZW06IHVua25vd24sIGRlcHRoOiBudW1iZXIsIHBhdGg6IHN0cmluZ1tdKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCsrbm9kZXMgPiAxMDBfMDAwIHx8IGRlcHRoID4gMjU2KSB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignaW52YWxpZC1kYXRhJyk7XG4gICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpdGVtID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGl0ZW0gPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdudW1iZXInICYmICghTnVtYmVyLmlzRmluaXRlKGl0ZW0pIHx8IE9iamVjdC5pcyhpdGVtLCAtMCkpKVxuICAgICAgICB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignaW52YWxpZC1kYXRhJyk7XG4gICAgICBjaGFyZ2UoSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICAgIGlmICghaXRlbSB8fCB0eXBlb2YgaXRlbSAhPT0gJ29iamVjdCcgfHwgYW5jZXN0b3JzLmhhcyhpdGVtKSkgdGhyb3cgbmV3IEhpc3RvcnlEYXRhRXJyb3IoJ2ludmFsaWQtZGF0YScpO1xuICAgIGNvbnN0IGFycmF5ID0gQXJyYXkuaXNBcnJheShpdGVtKTtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKGl0ZW0pICE9PSAoYXJyYXkgPyBBcnJheS5wcm90b3R5cGUgOiBPYmplY3QucHJvdG90eXBlKSlcbiAgICAgIHRocm93IG5ldyBIaXN0b3J5RGF0YUVycm9yKCdpbnZhbGlkLWRhdGEnKTtcbiAgICBhbmNlc3RvcnMuYWRkKGl0ZW0pO1xuICAgIGNoYXJnZShhcnJheSA/ICdbXScgOiAne30nKTtcbiAgICBjb25zdCBvdXRwdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bltdID0gYXJyYXkgPyBbXSA6IHt9O1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPiAxMDBfMDAwIC0gbm9kZXMpIHRocm93IG5ldyBIaXN0b3J5RGF0YUVycm9yKCdpbnZhbGlkLWRhdGEnKTtcbiAgICAvLyBBcnJheXMgbXVzdCBiZSBkZW5zZSBKU09OIGFycmF5cyB3aXRob3V0IGV4dHJhIHByb3BlcnRpZXMuIE5vIHNpbGVudCBkcm9wcGluZyBvZiBob2xlcyBvciBleHBhbmRvcy5cbiAgICBpZiAoYXJyYXkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdGVtLCAnbGVuZ3RoJyk/LnZhbHVlICE9PSBrZXlzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBIaXN0b3J5RGF0YUVycm9yKCdpbnZhbGlkLWRhdGEnKTtcbiAgICBsZXQgd3JpdHRlbiA9IDA7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0ZW0sIGtleSk7XG4gICAgICBpZiAoIXByb3BlcnR5IHx8ICFPYmplY3QuaGFzT3duKHByb3BlcnR5LCAndmFsdWUnKSkgdGhyb3cgbmV3IEhpc3RvcnlEYXRhRXJyb3IoJ2ludmFsaWQtZGF0YScpO1xuICAgICAgaWYgKGFycmF5ICYmIGtleSAhPT0gU3RyaW5nKHdyaXR0ZW4pKSB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignaW52YWxpZC1kYXRhJyk7XG4gICAgICAvLyBPcmRpbmFyeSBKU09OIG9iamVjdCBvbWlzc2lvbi4gQXJyYXlzL3Jvb3QgdW5kZWZpbmVkIHJlbWFpbiByZWZ1c2VkOyBubyBzbmFwc2hvdC1maWVsZCBhbGxvdy1saXN0LlxuICAgICAgaWYgKHByb3BlcnR5LnZhbHVlID09PSB1bmRlZmluZWQgJiYgIWFycmF5KSB7XG4gICAgICAgIG9uT21pdHRlZD8uKFsuLi5wYXRoLCBrZXldKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAod3JpdHRlbisrKSBjaGFyZ2UoJywnKTtcbiAgICAgIGlmICghYXJyYXkpIGNoYXJnZShKU09OLnN0cmluZ2lmeShrZXkpICsgJzonKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvdXRwdXQsIGtleSwge1xuICAgICAgICB2YWx1ZTogY29weShwcm9wZXJ0eS52YWx1ZSwgZGVwdGggKyAxLCBbLi4ucGF0aCwga2V5XSksXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgYW5jZXN0b3JzLmRlbGV0ZShpdGVtKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShvdXRwdXQpO1xuICB9O1xuICByZXR1cm4gY29weSh2YWx1ZSwgMCwgW10pO1xufVxuXG4vKiogQGludGVybmFsIEludGVncml0eSBvZiB0aGlzIEpTT04gcmVwcmVzZW50YXRpb24sIG5vdCBhIHZhbHVlIGZpbmdlcnByaW50IG9yIGFuIGF1dGhlbnRpY2l0eSBzaWduYXR1cmUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGlzdG9yeURpZ2VzdCh2YWx1ZTogdW5rbm93bik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gIGNvbnN0IGRpZ2VzdCA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBieXRlcyk7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGRpZ2VzdCksIChuKSA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbn1cblxuLyoqIE9uZSBmaWVsZCBvcmRlciBmb3IgYm90aCBzaWRlcyBvZiB0aGUgZXZpZGVuY2UgZGlnZXN0OyBvcHRpb25hbCBzb3VyY2UvYWJzZW5jZSBmaWVsZHMgY2Fubm90IGRyaWZ0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpc3RvcnlFdmlkZW5jZSh2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGZpZWxkcyA9IFsnY2FwdHVyZScsICdleGVjdXRpb25UcmVlJywgJ3JlY29yZGVycycsICdyZWFkU291cmNlcycsICdhYnNlbnQnXTtcbiAgaWYgKE9iamVjdC5rZXlzKHZhbHVlKS5zb21lKChrZXkpID0+IGtleSAhPT0gJ3RhcmdldCcgJiYgIWZpZWxkcy5pbmNsdWRlcyhrZXkpKSlcbiAgICB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignaW52YWxpZC1kYXRhJyk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZmllbGRzLmZpbHRlcigoa2V5KSA9PiBPYmplY3QuaGFzT3duKHZhbHVlLCBrZXkpKS5tYXAoKGtleSkgPT4gW2tleSwgdmFsdWVba2V5XV0pKTtcbn1cbiJdfQ==
@@ -1,4 +1,4 @@
1
1
  import type { CaptureHistoryTarget } from './historyTypes.js';
2
- import type { NativeCaptureNote } from './nativeCoverage.js';
2
+ import type { NativeCaptureObservation } from './readSources.js';
3
3
  /** @internal Called only after the bounded inert-data copier. Retains native observations, not storage authority. */
4
- export declare function historyNote(value: unknown, target: CaptureHistoryTarget): NativeCaptureNote | undefined;
4
+ export declare function historyNote(value: unknown, target: CaptureHistoryTarget): NativeCaptureObservation | undefined;
@@ -1,11 +1,12 @@
1
- import { CAPTURE_BASE_LIMITATIONS } from './nativeCoverage.js';
2
- import { copyChannels, copyIdentity, copyLimitations, copyModes } from './noteShape.js';
1
+ import { CAPTURE_BASE_LIMITATIONS, CAPTURE_CHANNEL_STATUSES, isCaptureValue } from './nativeCoverage.js';
2
+ import { copyChannels, copyIdentity, copyLimitations, copyModes, copyObservedChannels, ownData } from './noteShape.js';
3
3
  /** @internal Called only after the bounded inert-data copier. Retains native observations, not storage authority. */
4
4
  export function historyNote(value, target) {
5
5
  if (!value || typeof value !== 'object')
6
6
  return undefined;
7
7
  const v = value;
8
- const identity = copyIdentity(v, true);
8
+ const version = ownData(v, 'version') === 2 ? 2 : 1;
9
+ const identity = copyIdentity(v, true, version);
9
10
  const limitations = copyLimitations(v.limitations);
10
11
  if (!identity ||
11
12
  JSON.stringify(identity) !== JSON.stringify(copyIdentity(target)) ||
@@ -16,9 +17,13 @@ export function historyNote(value, target) {
16
17
  !v.modes ||
17
18
  !v.channels ||
18
19
  !limitations ||
19
- !CAPTURE_BASE_LIMITATIONS.every((g) => limitations.includes(g)) ||
20
+ !CAPTURE_BASE_LIMITATIONS.filter((g) => version === 1 || g !== 'read-sources-not-collected').every((g) => limitations.includes(g)) ||
20
21
  !copyModes(v.modes, true) ||
21
- !copyChannels(v.channels, true))
22
+ !(version === 1 ? copyChannels(v.channels, true) : copyObservedChannels(v.channels)) ||
23
+ (version === 2 &&
24
+ (!isCaptureValue(v.channels.readSources, CAPTURE_CHANNEL_STATUSES) ||
25
+ Object.keys(v.channels).length !== 5 ||
26
+ limitations.includes('read-sources-not-collected'))))
22
27
  return undefined;
23
28
  // Reject extra metadata rather than handing arbitrary stored fields out as native facts.
24
29
  if (Object.keys(v).some((k) => ![
@@ -49,4 +54,4 @@ export function historyNote(value, target) {
49
54
  return undefined;
50
55
  return v;
51
56
  }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeU5vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvaGlzdG9yeU5vdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhGLHFIQUFxSDtBQUNySCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQWMsRUFBRSxNQUE0QjtJQUN0RSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxRCxNQUFNLENBQUMsR0FBRyxLQUEwQixDQUFDO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRCxJQUNFLENBQUMsUUFBUTtRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLEtBQUssS0FBSyxVQUFVO1FBQ3RCLENBQUMsQ0FBQyxXQUFXLEtBQUssYUFBYTtRQUMvQixDQUFDLENBQUMsQ0FBQyxRQUFRO1FBQ1gsQ0FBQyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMzRSxDQUFDLENBQUMsQ0FBQyxLQUFLO1FBQ1IsQ0FBQyxDQUFDLENBQUMsUUFBUTtRQUNYLENBQUMsV0FBVztRQUNaLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1FBQ3pCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO1FBRS9CLE9BQU8sU0FBUyxDQUFDO0lBQ25CLHlGQUF5RjtJQUN6RixJQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNqQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQztRQUNDLFNBQVM7UUFDVCxPQUFPO1FBQ1AsT0FBTztRQUNQLFlBQVk7UUFDWixTQUFTO1FBQ1QsVUFBVTtRQUNWLE9BQU87UUFDUCxVQUFVO1FBQ1YsYUFBYTtRQUNiLGFBQWE7S0FDZCxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDaEI7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUNuQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0YsSUFDRSxPQUFPO1FBQ1AsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNuRCxDQUFDLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDNUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLE9BQU8sQ0FBQztZQUNuRSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2dCQUNaLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQztvQkFDOUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUs7b0JBQy9CLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEtBQUssUUFBUTtvQkFDaEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFbkQsT0FBTyxTQUFTLENBQUM7SUFDbkIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXB0dXJlSGlzdG9yeVRhcmdldCB9IGZyb20gJy4vaGlzdG9yeVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTmF0aXZlQ2FwdHVyZU5vdGUgfSBmcm9tICcuL25hdGl2ZUNvdmVyYWdlLmpzJztcbmltcG9ydCB7IENBUFRVUkVfQkFTRV9MSU1JVEFUSU9OUyB9IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHsgY29weUNoYW5uZWxzLCBjb3B5SWRlbnRpdHksIGNvcHlMaW1pdGF0aW9ucywgY29weU1vZGVzIH0gZnJvbSAnLi9ub3RlU2hhcGUuanMnO1xuXG4vKiogQGludGVybmFsIENhbGxlZCBvbmx5IGFmdGVyIHRoZSBib3VuZGVkIGluZXJ0LWRhdGEgY29waWVyLiBSZXRhaW5zIG5hdGl2ZSBvYnNlcnZhdGlvbnMsIG5vdCBzdG9yYWdlIGF1dGhvcml0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaXN0b3J5Tm90ZSh2YWx1ZTogdW5rbm93biwgdGFyZ2V0OiBDYXB0dXJlSGlzdG9yeVRhcmdldCk6IE5hdGl2ZUNhcHR1cmVOb3RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB2ID0gdmFsdWUgYXMgTmF0aXZlQ2FwdHVyZU5vdGU7XG4gIGNvbnN0IGlkZW50aXR5ID0gY29weUlkZW50aXR5KHYsIHRydWUpO1xuICBjb25zdCBsaW1pdGF0aW9ucyA9IGNvcHlMaW1pdGF0aW9ucyh2LmxpbWl0YXRpb25zKTtcbiAgaWYgKFxuICAgICFpZGVudGl0eSB8fFxuICAgIEpTT04uc3RyaW5naWZ5KGlkZW50aXR5KSAhPT0gSlNPTi5zdHJpbmdpZnkoY29weUlkZW50aXR5KHRhcmdldCkpIHx8XG4gICAgdi5zY29wZSAhPT0gJ3Jvb3QtbG9nJyB8fFxuICAgIHYucGVyc2lzdGVuY2UgIT09ICdtZW1vcnktb25seScgfHxcbiAgICAhdi5ib3VuZGFyeSB8fFxuICAgICFbJ2NvbXBsZXRlZCcsICdmYWlsZWQnLCAncGF1c2VkJywgJ2NhbmNlbGxlZCddLmluY2x1ZGVzKHYuYm91bmRhcnkuc3RhdHVzKSB8fFxuICAgICF2Lm1vZGVzIHx8XG4gICAgIXYuY2hhbm5lbHMgfHxcbiAgICAhbGltaXRhdGlvbnMgfHxcbiAgICAhQ0FQVFVSRV9CQVNFX0xJTUlUQVRJT05TLmV2ZXJ5KChnKSA9PiBsaW1pdGF0aW9ucy5pbmNsdWRlcyhnKSkgfHxcbiAgICAhY29weU1vZGVzKHYubW9kZXMsIHRydWUpIHx8XG4gICAgIWNvcHlDaGFubmVscyh2LmNoYW5uZWxzLCB0cnVlKVxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gUmVqZWN0IGV4dHJhIG1ldGFkYXRhIHJhdGhlciB0aGFuIGhhbmRpbmcgYXJiaXRyYXJ5IHN0b3JlZCBmaWVsZHMgb3V0IGFzIG5hdGl2ZSBmYWN0cy5cbiAgaWYgKFxuICAgIE9iamVjdC5rZXlzKHYpLnNvbWUoXG4gICAgICAoaykgPT5cbiAgICAgICAgIVtcbiAgICAgICAgICAndmVyc2lvbicsXG4gICAgICAgICAgJ3J1bklkJyxcbiAgICAgICAgICAnc2NvcGUnLFxuICAgICAgICAgICdsb2dBZGRyZXNzJyxcbiAgICAgICAgICAnY29tbWl0cycsXG4gICAgICAgICAgJ2JvdW5kYXJ5JyxcbiAgICAgICAgICAnbW9kZXMnLFxuICAgICAgICAgICdjaGFubmVscycsXG4gICAgICAgICAgJ3BlcnNpc3RlbmNlJyxcbiAgICAgICAgICAnbGltaXRhdGlvbnMnLFxuICAgICAgICBdLmluY2x1ZGVzKGspLFxuICAgIClcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZhaWx1cmUgPSB2LmJvdW5kYXJ5LmZhaWx1cmU7XG4gIGlmIChPYmplY3Qua2V5cyh2LmJvdW5kYXJ5KS5zb21lKChrKSA9PiBrICE9PSAnc3RhdHVzJyAmJiBrICE9PSAnZmFpbHVyZScpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoXG4gICAgZmFpbHVyZSAmJlxuICAgICghWydmYWlsZWQnLCAnY2FuY2VsbGVkJ10uaW5jbHVkZXModi5ib3VuZGFyeS5zdGF0dXMpIHx8XG4gICAgICAhWyd0aW1lb3V0JywgJ3JhdGUtbGltaXRlZCcsICdzZXJ2ZXInLCAnbmV0d29yaycsICdhdXRoJywgJ3Blcm1hbmVudCcsICd1bmtub3duJ10uaW5jbHVkZXMoZmFpbHVyZS5jYXRlZ29yeSkgfHxcbiAgICAgIE9iamVjdC5rZXlzKGZhaWx1cmUpLnNvbWUoKGspID0+IGsgIT09ICdjYXRlZ29yeScgJiYgayAhPT0gJ3N0YWdlJykgfHxcbiAgICAgIChmYWlsdXJlLnN0YWdlICYmXG4gICAgICAgIChPYmplY3Qua2V5cyhmYWlsdXJlLnN0YWdlKS5zb21lKChrKSA9PiBrICE9PSAncnVuSWQnICYmIGsgIT09ICdydW50aW1lU3RhZ2VJZCcpIHx8XG4gICAgICAgICAgZmFpbHVyZS5zdGFnZS5ydW5JZCAhPT0gdi5ydW5JZCB8fFxuICAgICAgICAgIHR5cGVvZiBmYWlsdXJlLnN0YWdlLnJ1bnRpbWVTdGFnZUlkICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIGZhaWx1cmUuc3RhZ2UucnVudGltZVN0YWdlSWQubGVuZ3RoID4gMTAyNCkpKVxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHY7XG59XG4iXX0=
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeU5vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvaGlzdG9yeU5vdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHdCQUF3QixFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkgscUhBQXFIO0FBQ3JILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYyxFQUFFLE1BQTRCO0lBQ3RFLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzFELE1BQU0sQ0FBQyxHQUFHLEtBQWlDLENBQUM7SUFDNUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsSUFDRSxDQUFDLFFBQVE7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxLQUFLLEtBQUssVUFBVTtRQUN0QixDQUFDLENBQUMsV0FBVyxLQUFLLGFBQWE7UUFDL0IsQ0FBQyxDQUFDLENBQUMsUUFBUTtRQUNYLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUMsS0FBSztRQUNSLENBQUMsQ0FBQyxDQUFDLFFBQVE7UUFDWCxDQUFDLFdBQVc7UUFDWixDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssNEJBQTRCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN2RyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUN4QjtRQUNELENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BGLENBQUMsT0FBTyxLQUFLLENBQUM7WUFDWixDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHdCQUF3QixDQUFDO2dCQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDcEMsV0FBVyxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUM7UUFFeEQsT0FBTyxTQUFTLENBQUM7SUFDbkIseUZBQXlGO0lBQ3pGLElBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDO1FBQ0MsU0FBUztRQUNULE9BQU87UUFDUCxPQUFPO1FBQ1AsWUFBWTtRQUNaLFNBQVM7UUFDVCxVQUFVO1FBQ1YsT0FBTztRQUNQLFVBQVU7UUFDVixhQUFhO1FBQ2IsYUFBYTtLQUNkLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUNoQjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQ25DLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3RixJQUNFLE9BQU87UUFDUCxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ25ELENBQUMsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUM1RyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssT0FBTyxDQUFDO1lBQ25FLENBQUMsT0FBTyxDQUFDLEtBQUs7Z0JBQ1osQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLGdCQUFnQixDQUFDO29CQUM5RSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSztvQkFDL0IsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsS0FBSyxRQUFRO29CQUNoRCxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVuRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhcHR1cmVIaXN0b3J5VGFyZ2V0IH0gZnJvbSAnLi9oaXN0b3J5VHlwZXMuanMnO1xuaW1wb3J0IHsgQ0FQVFVSRV9CQVNFX0xJTUlUQVRJT05TLCBDQVBUVVJFX0NIQU5ORUxfU1RBVFVTRVMsIGlzQ2FwdHVyZVZhbHVlIH0gZnJvbSAnLi9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5pbXBvcnQgeyBjb3B5Q2hhbm5lbHMsIGNvcHlJZGVudGl0eSwgY29weUxpbWl0YXRpb25zLCBjb3B5TW9kZXMsIGNvcHlPYnNlcnZlZENoYW5uZWxzLCBvd25EYXRhIH0gZnJvbSAnLi9ub3RlU2hhcGUuanMnO1xuaW1wb3J0IHR5cGUgeyBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24gfSBmcm9tICcuL3JlYWRTb3VyY2VzLmpzJztcblxuLyoqIEBpbnRlcm5hbCBDYWxsZWQgb25seSBhZnRlciB0aGUgYm91bmRlZCBpbmVydC1kYXRhIGNvcGllci4gUmV0YWlucyBuYXRpdmUgb2JzZXJ2YXRpb25zLCBub3Qgc3RvcmFnZSBhdXRob3JpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gaGlzdG9yeU5vdGUodmFsdWU6IHVua25vd24sIHRhcmdldDogQ2FwdHVyZUhpc3RvcnlUYXJnZXQpOiBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHYgPSB2YWx1ZSBhcyBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb247XG4gIGNvbnN0IHZlcnNpb24gPSBvd25EYXRhKHYsICd2ZXJzaW9uJykgPT09IDIgPyAyIDogMTtcbiAgY29uc3QgaWRlbnRpdHkgPSBjb3B5SWRlbnRpdHkodiwgdHJ1ZSwgdmVyc2lvbik7XG4gIGNvbnN0IGxpbWl0YXRpb25zID0gY29weUxpbWl0YXRpb25zKHYubGltaXRhdGlvbnMpO1xuICBpZiAoXG4gICAgIWlkZW50aXR5IHx8XG4gICAgSlNPTi5zdHJpbmdpZnkoaWRlbnRpdHkpICE9PSBKU09OLnN0cmluZ2lmeShjb3B5SWRlbnRpdHkodGFyZ2V0KSkgfHxcbiAgICB2LnNjb3BlICE9PSAncm9vdC1sb2cnIHx8XG4gICAgdi5wZXJzaXN0ZW5jZSAhPT0gJ21lbW9yeS1vbmx5JyB8fFxuICAgICF2LmJvdW5kYXJ5IHx8XG4gICAgIVsnY29tcGxldGVkJywgJ2ZhaWxlZCcsICdwYXVzZWQnLCAnY2FuY2VsbGVkJ10uaW5jbHVkZXModi5ib3VuZGFyeS5zdGF0dXMpIHx8XG4gICAgIXYubW9kZXMgfHxcbiAgICAhdi5jaGFubmVscyB8fFxuICAgICFsaW1pdGF0aW9ucyB8fFxuICAgICFDQVBUVVJFX0JBU0VfTElNSVRBVElPTlMuZmlsdGVyKChnKSA9PiB2ZXJzaW9uID09PSAxIHx8IGcgIT09ICdyZWFkLXNvdXJjZXMtbm90LWNvbGxlY3RlZCcpLmV2ZXJ5KChnKSA9PlxuICAgICAgbGltaXRhdGlvbnMuaW5jbHVkZXMoZyksXG4gICAgKSB8fFxuICAgICFjb3B5TW9kZXModi5tb2RlcywgdHJ1ZSkgfHxcbiAgICAhKHZlcnNpb24gPT09IDEgPyBjb3B5Q2hhbm5lbHModi5jaGFubmVscywgdHJ1ZSkgOiBjb3B5T2JzZXJ2ZWRDaGFubmVscyh2LmNoYW5uZWxzKSkgfHxcbiAgICAodmVyc2lvbiA9PT0gMiAmJlxuICAgICAgKCFpc0NhcHR1cmVWYWx1ZSh2LmNoYW5uZWxzLnJlYWRTb3VyY2VzLCBDQVBUVVJFX0NIQU5ORUxfU1RBVFVTRVMpIHx8XG4gICAgICAgIE9iamVjdC5rZXlzKHYuY2hhbm5lbHMpLmxlbmd0aCAhPT0gNSB8fFxuICAgICAgICBsaW1pdGF0aW9ucy5pbmNsdWRlcygncmVhZC1zb3VyY2VzLW5vdC1jb2xsZWN0ZWQnKSkpXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBSZWplY3QgZXh0cmEgbWV0YWRhdGEgcmF0aGVyIHRoYW4gaGFuZGluZyBhcmJpdHJhcnkgc3RvcmVkIGZpZWxkcyBvdXQgYXMgbmF0aXZlIGZhY3RzLlxuICBpZiAoXG4gICAgT2JqZWN0LmtleXModikuc29tZShcbiAgICAgIChrKSA9PlxuICAgICAgICAhW1xuICAgICAgICAgICd2ZXJzaW9uJyxcbiAgICAgICAgICAncnVuSWQnLFxuICAgICAgICAgICdzY29wZScsXG4gICAgICAgICAgJ2xvZ0FkZHJlc3MnLFxuICAgICAgICAgICdjb21taXRzJyxcbiAgICAgICAgICAnYm91bmRhcnknLFxuICAgICAgICAgICdtb2RlcycsXG4gICAgICAgICAgJ2NoYW5uZWxzJyxcbiAgICAgICAgICAncGVyc2lzdGVuY2UnLFxuICAgICAgICAgICdsaW1pdGF0aW9ucycsXG4gICAgICAgIF0uaW5jbHVkZXMoayksXG4gICAgKVxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZmFpbHVyZSA9IHYuYm91bmRhcnkuZmFpbHVyZTtcbiAgaWYgKE9iamVjdC5rZXlzKHYuYm91bmRhcnkpLnNvbWUoKGspID0+IGsgIT09ICdzdGF0dXMnICYmIGsgIT09ICdmYWlsdXJlJykpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICBmYWlsdXJlICYmXG4gICAgKCFbJ2ZhaWxlZCcsICdjYW5jZWxsZWQnXS5pbmNsdWRlcyh2LmJvdW5kYXJ5LnN0YXR1cykgfHxcbiAgICAgICFbJ3RpbWVvdXQnLCAncmF0ZS1saW1pdGVkJywgJ3NlcnZlcicsICduZXR3b3JrJywgJ2F1dGgnLCAncGVybWFuZW50JywgJ3Vua25vd24nXS5pbmNsdWRlcyhmYWlsdXJlLmNhdGVnb3J5KSB8fFxuICAgICAgT2JqZWN0LmtleXMoZmFpbHVyZSkuc29tZSgoaykgPT4gayAhPT0gJ2NhdGVnb3J5JyAmJiBrICE9PSAnc3RhZ2UnKSB8fFxuICAgICAgKGZhaWx1cmUuc3RhZ2UgJiZcbiAgICAgICAgKE9iamVjdC5rZXlzKGZhaWx1cmUuc3RhZ2UpLnNvbWUoKGspID0+IGsgIT09ICdydW5JZCcgJiYgayAhPT0gJ3J1bnRpbWVTdGFnZUlkJykgfHxcbiAgICAgICAgICBmYWlsdXJlLnN0YWdlLnJ1bklkICE9PSB2LnJ1bklkIHx8XG4gICAgICAgICAgdHlwZW9mIGZhaWx1cmUuc3RhZ2UucnVudGltZVN0YWdlSWQgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgZmFpbHVyZS5zdGFnZS5ydW50aW1lU3RhZ2VJZC5sZW5ndGggPiAxMDI0KSkpXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdjtcbn1cbiJdfQ==
@@ -4,7 +4,7 @@ export interface CaptureHistoryTarget {
4
4
  readonly version: 1;
5
5
  readonly evidenceId: string;
6
6
  readonly runId: string;
7
- /** SHA-256 of the exact inert JSON evidence plus canonical commit log and served starting state. */
7
+ /** SHA-256 of the exact inert JSON evidence (including opted-in source metadata) plus canonical commit log and served starting state. */
8
8
  readonly digest: string;
9
9
  readonly logAddress: LogAddress;
10
10
  readonly commits: {
@@ -1,4 +1,4 @@
1
1
  /** @internal Opaque note names; Foottrace keeps them without interpreting engine metadata. */
2
2
  export const CAPTURE_HISTORY_NOTE = 'capture-history';
3
3
  export const CAPTURE_RECEIPT_NOTE = 'capture-receipt';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeVR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL2hpc3RvcnlUeXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQ0EsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDO0FBQ3RELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMb2dBZGRyZXNzIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuLyoqIEV4YWN0IHJvb3Qgc2VnbWVudCBhbmQgZXZpZGVuY2UgZW50cnkgYWNrbm93bGVkZ2VkIGJ5IGEgc3RvcmFnZSBhZGFwdGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlSGlzdG9yeVRhcmdldCB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDE7XG4gIHJlYWRvbmx5IGV2aWRlbmNlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqIFNIQS0yNTYgb2YgdGhlIGV4YWN0IGluZXJ0IEpTT04gZXZpZGVuY2UgcGx1cyBjYW5vbmljYWwgY29tbWl0IGxvZyBhbmQgc2VydmVkIHN0YXJ0aW5nIHN0YXRlLiAqL1xuICByZWFkb25seSBkaWdlc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9nQWRkcmVzczogTG9nQWRkcmVzcztcbiAgcmVhZG9ubHkgY29tbWl0czogeyByZWFkb25seSBmcm9tOiBudW1iZXI7IHJlYWRvbmx5IHRvOiBudW1iZXIgfTtcbn1cblxuLyoqIEFkYXB0ZXIgYXNzZXJ0aW9uIGFib3V0IHRoZSBwcmVjZWRpbmcgZXZpZGVuY2UgYW5kIGVuZCBlbnRyeSwgbm90IGFib3V0IHRoaXMgcmVjZWlwdCdzIGRlbGl2ZXJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlSGlzdG9yeVJlY2VpcHQgZXh0ZW5kcyBDYXB0dXJlSGlzdG9yeVRhcmdldCB7XG4gIHJlYWRvbmx5IGR1cmFiaWxpdHk6ICdkdXJhYmxlJztcbn1cblxuLyoqIEV4cGxpY2l0IGhvc3Qtb3duZWQgZHVyYWJpbGl0eSBjYXBhYmlsaXR5LiBBIG5vcm1hbCBSZWNvcmRTaW5rLmZsdXNoIGlzIG5vdCB0aGlzIHByb21pc2UuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcHR1cmVIaXN0b3J5T3B0aW9ucyB7XG4gIC8qKiBSZXNvbHZlIG9ubHkgYWZ0ZXIgdGhpcyB0YXJnZXQncyBldmlkZW5jZSwgY29tbWl0cyBhbmQgZW5kIGVudHJ5IGFyZSBkdXJhYmx5IHN0b3JlZCB0b2dldGhlci4gKi9cbiAgcmVhZG9ubHkgYWNrbm93bGVkZ2U6IChcbiAgICB0YXJnZXQ6IENhcHR1cmVIaXN0b3J5VGFyZ2V0LFxuICAgIGNvbnRleHQ6IHsgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbCB9LFxuICApID0+IFByb21pc2U8Q2FwdHVyZUhpc3RvcnlSZWNlaXB0PjtcbiAgLyoqIE1heGltdW0gVVRGLTggYnl0ZXMgb2YgdGhlIGV2aWRlbmNlIHBheWxvYWQgYW5kIHRhcmdldC4gRGVmYXVsdCAxIE1pQiwgbWF4aW11bSA4IE1pQi4gKi9cbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKiBUb3RhbCB0aW1lIGFsbG93ZWQgZm9yIGV2aWRlbmNlIGRlbGl2ZXJ5LCBhY2tub3dsZWRnZW1lbnQgYW5kIHJlY2VpcHQgZGVsaXZlcnkuIERlZmF1bHQgMTBzLCBtYXhpbXVtIDMwcy4gKi9cbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKiogUGVyc2lzdGVuY2UgcmVzdWx0IG9ubHkuIEFuIGFja25vd2xlZGdlZCBmYWlsZWQvcGF1c2VkIHByZWZpeCBpcyBub3QgYSBjb21wbGV0ZWQgYnVzaW5lc3Mgd29ya2Zsb3cuICovXG5leHBvcnQgdHlwZSBDYXB0dXJlSGlzdG9yeVN0YXR1cyA9XG4gIHwgeyByZWFkb25seSBzdGF0dXM6ICdhY2tub3dsZWRnZWQnIH1cbiAgfCB7IHJlYWRvbmx5IHN0YXR1czogJ3Vua25vd24nOyByZWFkb25seSByZWFzb246IHN0cmluZyB9O1xuXG4vKiogQGludGVybmFsIE9wYXF1ZSBub3RlIG5hbWVzOyBGb290dHJhY2Uga2VlcHMgdGhlbSB3aXRob3V0IGludGVycHJldGluZyBlbmdpbmUgbWV0YWRhdGEuICovXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9ISVNUT1JZX05PVEUgPSAnY2FwdHVyZS1oaXN0b3J5JztcbmV4cG9ydCBjb25zdCBDQVBUVVJFX1JFQ0VJUFRfTk9URSA9ICdjYXB0dXJlLXJlY2VpcHQnO1xuIl19
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeVR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL2hpc3RvcnlUeXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQ0EsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDO0FBQ3RELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMb2dBZGRyZXNzIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuLyoqIEV4YWN0IHJvb3Qgc2VnbWVudCBhbmQgZXZpZGVuY2UgZW50cnkgYWNrbm93bGVkZ2VkIGJ5IGEgc3RvcmFnZSBhZGFwdGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlSGlzdG9yeVRhcmdldCB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDE7XG4gIHJlYWRvbmx5IGV2aWRlbmNlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqIFNIQS0yNTYgb2YgdGhlIGV4YWN0IGluZXJ0IEpTT04gZXZpZGVuY2UgKGluY2x1ZGluZyBvcHRlZC1pbiBzb3VyY2UgbWV0YWRhdGEpIHBsdXMgY2Fub25pY2FsIGNvbW1pdCBsb2cgYW5kIHNlcnZlZCBzdGFydGluZyBzdGF0ZS4gKi9cbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvZ0FkZHJlc3M6IExvZ0FkZHJlc3M7XG4gIHJlYWRvbmx5IGNvbW1pdHM6IHsgcmVhZG9ubHkgZnJvbTogbnVtYmVyOyByZWFkb25seSB0bzogbnVtYmVyIH07XG59XG5cbi8qKiBBZGFwdGVyIGFzc2VydGlvbiBhYm91dCB0aGUgcHJlY2VkaW5nIGV2aWRlbmNlIGFuZCBlbmQgZW50cnksIG5vdCBhYm91dCB0aGlzIHJlY2VpcHQncyBkZWxpdmVyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdHVyZUhpc3RvcnlSZWNlaXB0IGV4dGVuZHMgQ2FwdHVyZUhpc3RvcnlUYXJnZXQge1xuICByZWFkb25seSBkdXJhYmlsaXR5OiAnZHVyYWJsZSc7XG59XG5cbi8qKiBFeHBsaWNpdCBob3N0LW93bmVkIGR1cmFiaWxpdHkgY2FwYWJpbGl0eS4gQSBub3JtYWwgUmVjb3JkU2luay5mbHVzaCBpcyBub3QgdGhpcyBwcm9taXNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlSGlzdG9yeU9wdGlvbnMge1xuICAvKiogUmVzb2x2ZSBvbmx5IGFmdGVyIHRoaXMgdGFyZ2V0J3MgZXZpZGVuY2UsIGNvbW1pdHMgYW5kIGVuZCBlbnRyeSBhcmUgZHVyYWJseSBzdG9yZWQgdG9nZXRoZXIuICovXG4gIHJlYWRvbmx5IGFja25vd2xlZGdlOiAoXG4gICAgdGFyZ2V0OiBDYXB0dXJlSGlzdG9yeVRhcmdldCxcbiAgICBjb250ZXh0OiB7IHJlYWRvbmx5IHNpZ25hbDogQWJvcnRTaWduYWwgfSxcbiAgKSA9PiBQcm9taXNlPENhcHR1cmVIaXN0b3J5UmVjZWlwdD47XG4gIC8qKiBNYXhpbXVtIFVURi04IGJ5dGVzIG9mIHRoZSBldmlkZW5jZSBwYXlsb2FkIGFuZCB0YXJnZXQuIERlZmF1bHQgMSBNaUIsIG1heGltdW0gOCBNaUIuICovXG4gIHJlYWRvbmx5IG1heEJ5dGVzPzogbnVtYmVyO1xuICAvKiogVG90YWwgdGltZSBhbGxvd2VkIGZvciBldmlkZW5jZSBkZWxpdmVyeSwgYWNrbm93bGVkZ2VtZW50IGFuZCByZWNlaXB0IGRlbGl2ZXJ5LiBEZWZhdWx0IDEwcywgbWF4aW11bSAzMHMuICovXG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcbn1cblxuLyoqIFBlcnNpc3RlbmNlIHJlc3VsdCBvbmx5LiBBbiBhY2tub3dsZWRnZWQgZmFpbGVkL3BhdXNlZCBwcmVmaXggaXMgbm90IGEgY29tcGxldGVkIGJ1c2luZXNzIHdvcmtmbG93LiAqL1xuZXhwb3J0IHR5cGUgQ2FwdHVyZUhpc3RvcnlTdGF0dXMgPVxuICB8IHsgcmVhZG9ubHkgc3RhdHVzOiAnYWNrbm93bGVkZ2VkJyB9XG4gIHwgeyByZWFkb25seSBzdGF0dXM6ICd1bmtub3duJzsgcmVhZG9ubHkgcmVhc29uOiBzdHJpbmcgfTtcblxuLyoqIEBpbnRlcm5hbCBPcGFxdWUgbm90ZSBuYW1lczsgRm9vdHRyYWNlIGtlZXBzIHRoZW0gd2l0aG91dCBpbnRlcnByZXRpbmcgZW5naW5lIG1ldGFkYXRhLiAqL1xuZXhwb3J0IGNvbnN0IENBUFRVUkVfSElTVE9SWV9OT1RFID0gJ2NhcHR1cmUtaGlzdG9yeSc7XG5leHBvcnQgY29uc3QgQ0FQVFVSRV9SRUNFSVBUX05PVEUgPSAnY2FwdHVyZS1yZWNlaXB0JztcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import type { LogAddress } from 'foottrace';
2
+ /** Native structural admission only: no user heap, options, sink or source selection participates. */
3
+ export declare function supportsNativeSourceAddress(address: LogAddress): boolean;
@@ -0,0 +1,15 @@
1
+ import { createReadSourceRecord, decodeReadSourceSnapshot, SharedMemory } from 'foottrace/write';
2
+ let emptyNativeBook;
3
+ /** Native structural admission only: no user heap, options, sink or source selection participates. */
4
+ export function supportsNativeSourceAddress(address) {
5
+ if (!emptyNativeBook) {
6
+ // Let the published writer supply its own wire version, limits and empty envelope.
7
+ // Lazy: default-off executions never allocate this inert validation fixture.
8
+ const book = createReadSourceRecord(new SharedMemory(), { logRunId: 'source-address-admission', drillPath: [] });
9
+ emptyNativeBook = book.snapshot();
10
+ book.retire();
11
+ }
12
+ // The native codec owns all address bounds. This candidate is never served as observed evidence.
13
+ return decodeReadSourceSnapshot({ ...emptyNativeBook, address }) !== undefined;
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlU291cmNlQWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9uYXRpdmVTb3VyY2VBZGRyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRyxJQUFJLGVBQStDLENBQUM7QUFFcEQsc0dBQXNHO0FBQ3RHLE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxPQUFtQjtJQUM3RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsbUZBQW1GO1FBQ25GLDZFQUE2RTtRQUM3RSxNQUFNLElBQUksR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLDBCQUEwQixFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pILGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxpR0FBaUc7SUFDakcsT0FBTyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ2pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWFkU291cmNlU25hcHNob3QgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFNvdXJjZVJlY29yZCwgZGVjb2RlUmVhZFNvdXJjZVNuYXBzaG90LCBTaGFyZWRNZW1vcnkgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5sZXQgZW1wdHlOYXRpdmVCb29rOiBSZWFkU291cmNlU25hcHNob3QgfCB1bmRlZmluZWQ7XG5cbi8qKiBOYXRpdmUgc3RydWN0dXJhbCBhZG1pc3Npb24gb25seTogbm8gdXNlciBoZWFwLCBvcHRpb25zLCBzaW5rIG9yIHNvdXJjZSBzZWxlY3Rpb24gcGFydGljaXBhdGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzTmF0aXZlU291cmNlQWRkcmVzcyhhZGRyZXNzOiBMb2dBZGRyZXNzKTogYm9vbGVhbiB7XG4gIGlmICghZW1wdHlOYXRpdmVCb29rKSB7XG4gICAgLy8gTGV0IHRoZSBwdWJsaXNoZWQgd3JpdGVyIHN1cHBseSBpdHMgb3duIHdpcmUgdmVyc2lvbiwgbGltaXRzIGFuZCBlbXB0eSBlbnZlbG9wZS5cbiAgICAvLyBMYXp5OiBkZWZhdWx0LW9mZiBleGVjdXRpb25zIG5ldmVyIGFsbG9jYXRlIHRoaXMgaW5lcnQgdmFsaWRhdGlvbiBmaXh0dXJlLlxuICAgIGNvbnN0IGJvb2sgPSBjcmVhdGVSZWFkU291cmNlUmVjb3JkKG5ldyBTaGFyZWRNZW1vcnkoKSwgeyBsb2dSdW5JZDogJ3NvdXJjZS1hZGRyZXNzLWFkbWlzc2lvbicsIGRyaWxsUGF0aDogW10gfSk7XG4gICAgZW1wdHlOYXRpdmVCb29rID0gYm9vay5zbmFwc2hvdCgpO1xuICAgIGJvb2sucmV0aXJlKCk7XG4gIH1cbiAgLy8gVGhlIG5hdGl2ZSBjb2RlYyBvd25zIGFsbCBhZGRyZXNzIGJvdW5kcy4gVGhpcyBjYW5kaWRhdGUgaXMgbmV2ZXIgc2VydmVkIGFzIG9ic2VydmVkIGV2aWRlbmNlLlxuICByZXR1cm4gZGVjb2RlUmVhZFNvdXJjZVNuYXBzaG90KHsgLi4uZW1wdHlOYXRpdmVCb29rLCBhZGRyZXNzIH0pICE9PSB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -1,7 +1,7 @@
1
1
  import type { ReadSourceRecord, ReadSourceSnapshot } from 'foottrace/write';
2
2
  import type { CaptureChannelStatus, NativeCaptureNote } from './nativeCoverage.js';
3
3
  /** Engine coverage only. Source descriptors and their codec belong to foottrace/write. */
4
- export declare const SOURCE_LIMITATIONS: readonly ["privacy-active", "identity-unavailable", "untracked-read", "custom-scope", "child-source-ownership", "resumed-source-ownership", "sink-source-unsupported", "source-history-not-included", "source-capture-failed", "redacted-source-export"];
4
+ export declare const SOURCE_LIMITATIONS: readonly ["privacy-active", "identity-unavailable", "untracked-read", "custom-scope", "child-source-ownership", "source-address-unsupported", "resumed-source-ownership", "sink-source-unsupported", "source-history-not-included", "source-capture-failed", "redacted-source-export"];
5
5
  export type SourceLimitation = (typeof SOURCE_LIMITATIONS)[number];
6
6
  /** Packet 3 is an in-memory observation, not a stored-history acknowledgement. */
7
7
  export interface EngineReadSources {
@@ -32,7 +32,9 @@ export declare class EngineReadSourceCapture {
32
32
  readonly from: number;
33
33
  private readonly gaps;
34
34
  private sealed?;
35
+ private retired;
35
36
  get observing(): boolean;
37
+ get active(): boolean;
36
38
  constructor(runId: string, book?: ReadSourceRecord | undefined, gap?: SourceLimitation, from?: number);
37
39
  limit(gap: SourceLimitation): void;
38
40
  retire(): void;
@@ -41,3 +43,7 @@ export declare class EngineReadSourceCapture {
41
43
  }
42
44
  /** Keep the v1 producer unchanged. Only explicitly enabled source observations acquire v2. */
43
45
  export declare function withReadSources(note: NativeCaptureNote, sources: EngineReadSources): NativeReadCaptureNote;
46
+ /** One status rule shared by native observations and stored admission; storage cannot upgrade coverage. */
47
+ export declare function readSourceStatus(record: ReadSourceSnapshot | undefined, limitations: number): CaptureChannelStatus;
48
+ /** Redacted exports withhold every reference, including those captured before a later privacy mark. */
49
+ export declare function redactReadSources(source: EngineReadSources): EngineReadSources;
@@ -5,6 +5,7 @@ export const SOURCE_LIMITATIONS = Object.freeze([
5
5
  'untracked-read',
6
6
  'custom-scope',
7
7
  'child-source-ownership',
8
+ 'source-address-unsupported',
8
9
  'resumed-source-ownership',
9
10
  'sink-source-unsupported',
10
11
  'source-history-not-included',
@@ -18,9 +19,13 @@ export class EngineReadSourceCapture {
18
19
  from;
19
20
  gaps = new Set();
20
21
  sealed;
22
+ retired = false;
21
23
  get observing() {
22
24
  return this.book !== undefined;
23
25
  }
26
+ get active() {
27
+ return this.observing && !this.retired;
28
+ }
24
29
  constructor(runId, book, gap, from = 0) {
25
30
  this.runId = runId;
26
31
  this.book = book;
@@ -33,6 +38,7 @@ export class EngineReadSourceCapture {
33
38
  this.gaps.add(gap);
34
39
  }
35
40
  retire() {
41
+ this.retired = true;
36
42
  this.book?.retire();
37
43
  }
38
44
  seal(to) {
@@ -42,19 +48,13 @@ export class EngineReadSourceCapture {
42
48
  this.retire();
43
49
  }
44
50
  snapshot(to, redact = false) {
51
+ if (redact)
52
+ return redactReadSources(this.snapshot(to));
45
53
  if (this.sealed && !redact)
46
54
  return this.sealed;
47
55
  const gaps = new Set(this.gaps);
48
- if (redact)
49
- gaps.add('redacted-source-export');
50
- const record = redact ? undefined : this.book?.snapshot();
51
- const status = !record
52
- ? 'unknown'
53
- : record.status === 'failed'
54
- ? 'failed'
55
- : record.status !== 'captured' || gaps.size > 0
56
- ? 'partial'
57
- : 'captured';
56
+ const record = this.book?.snapshot();
57
+ const status = readSourceStatus(record, gaps.size);
58
58
  return Object.freeze({
59
59
  version: 1,
60
60
  runId: this.runId,
@@ -75,4 +75,25 @@ export function withReadSources(note, sources) {
75
75
  limitations: Object.freeze(note.limitations.filter((gap) => gap !== 'read-sources-not-collected')),
76
76
  });
77
77
  }
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsMEZBQTBGO0FBQzFGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHdCQUF3QjtJQUN4QiwwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLDZCQUE2QjtJQUM3Qix1QkFBdUI7SUFDdkIsd0JBQXdCO0NBQ2hCLENBQUMsQ0FBQztBQXdCWiw2R0FBNkc7QUFDN0csTUFBTSxPQUFPLHVCQUF1QjtJQVF2QjtJQUNRO0lBRVI7SUFWTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUFDNUMsTUFBTSxDQUFxQjtJQUNuQyxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxZQUNXLEtBQWEsRUFDTCxJQUF1QixFQUN4QyxHQUFzQixFQUNiLE9BQU8sQ0FBQztRQUhSLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDTCxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUUvQixTQUFJLEdBQUosSUFBSSxDQUFJO1FBRWpCLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBcUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLENBQUMsRUFBVTtRQUNiLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELFFBQVEsQ0FBQyxFQUFVLEVBQUUsTUFBTSxHQUFHLEtBQUs7UUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTTtZQUNwQixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7b0JBQy9DLENBQUMsQ0FBQyxTQUFTO29CQUNYLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDZixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUM7WUFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsV0FBVyxFQUFFLGFBQWE7WUFDMUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUMvQyxNQUFNO1lBQ04sV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRCw4RkFBOEY7QUFDOUYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUF1QixFQUFFLE9BQTBCO0lBQ2pGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQixHQUFHLElBQUk7UUFDUCxPQUFPLEVBQUUsQ0FBQztRQUNWLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyw0QkFBNEIsQ0FBQyxDQUFDO0tBQ25HLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlYWRTb3VyY2VSZWNvcmQsIFJlYWRTb3VyY2VTbmFwc2hvdCB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQ2FwdHVyZUNoYW5uZWxTdGF0dXMsIE5hdGl2ZUNhcHR1cmVOb3RlIH0gZnJvbSAnLi9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5cbi8qKiBFbmdpbmUgY292ZXJhZ2Ugb25seS4gU291cmNlIGRlc2NyaXB0b3JzIGFuZCB0aGVpciBjb2RlYyBiZWxvbmcgdG8gZm9vdHRyYWNlL3dyaXRlLiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9MSU1JVEFUSU9OUyA9IE9iamVjdC5mcmVlemUoW1xuICAncHJpdmFjeS1hY3RpdmUnLFxuICAnaWRlbnRpdHktdW5hdmFpbGFibGUnLFxuICAndW50cmFja2VkLXJlYWQnLFxuICAnY3VzdG9tLXNjb3BlJyxcbiAgJ2NoaWxkLXNvdXJjZS1vd25lcnNoaXAnLFxuICAncmVzdW1lZC1zb3VyY2Utb3duZXJzaGlwJyxcbiAgJ3Npbmstc291cmNlLXVuc3VwcG9ydGVkJyxcbiAgJ3NvdXJjZS1oaXN0b3J5LW5vdC1pbmNsdWRlZCcsXG4gICdzb3VyY2UtY2FwdHVyZS1mYWlsZWQnLFxuICAncmVkYWN0ZWQtc291cmNlLWV4cG9ydCcsXG5dIGFzIGNvbnN0KTtcbmV4cG9ydCB0eXBlIFNvdXJjZUxpbWl0YXRpb24gPSAodHlwZW9mIFNPVVJDRV9MSU1JVEFUSU9OUylbbnVtYmVyXTtcblxuLyoqIFBhY2tldCAzIGlzIGFuIGluLW1lbW9yeSBvYnNlcnZhdGlvbiwgbm90IGEgc3RvcmVkLWhpc3RvcnkgYWNrbm93bGVkZ2VtZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmdpbmVSZWFkU291cmNlcyB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDE7XG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNpc3RlbmNlOiAnbWVtb3J5LW9ubHknO1xuICByZWFkb25seSBjb21taXRzOiB7IHJlYWRvbmx5IGZyb206IG51bWJlcjsgcmVhZG9ubHkgdG86IG51bWJlciB9O1xuICByZWFkb25seSBzdGF0dXM6IENhcHR1cmVDaGFubmVsU3RhdHVzO1xuICByZWFkb25seSBsaW1pdGF0aW9uczogcmVhZG9ubHkgU291cmNlTGltaXRhdGlvbltdO1xuICAvKiogQWJzZW50IG1lYW5zIHVua25vd24gb3duZXJzaGlwLCBuZXZlciBhbiBvYnNlcnZlZC1lbXB0eSBib29rLiAqL1xuICByZWFkb25seSByZWNvcmQ/OiBSZWFkU291cmNlU25hcHNob3Q7XG59XG5cbi8qKiBBIG5ldyBkaXNjcmltaW5hbnQgcHJldmVudHMgc3RyaWN0IHYxIHJlYWRlcnMgZnJvbSBhY2NlcHRpbmcgbmV3IGNvbXBsZXRlbmVzcyBjbGFpbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdGl2ZVJlYWRDYXB0dXJlTm90ZSBleHRlbmRzIE9taXQ8TmF0aXZlQ2FwdHVyZU5vdGUsICd2ZXJzaW9uJyB8ICdjaGFubmVscyc+IHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogMjtcbiAgcmVhZG9ubHkgY2hhbm5lbHM6IE9taXQ8TmF0aXZlQ2FwdHVyZU5vdGVbJ2NoYW5uZWxzJ10sICdyZWFkU291cmNlcyc+ICYge1xuICAgIHJlYWRvbmx5IHJlYWRTb3VyY2VzOiBDYXB0dXJlQ2hhbm5lbFN0YXR1cztcbiAgfTtcbn1cbmV4cG9ydCB0eXBlIE5hdGl2ZUNhcHR1cmVPYnNlcnZhdGlvbiA9IE5hdGl2ZUNhcHR1cmVOb3RlIHwgTmF0aXZlUmVhZENhcHR1cmVOb3RlO1xuXG4vKiogT25lIG93bmVyIHBlciBydW50aW1lL2xlZzsgcHJvcGFnYXRlZCBvbmx5IHRvIGZyYW1lcyBpbiB0aGF0IGxvZy4gTmV2ZXIgcmVhZHMgdmFsdWVzIG9yIHNjYW5zIGNvbW1pdHMuICovXG5leHBvcnQgY2xhc3MgRW5naW5lUmVhZFNvdXJjZUNhcHR1cmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGdhcHMgPSBuZXcgU2V0PFNvdXJjZUxpbWl0YXRpb24+KCk7XG4gIHByaXZhdGUgc2VhbGVkPzogRW5naW5lUmVhZFNvdXJjZXM7XG4gIGdldCBvYnNlcnZpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYm9vayAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2s/OiBSZWFkU291cmNlUmVjb3JkLFxuICAgIGdhcD86IFNvdXJjZUxpbWl0YXRpb24sXG4gICAgcmVhZG9ubHkgZnJvbSA9IDAsXG4gICkge1xuICAgIGlmIChnYXApIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIGxpbWl0KGdhcDogU291cmNlTGltaXRhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFsZWQpIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIHJldGlyZSgpOiB2b2lkIHtcbiAgICB0aGlzLmJvb2s/LnJldGlyZSgpO1xuICB9XG5cbiAgc2VhbCh0bzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhbGVkKSByZXR1cm47XG4gICAgdGhpcy5zZWFsZWQgPSB0aGlzLnNuYXBzaG90KHRvKTtcbiAgICB0aGlzLnJldGlyZSgpO1xuICB9XG5cbiAgc25hcHNob3QodG86IG51bWJlciwgcmVkYWN0ID0gZmFsc2UpOiBFbmdpbmVSZWFkU291cmNlcyB7XG4gICAgaWYgKHRoaXMuc2VhbGVkICYmICFyZWRhY3QpIHJldHVybiB0aGlzLnNlYWxlZDtcbiAgICBjb25zdCBnYXBzID0gbmV3IFNldCh0aGlzLmdhcHMpO1xuICAgIGlmIChyZWRhY3QpIGdhcHMuYWRkKCdyZWRhY3RlZC1zb3VyY2UtZXhwb3J0Jyk7XG4gICAgY29uc3QgcmVjb3JkID0gcmVkYWN0ID8gdW5kZWZpbmVkIDogdGhpcy5ib29rPy5zbmFwc2hvdCgpO1xuICAgIGNvbnN0IHN0YXR1cyA9ICFyZWNvcmRcbiAgICAgID8gJ3Vua25vd24nXG4gICAgICA6IHJlY29yZC5zdGF0dXMgPT09ICdmYWlsZWQnXG4gICAgICA/ICdmYWlsZWQnXG4gICAgICA6IHJlY29yZC5zdGF0dXMgIT09ICdjYXB0dXJlZCcgfHwgZ2Fwcy5zaXplID4gMFxuICAgICAgPyAncGFydGlhbCdcbiAgICAgIDogJ2NhcHR1cmVkJztcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBwZXJzaXN0ZW5jZTogJ21lbW9yeS1vbmx5JyxcbiAgICAgIGNvbW1pdHM6IE9iamVjdC5mcmVlemUoeyBmcm9tOiB0aGlzLmZyb20sIHRvIH0pLFxuICAgICAgc3RhdHVzLFxuICAgICAgbGltaXRhdGlvbnM6IE9iamVjdC5mcmVlemUoWy4uLmdhcHNdKSxcbiAgICAgIC4uLihyZWNvcmQgJiYgeyByZWNvcmQgfSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEtlZXAgdGhlIHYxIHByb2R1Y2VyIHVuY2hhbmdlZC4gT25seSBleHBsaWNpdGx5IGVuYWJsZWQgc291cmNlIG9ic2VydmF0aW9ucyBhY3F1aXJlIHYyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZWFkU291cmNlcyhub3RlOiBOYXRpdmVDYXB0dXJlTm90ZSwgc291cmNlczogRW5naW5lUmVhZFNvdXJjZXMpOiBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLi4ubm90ZSxcbiAgICB2ZXJzaW9uOiAyLFxuICAgIGNoYW5uZWxzOiBPYmplY3QuZnJlZXplKHsgLi4ubm90ZS5jaGFubmVscywgcmVhZFNvdXJjZXM6IHNvdXJjZXMuc3RhdHVzIH0pLFxuICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKG5vdGUubGltaXRhdGlvbnMuZmlsdGVyKChnYXApID0+IGdhcCAhPT0gJ3JlYWQtc291cmNlcy1ub3QtY29sbGVjdGVkJykpLFxuICB9KTtcbn1cbiJdfQ==
78
+ /** One status rule shared by native observations and stored admission; storage cannot upgrade coverage. */
79
+ export function readSourceStatus(record, limitations) {
80
+ return !record
81
+ ? 'unknown'
82
+ : record.status === 'failed'
83
+ ? 'failed'
84
+ : record.status !== 'captured' || limitations > 0
85
+ ? 'partial'
86
+ : 'captured';
87
+ }
88
+ /** Redacted exports withhold every reference, including those captured before a later privacy mark. */
89
+ export function redactReadSources(source) {
90
+ return Object.freeze({
91
+ version: source.version,
92
+ runId: source.runId,
93
+ persistence: source.persistence,
94
+ commits: source.commits,
95
+ status: 'unknown',
96
+ limitations: Object.freeze([...new Set([...source.limitations, 'redacted-source-export'])]),
97
+ });
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsMEZBQTBGO0FBQzFGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHdCQUF3QjtJQUN4Qiw0QkFBNEI7SUFDNUIsMEJBQTBCO0lBQzFCLHlCQUF5QjtJQUN6Qiw2QkFBNkI7SUFDN0IsdUJBQXVCO0lBQ3ZCLHdCQUF3QjtDQUNoQixDQUFDLENBQUM7QUF3QlosNkdBQTZHO0FBQzdHLE1BQU0sT0FBTyx1QkFBdUI7SUFhdkI7SUFDUTtJQUVSO0lBZk0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQzVDLE1BQU0sQ0FBcUI7SUFDM0IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUNXLEtBQWEsRUFDTCxJQUF1QixFQUN4QyxHQUFzQixFQUNiLE9BQU8sQ0FBQztRQUhSLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDTCxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUUvQixTQUFJLEdBQUosSUFBSSxDQUFJO1FBRWpCLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBcUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFB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SztRQUNuQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7UUFDL0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSx3QkFBaUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyRyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWFkU291cmNlUmVjb3JkLCBSZWFkU291cmNlU25hcHNob3QgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IENhcHR1cmVDaGFubmVsU3RhdHVzLCBOYXRpdmVDYXB0dXJlTm90ZSB9IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuXG4vKiogRW5naW5lIGNvdmVyYWdlIG9ubHkuIFNvdXJjZSBkZXNjcmlwdG9ycyBhbmQgdGhlaXIgY29kZWMgYmVsb25nIHRvIGZvb3R0cmFjZS93cml0ZS4gKi9cbmV4cG9ydCBjb25zdCBTT1VSQ0VfTElNSVRBVElPTlMgPSBPYmplY3QuZnJlZXplKFtcbiAgJ3ByaXZhY3ktYWN0aXZlJyxcbiAgJ2lkZW50aXR5LXVuYXZhaWxhYmxlJyxcbiAgJ3VudHJhY2tlZC1yZWFkJyxcbiAgJ2N1c3RvbS1zY29wZScsXG4gICdjaGlsZC1zb3VyY2Utb3duZXJzaGlwJyxcbiAgJ3NvdXJjZS1hZGRyZXNzLXVuc3VwcG9ydGVkJyxcbiAgJ3Jlc3VtZWQtc291cmNlLW93bmVyc2hpcCcsXG4gICdzaW5rLXNvdXJjZS11bnN1cHBvcnRlZCcsXG4gICdzb3VyY2UtaGlzdG9yeS1ub3QtaW5jbHVkZWQnLFxuICAnc291cmNlLWNhcHR1cmUtZmFpbGVkJyxcbiAgJ3JlZGFjdGVkLXNvdXJjZS1leHBvcnQnLFxuXSBhcyBjb25zdCk7XG5leHBvcnQgdHlwZSBTb3VyY2VMaW1pdGF0aW9uID0gKHR5cGVvZiBTT1VSQ0VfTElNSVRBVElPTlMpW251bWJlcl07XG5cbi8qKiBQYWNrZXQgMyBpcyBhbiBpbi1tZW1vcnkgb2JzZXJ2YXRpb24sIG5vdCBhIHN0b3JlZC1oaXN0b3J5IGFja25vd2xlZGdlbWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5naW5lUmVhZFNvdXJjZXMge1xuICByZWFkb25seSB2ZXJzaW9uOiAxO1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwZXJzaXN0ZW5jZTogJ21lbW9yeS1vbmx5JztcbiAgcmVhZG9ubHkgY29tbWl0czogeyByZWFkb25seSBmcm9tOiBudW1iZXI7IHJlYWRvbmx5IHRvOiBudW1iZXIgfTtcbiAgcmVhZG9ubHkgc3RhdHVzOiBDYXB0dXJlQ2hhbm5lbFN0YXR1cztcbiAgcmVhZG9ubHkgbGltaXRhdGlvbnM6IHJlYWRvbmx5IFNvdXJjZUxpbWl0YXRpb25bXTtcbiAgLyoqIEFic2VudCBtZWFucyB1bmtub3duIG93bmVyc2hpcCwgbmV2ZXIgYW4gb2JzZXJ2ZWQtZW1wdHkgYm9vay4gKi9cbiAgcmVhZG9ubHkgcmVjb3JkPzogUmVhZFNvdXJjZVNuYXBzaG90O1xufVxuXG4vKiogQSBuZXcgZGlzY3JpbWluYW50IHByZXZlbnRzIHN0cmljdCB2MSByZWFkZXJzIGZyb20gYWNjZXB0aW5nIG5ldyBjb21wbGV0ZW5lc3MgY2xhaW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUgZXh0ZW5kcyBPbWl0PE5hdGl2ZUNhcHR1cmVOb3RlLCAndmVyc2lvbicgfCAnY2hhbm5lbHMnPiB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDI7XG4gIHJlYWRvbmx5IGNoYW5uZWxzOiBPbWl0PE5hdGl2ZUNhcHR1cmVOb3RlWydjaGFubmVscyddLCAncmVhZFNvdXJjZXMnPiAmIHtcbiAgICByZWFkb25seSByZWFkU291cmNlczogQ2FwdHVyZUNoYW5uZWxTdGF0dXM7XG4gIH07XG59XG5leHBvcnQgdHlwZSBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24gPSBOYXRpdmVDYXB0dXJlTm90ZSB8IE5hdGl2ZVJlYWRDYXB0dXJlTm90ZTtcblxuLyoqIE9uZSBvd25lciBwZXIgcnVudGltZS9sZWc7IHByb3BhZ2F0ZWQgb25seSB0byBmcmFtZXMgaW4gdGhhdCBsb2cuIE5ldmVyIHJlYWRzIHZhbHVlcyBvciBzY2FucyBjb21taXRzLiAqL1xuZXhwb3J0IGNsYXNzIEVuZ2luZVJlYWRTb3VyY2VDYXB0dXJlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnYXBzID0gbmV3IFNldDxTb3VyY2VMaW1pdGF0aW9uPigpO1xuICBwcml2YXRlIHNlYWxlZD86IEVuZ2luZVJlYWRTb3VyY2VzO1xuICBwcml2YXRlIHJldGlyZWQgPSBmYWxzZTtcbiAgZ2V0IG9ic2VydmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ib29rICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmluZyAmJiAhdGhpcy5yZXRpcmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2s/OiBSZWFkU291cmNlUmVjb3JkLFxuICAgIGdhcD86IFNvdXJjZUxpbWl0YXRpb24sXG4gICAgcmVhZG9ubHkgZnJvbSA9IDAsXG4gICkge1xuICAgIGlmIChnYXApIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIGxpbWl0KGdhcDogU291cmNlTGltaXRhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFsZWQpIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIHJldGlyZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJldGlyZWQgPSB0cnVlO1xuICAgIHRoaXMuYm9vaz8ucmV0aXJlKCk7XG4gIH1cblxuICBzZWFsKHRvOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWFsZWQpIHJldHVybjtcbiAgICB0aGlzLnNlYWxlZCA9IHRoaXMuc25hcHNob3QodG8pO1xuICAgIHRoaXMucmV0aXJlKCk7XG4gIH1cblxuICBzbmFwc2hvdCh0bzogbnVtYmVyLCByZWRhY3QgPSBmYWxzZSk6IEVuZ2luZVJlYWRTb3VyY2VzIHtcbiAgICBpZiAocmVkYWN0KSByZXR1cm4gcmVkYWN0UmVhZFNvdXJjZXModGhpcy5zbmFwc2hvdCh0bykpO1xuICAgIGlmICh0aGlzLnNlYWxlZCAmJiAhcmVkYWN0KSByZXR1cm4gdGhpcy5zZWFsZWQ7XG4gICAgY29uc3QgZ2FwcyA9IG5ldyBTZXQodGhpcy5nYXBzKTtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmJvb2s/LnNuYXBzaG90KCk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmVhZFNvdXJjZVN0YXR1cyhyZWNvcmQsIGdhcHMuc2l6ZSk7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgcGVyc2lzdGVuY2U6ICdtZW1vcnktb25seScsXG4gICAgICBjb21taXRzOiBPYmplY3QuZnJlZXplKHsgZnJvbTogdGhpcy5mcm9tLCB0byB9KSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKFsuLi5nYXBzXSksXG4gICAgICAuLi4ocmVjb3JkICYmIHsgcmVjb3JkIH0pLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBLZWVwIHRoZSB2MSBwcm9kdWNlciB1bmNoYW5nZWQuIE9ubHkgZXhwbGljaXRseSBlbmFibGVkIHNvdXJjZSBvYnNlcnZhdGlvbnMgYWNxdWlyZSB2Mi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVhZFNvdXJjZXMobm90ZTogTmF0aXZlQ2FwdHVyZU5vdGUsIHNvdXJjZXM6IEVuZ2luZVJlYWRTb3VyY2VzKTogTmF0aXZlUmVhZENhcHR1cmVOb3RlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIC4uLm5vdGUsXG4gICAgdmVyc2lvbjogMixcbiAgICBjaGFubmVsczogT2JqZWN0LmZyZWV6ZSh7IC4uLm5vdGUuY2hhbm5lbHMsIHJlYWRTb3VyY2VzOiBzb3VyY2VzLnN0YXR1cyB9KSxcbiAgICBsaW1pdGF0aW9uczogT2JqZWN0LmZyZWV6ZShub3RlLmxpbWl0YXRpb25zLmZpbHRlcigoZ2FwKSA9PiBnYXAgIT09ICdyZWFkLXNvdXJjZXMtbm90LWNvbGxlY3RlZCcpKSxcbiAgfSk7XG59XG5cbi8qKiBPbmUgc3RhdHVzIHJ1bGUgc2hhcmVkIGJ5IG5hdGl2ZSBvYnNlcnZhdGlvbnMgYW5kIHN0b3JlZCBhZG1pc3Npb247IHN0b3JhZ2UgY2Fubm90IHVwZ3JhZGUgY292ZXJhZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNvdXJjZVN0YXR1cyhyZWNvcmQ6IFJlYWRTb3VyY2VTbmFwc2hvdCB8IHVuZGVmaW5lZCwgbGltaXRhdGlvbnM6IG51bWJlcik6IENhcHR1cmVDaGFubmVsU3RhdHVzIHtcbiAgcmV0dXJuICFyZWNvcmRcbiAgICA/ICd1bmtub3duJ1xuICAgIDogcmVjb3JkLnN0YXR1cyA9PT0gJ2ZhaWxlZCdcbiAgICA/ICdmYWlsZWQnXG4gICAgOiByZWNvcmQuc3RhdHVzICE9PSAnY2FwdHVyZWQnIHx8IGxpbWl0YXRpb25zID4gMFxuICAgID8gJ3BhcnRpYWwnXG4gICAgOiAnY2FwdHVyZWQnO1xufVxuXG4vKiogUmVkYWN0ZWQgZXhwb3J0cyB3aXRoaG9sZCBldmVyeSByZWZlcmVuY2UsIGluY2x1ZGluZyB0aG9zZSBjYXB0dXJlZCBiZWZvcmUgYSBsYXRlciBwcml2YWN5IG1hcmsuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0UmVhZFNvdXJjZXMoc291cmNlOiBFbmdpbmVSZWFkU291cmNlcyk6IEVuZ2luZVJlYWRTb3VyY2VzIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIHZlcnNpb246IHNvdXJjZS52ZXJzaW9uLFxuICAgIHJ1bklkOiBzb3VyY2UucnVuSWQsXG4gICAgcGVyc2lzdGVuY2U6IHNvdXJjZS5wZXJzaXN0ZW5jZSxcbiAgICBjb21taXRzOiBzb3VyY2UuY29tbWl0cyxcbiAgICBzdGF0dXM6ICd1bmtub3duJyxcbiAgICBsaW1pdGF0aW9uczogT2JqZWN0LmZyZWV6ZShbLi4ubmV3IFNldChbLi4uc291cmNlLmxpbWl0YXRpb25zLCAncmVkYWN0ZWQtc291cmNlLWV4cG9ydCcgYXMgY29uc3RdKV0pLFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `value`, settled ONCE into `onValue` / `onError` — never through the value's own `then`: a native promise is
3
+ * watched through the real `Promise.prototype.then` (an own `then` on it is not trusted, so its rejection is always
4
+ * handled), any other thenable adopted into a fresh promise. A plain value is a fulfilment.
5
+ */
6
+ export declare function settleOnce<T>(value: unknown, onValue: () => T, onError: (error: unknown) => T): Promise<T>;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `value`, settled ONCE into `onValue` / `onError` — never through the value's own `then`: a native promise is
3
+ * watched through the real `Promise.prototype.then` (an own `then` on it is not trusted, so its rejection is always
4
+ * handled), any other thenable adopted into a fresh promise. A plain value is a fulfilment.
5
+ */
6
+ export function settleOnce(value, onValue, onError) {
7
+ const adopted = value instanceof Promise ? value : new Promise((resolve) => resolve(value));
8
+ return Promise.prototype.then.call(adopted, onValue, onError);
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lua1NldHRsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvc2lua1NldHRsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUksS0FBYyxFQUFFLE9BQWdCLEVBQUUsT0FBOEI7SUFDNUYsTUFBTSxPQUFPLEdBQXFCLEtBQUssWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlHLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFlLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYHZhbHVlYCwgc2V0dGxlZCBPTkNFIGludG8gYG9uVmFsdWVgIC8gYG9uRXJyb3JgIOKAlCBuZXZlciB0aHJvdWdoIHRoZSB2YWx1ZSdzIG93biBgdGhlbmA6IGEgbmF0aXZlIHByb21pc2UgaXNcbiAqIHdhdGNoZWQgdGhyb3VnaCB0aGUgcmVhbCBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgKGFuIG93biBgdGhlbmAgb24gaXQgaXMgbm90IHRydXN0ZWQsIHNvIGl0cyByZWplY3Rpb24gaXMgYWx3YXlzXG4gKiBoYW5kbGVkKSwgYW55IG90aGVyIHRoZW5hYmxlIGFkb3B0ZWQgaW50byBhIGZyZXNoIHByb21pc2UuIEEgcGxhaW4gdmFsdWUgaXMgYSBmdWxmaWxtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dGxlT25jZTxUPih2YWx1ZTogdW5rbm93biwgb25WYWx1ZTogKCkgPT4gVCwgb25FcnJvcjogKGVycm9yOiB1bmtub3duKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGFkb3B0ZWQ6IFByb21pc2U8dW5rbm93bj4gPSB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgPyB2YWx1ZSA6IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHZhbHVlKSk7XG4gIHJldHVybiBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwoYWRvcHRlZCwgb25WYWx1ZSwgb25FcnJvcikgYXMgUHJvbWlzZTxUPjtcbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import type { ReadSource } from 'foottrace/write';
2
+ /** Native per-execution totals, independent of last-value retention and the bounded source book. */
3
+ export interface SourceReadCounts {
4
+ readonly observed: number;
5
+ readonly retained: number;
6
+ /** Counts the native writer's returned kinds, never classifies values or chooses sources. */
7
+ readonly kinds: Readonly<Record<ReadSource['kind'], number>>;
8
+ }
9
+ export declare const EMPTY_SOURCE_READ_COUNTS: SourceReadCounts;
10
+ /** Fixed scalar counters only; discarded attempts remain part of this execution's history. */
11
+ export declare class SourceReadCounter {
12
+ private observed;
13
+ private retained;
14
+ private kinds;
15
+ observe(): boolean;
16
+ retain(kind: ReadSource['kind']): void;
17
+ snapshot(): SourceReadCounts;
18
+ }
@@ -0,0 +1,27 @@
1
+ export const EMPTY_SOURCE_READ_COUNTS = Object.freeze({
2
+ observed: 0,
3
+ retained: 0,
4
+ kinds: Object.freeze({ base: 0, committed: 0, staged: 0, unavailable: 0 }),
5
+ });
6
+ /** Fixed scalar counters only; discarded attempts remain part of this execution's history. */
7
+ export class SourceReadCounter {
8
+ observed = 0;
9
+ retained = 0;
10
+ kinds = { ...EMPTY_SOURCE_READ_COUNTS.kinds };
11
+ observe() {
12
+ if (this.observed === Number.MAX_SAFE_INTEGER)
13
+ return false;
14
+ this.observed++;
15
+ return true;
16
+ }
17
+ retain(kind) {
18
+ if (this.retained < this.observed) {
19
+ this.retained++;
20
+ this.kinds[kind]++;
21
+ }
22
+ }
23
+ snapshot() {
24
+ return Object.freeze({ observed: this.observed, retained: this.retained, kinds: Object.freeze({ ...this.kinds }) });
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlUmVhZENvdW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9zb3VyY2VSZWFkQ291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFxQixNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3RFLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzRSxDQUFDLENBQUM7QUFFSCw4RkFBOEY7QUFDOUYsTUFBTSxPQUFPLGlCQUFpQjtJQUNwQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNiLEtBQUssR0FBRyxFQUFFLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFdEQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsZ0JBQWdCO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUF3QjtRQUM3QixJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0SCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlYWRTb3VyY2UgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG4vKiogTmF0aXZlIHBlci1leGVjdXRpb24gdG90YWxzLCBpbmRlcGVuZGVudCBvZiBsYXN0LXZhbHVlIHJldGVudGlvbiBhbmQgdGhlIGJvdW5kZWQgc291cmNlIGJvb2suICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVJlYWRDb3VudHMge1xuICByZWFkb25seSBvYnNlcnZlZDogbnVtYmVyO1xuICByZWFkb25seSByZXRhaW5lZDogbnVtYmVyO1xuICAvKiogQ291bnRzIHRoZSBuYXRpdmUgd3JpdGVyJ3MgcmV0dXJuZWQga2luZHMsIG5ldmVyIGNsYXNzaWZpZXMgdmFsdWVzIG9yIGNob29zZXMgc291cmNlcy4gKi9cbiAgcmVhZG9ubHkga2luZHM6IFJlYWRvbmx5PFJlY29yZDxSZWFkU291cmNlWydraW5kJ10sIG51bWJlcj4+O1xufVxuXG5leHBvcnQgY29uc3QgRU1QVFlfU09VUkNFX1JFQURfQ09VTlRTOiBTb3VyY2VSZWFkQ291bnRzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG9ic2VydmVkOiAwLFxuICByZXRhaW5lZDogMCxcbiAga2luZHM6IE9iamVjdC5mcmVlemUoeyBiYXNlOiAwLCBjb21taXR0ZWQ6IDAsIHN0YWdlZDogMCwgdW5hdmFpbGFibGU6IDAgfSksXG59KTtcblxuLyoqIEZpeGVkIHNjYWxhciBjb3VudGVycyBvbmx5OyBkaXNjYXJkZWQgYXR0ZW1wdHMgcmVtYWluIHBhcnQgb2YgdGhpcyBleGVjdXRpb24ncyBoaXN0b3J5LiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVJlYWRDb3VudGVyIHtcbiAgcHJpdmF0ZSBvYnNlcnZlZCA9IDA7XG4gIHByaXZhdGUgcmV0YWluZWQgPSAwO1xuICBwcml2YXRlIGtpbmRzID0geyAuLi5FTVBUWV9TT1VSQ0VfUkVBRF9DT1VOVFMua2luZHMgfTtcblxuICBvYnNlcnZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm9ic2VydmVkID09PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMub2JzZXJ2ZWQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldGFpbihraW5kOiBSZWFkU291cmNlWydraW5kJ10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXRhaW5lZCA8IHRoaXMub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMucmV0YWluZWQrKztcbiAgICAgIHRoaXMua2luZHNba2luZF0rKztcbiAgICB9XG4gIH1cblxuICBzbmFwc2hvdCgpOiBTb3VyY2VSZWFkQ291bnRzIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IG9ic2VydmVkOiB0aGlzLm9ic2VydmVkLCByZXRhaW5lZDogdGhpcy5yZXRhaW5lZCwga2luZHM6IE9iamVjdC5mcmVlemUoeyAuLi50aGlzLmtpbmRzIH0pIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,10 @@
1
+ import type { CommitBundle } from 'foottrace';
2
+ /** Conservative work cap before each distinct public value query, including shared-root replay/cloning. */
3
+ export declare class SourceReferenceBudget {
4
+ private rows;
5
+ private bytes;
6
+ private readonly queryRows;
7
+ private readonly queryBytes;
8
+ constructor(commitLog: readonly CommitBundle[], initialState?: Record<string, unknown>);
9
+ spend(): void;
10
+ }