@actuarial-ts/compliance 0.6.0 → 0.7.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 (83) hide show
  1. package/README.md +19 -9
  2. package/dist/bundle.d.ts +1 -1
  3. package/dist/bundle.d.ts.map +1 -1
  4. package/dist/bundle.js +163 -21
  5. package/dist/bundle.js.map +1 -1
  6. package/dist/diagnosticArtifactStream.d.ts +30 -0
  7. package/dist/diagnosticArtifactStream.d.ts.map +1 -0
  8. package/dist/diagnosticArtifactStream.js +128 -0
  9. package/dist/diagnosticArtifactStream.js.map +1 -0
  10. package/dist/diagnosticByteSource.d.ts +10 -0
  11. package/dist/diagnosticByteSource.d.ts.map +1 -0
  12. package/dist/diagnosticByteSource.js +70 -0
  13. package/dist/diagnosticByteSource.js.map +1 -0
  14. package/dist/diagnosticByteView.d.ts +3 -0
  15. package/dist/diagnosticByteView.d.ts.map +1 -0
  16. package/dist/diagnosticByteView.js +27 -0
  17. package/dist/diagnosticByteView.js.map +1 -0
  18. package/dist/diagnosticCompactRun.d.ts +43 -0
  19. package/dist/diagnosticCompactRun.d.ts.map +1 -0
  20. package/dist/diagnosticCompactRun.js +253 -0
  21. package/dist/diagnosticCompactRun.js.map +1 -0
  22. package/dist/diagnosticReplayFrames.d.ts +10 -0
  23. package/dist/diagnosticReplayFrames.d.ts.map +1 -0
  24. package/dist/diagnosticReplayFrames.js +99 -0
  25. package/dist/diagnosticReplayFrames.js.map +1 -0
  26. package/dist/diagnosticReplayProtocol.d.ts +17 -0
  27. package/dist/diagnosticReplayProtocol.d.ts.map +1 -0
  28. package/dist/diagnosticReplayProtocol.js +98 -0
  29. package/dist/diagnosticReplayProtocol.js.map +1 -0
  30. package/dist/diagnosticReplayReader.d.ts +41 -0
  31. package/dist/diagnosticReplayReader.d.ts.map +1 -0
  32. package/dist/diagnosticReplayReader.js +346 -0
  33. package/dist/diagnosticReplayReader.js.map +1 -0
  34. package/dist/diagnosticReplayValue.d.ts +34 -0
  35. package/dist/diagnosticReplayValue.d.ts.map +1 -0
  36. package/dist/diagnosticReplayValue.js +269 -0
  37. package/dist/diagnosticReplayValue.js.map +1 -0
  38. package/dist/diagnosticReplayWriter.d.ts +25 -0
  39. package/dist/diagnosticReplayWriter.d.ts.map +1 -0
  40. package/dist/diagnosticReplayWriter.js +148 -0
  41. package/dist/diagnosticReplayWriter.js.map +1 -0
  42. package/dist/diagnosticRun.d.ts +52 -29
  43. package/dist/diagnosticRun.d.ts.map +1 -1
  44. package/dist/diagnosticRun.js +564 -174
  45. package/dist/diagnosticRun.js.map +1 -1
  46. package/dist/diagnosticRunEvidence.d.ts +18 -0
  47. package/dist/diagnosticRunEvidence.d.ts.map +1 -0
  48. package/dist/diagnosticRunEvidence.js +195 -0
  49. package/dist/diagnosticRunEvidence.js.map +1 -0
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +4 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/ledger.d.ts.map +1 -1
  55. package/dist/ledger.js +47 -6
  56. package/dist/ledger.js.map +1 -1
  57. package/dist/metadata.d.ts.map +1 -1
  58. package/dist/metadata.js +27 -3
  59. package/dist/metadata.js.map +1 -1
  60. package/dist/sha256Stream.d.ts +6 -0
  61. package/dist/sha256Stream.d.ts.map +1 -0
  62. package/dist/sha256Stream.js +103 -0
  63. package/dist/sha256Stream.js.map +1 -0
  64. package/dist/version.d.ts +1 -1
  65. package/dist/version.js +1 -1
  66. package/package.json +6 -5
  67. package/src/bundle.ts +272 -32
  68. package/src/diagnosticArtifactStream.ts +148 -0
  69. package/src/diagnosticByteSource.ts +82 -0
  70. package/src/diagnosticByteView.ts +27 -0
  71. package/src/diagnosticCompactRun.ts +462 -0
  72. package/src/diagnosticReplayFrames.ts +99 -0
  73. package/src/diagnosticReplayProtocol.ts +99 -0
  74. package/src/diagnosticReplayReader.ts +428 -0
  75. package/src/diagnosticReplayValue.ts +269 -0
  76. package/src/diagnosticReplayWriter.ts +190 -0
  77. package/src/diagnosticRun.ts +1030 -93
  78. package/src/diagnosticRunEvidence.ts +391 -0
  79. package/src/index.ts +10 -0
  80. package/src/ledger.ts +59 -8
  81. package/src/metadata.ts +48 -7
  82. package/src/sha256Stream.ts +108 -0
  83. package/src/version.ts +1 -1
@@ -0,0 +1,98 @@
1
+ import { isDiagnosticPlainRecord, isDiagnosticToken } from "@actuarial-ts/core";
2
+ import { ComplianceError } from "./errors.js";
3
+ import { MAX_REPLAY_FRAME_BYTES } from "./diagnosticReplayFrames.js";
4
+ export const REPLAY_FORMAT = "diagnostic-replay";
5
+ export const REPLAY_VERSION = 1;
6
+ export const ARTIFACT_CHUNK_BYTES = 65_536;
7
+ export function badReplay(message) {
8
+ throw new ComplianceError("BAD_DIAGNOSTIC_RUN", message, "$.replay");
9
+ }
10
+ export function mismatch(message) {
11
+ throw new ComplianceError("DIAGNOSTIC_MISMATCH", message, "$.replay");
12
+ }
13
+ /** Snapshot host metadata once, without invoking accessors or caller methods. */
14
+ export function replayRecord(value, keys) {
15
+ if (!isDiagnosticPlainRecord(value))
16
+ badReplay("Expected a plain replay metadata object");
17
+ const result = Object.create(null);
18
+ for (const key of Reflect.ownKeys(value)) {
19
+ if (typeof key !== "string" || !keys.includes(key))
20
+ badReplay("Unknown replay metadata field");
21
+ const field = Object.getOwnPropertyDescriptor(value, key);
22
+ if (!field || !("value" in field) || !field.enumerable)
23
+ badReplay("Replay metadata must contain enumerable data properties");
24
+ result[key] = field.value;
25
+ }
26
+ return result;
27
+ }
28
+ export function replayArray(value) {
29
+ if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype)
30
+ badReplay("Expected a plain replay metadata array");
31
+ const length = Object.getOwnPropertyDescriptor(value, "length")?.value;
32
+ if (typeof length !== "number" || !Number.isSafeInteger(length) || length < 0)
33
+ badReplay("Invalid replay metadata array length");
34
+ for (const key of Reflect.ownKeys(value))
35
+ if (key !== "length" &&
36
+ (typeof key !== "string" || !/^(0|[1-9][0-9]*)$/.test(key) || Number(key) >= length))
37
+ badReplay("Unexpected replay array property");
38
+ const result = [];
39
+ for (let index = 0; index < length; index++) {
40
+ const field = Object.getOwnPropertyDescriptor(value, String(index));
41
+ if (!field || !("value" in field) || !field.enumerable)
42
+ badReplay("Replay array has a hole or accessor");
43
+ result.push(field.value);
44
+ }
45
+ return result;
46
+ }
47
+ export function replayToken(value) {
48
+ if (!isDiagnosticToken(value))
49
+ badReplay("Expected a nonempty replay token with valid Unicode");
50
+ return value;
51
+ }
52
+ export function replayLimit(value, label) {
53
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 1)
54
+ badReplay(`${label} must be a positive safe integer`);
55
+ return value;
56
+ }
57
+ const signalAborted = Object.getOwnPropertyDescriptor(AbortSignal.prototype, "aborted").get;
58
+ const throwIfAborted = AbortSignal.prototype.throwIfAborted;
59
+ export function replayCancellation(signal) {
60
+ if (signal === undefined)
61
+ return () => { };
62
+ try {
63
+ signalAborted.call(signal);
64
+ }
65
+ catch {
66
+ badReplay("Replay signal must be an AbortSignal");
67
+ }
68
+ return () => throwIfAborted.call(signal);
69
+ }
70
+ /** Exactly the writer's bounded canonical flat-frame bytes, including newline. */
71
+ export function replayFrameBytes(frame) {
72
+ const bytes = new TextEncoder().encode(`${JSON.stringify(frame)}\n`);
73
+ if (bytes.byteLength > MAX_REPLAY_FRAME_BYTES)
74
+ badReplay("Replay frame exceeds its byte limit");
75
+ return bytes;
76
+ }
77
+ export function encodeArtifactChunk(bytes) {
78
+ let binary = "";
79
+ for (const byte of bytes)
80
+ binary += String.fromCharCode(byte);
81
+ return btoa(binary);
82
+ }
83
+ export function decodeArtifactChunk(value) {
84
+ if (typeof value !== "string" ||
85
+ !value.length ||
86
+ value.length > 87_384 ||
87
+ value.length % 4 ||
88
+ !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value))
89
+ badReplay("Invalid bounded artifact base64 chunk");
90
+ const binary = atob(value);
91
+ if (binary.length > ARTIFACT_CHUNK_BYTES || btoa(binary) !== value)
92
+ badReplay("Artifact base64 must use canonical padding bits and bounded chunks");
93
+ const bytes = new Uint8Array(binary.length);
94
+ for (let index = 0; index < binary.length; index++)
95
+ bytes[index] = binary.charCodeAt(index);
96
+ return bytes;
97
+ }
98
+ //# sourceMappingURL=diagnosticReplayProtocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticReplayProtocol.js","sourceRoot":"","sources":["../src/diagnosticReplayProtocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { DiagnosticArtifactDigest, DiagnosticRunIdentity } from "./diagnosticRun.js";
2
+ import type { DiagnosticReplayByteSource } from "./diagnosticReplayWriter.js";
3
+ /** Host resource policy, not a representation of the SDK's tested capacity. */
4
+ export interface DiagnosticReplayReadLimits {
5
+ readonly maximumEncodedBytes: number;
6
+ readonly maximumArtifacts: number;
7
+ readonly maximumRuns: number;
8
+ readonly maximumArtifactBytes: number;
9
+ readonly maximumInputDepth: number;
10
+ readonly maximumInputNodes: number;
11
+ readonly maximumInputStringUnits: number;
12
+ readonly maximumInputTotalStringUnits: number;
13
+ }
14
+ export interface VerifyDiagnosticReplayStreamOptions {
15
+ readonly limits: DiagnosticReplayReadLimits;
16
+ readonly signal?: AbortSignal;
17
+ }
18
+ declare const verifiedReplayBrand: unique symbol;
19
+ export interface VerifiedDiagnosticReplayStream {
20
+ readonly [verifiedReplayBrand]: true;
21
+ readonly format: "diagnostic-replay";
22
+ readonly version: 1;
23
+ readonly artifacts: readonly DiagnosticArtifactDigest[];
24
+ readonly runs: readonly (DiagnosticRunIdentity & {
25
+ readonly id: string;
26
+ })[];
27
+ /** SHA-256 of canonical numbered frames before the final trailer; not a signature. */
28
+ readonly frameDigest: string;
29
+ }
30
+ /**
31
+ * Verify all bytes/evidence and independently replay every run, sequentially.
32
+ * Reads must be <=128 KiB. Required resource limits apply before retaining raw
33
+ * inputs; results/audits are compared as text, never reconstructed from a file.
34
+ * Only a final receipt is returned after trailer integrity AND EOF. Hosts must
35
+ * not treat a partially consumed stream as a valid archive. Cancellation is
36
+ * cooperative between chunks/phases; use the signal for host I/O as well.
37
+ */
38
+ export declare function verifyDiagnosticReplayStream(chunks: DiagnosticReplayByteSource, supplied: VerifyDiagnosticReplayStreamOptions): Promise<VerifiedDiagnosticReplayStream>;
39
+ export declare function assertVerifiedDiagnosticReplayStream(value: unknown): asserts value is VerifiedDiagnosticReplayStream;
40
+ export {};
41
+ //# sourceMappingURL=diagnosticReplayReader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticReplayReader.d.ts","sourceRoot":"","sources":["../src/diagnosticReplayReader.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,wBAAwB,EAExB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAgB9E,+EAA+E;AAC/E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;CAC/C;AACD,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AACD,OAAO,CAAC,MAAM,mBAAmB,EAAE,OAAO,MAAM,CAAC;AACjD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,qBAAqB,GAAG;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAC5E,sFAAsF;IACtF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAuPD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,0BAA0B,EAClC,QAAQ,EAAE,mCAAmC,GAC5C,OAAO,CAAC,8BAA8B,CAAC,CAkGzC;AAED,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,8BAA8B,CAGjD"}
@@ -0,0 +1,346 @@
1
+ import { iterateDiagnosticIdentityJson } from "@actuarial-ts/core";
2
+ import { runValidatedMetricDiagnosticsCompact, validateDiagnosticRunInputCompact, } from "@actuarial-ts/data";
3
+ import { digestDiagnosticArtifactChunks } from "./diagnosticArtifactStream.js";
4
+ import { createCompactDiagnosticRunIdentity, } from "./diagnosticCompactRun.js";
5
+ import { diagnosticByteView } from "./diagnosticByteView.js";
6
+ import { consumeDiagnosticByteSource } from "./diagnosticByteSource.js";
7
+ import { decodeReplayFrames, MAX_REPLAY_READ_BYTES, REPLAY_TEXT_UNITS, } from "./diagnosticReplayFrames.js";
8
+ import { ReplayValueBuilder } from "./diagnosticReplayValue.js";
9
+ import { createSha256 } from "./sha256Stream.js";
10
+ import { REPLAY_FORMAT, REPLAY_VERSION, badReplay, mismatch, replayArray, replayCancellation, replayFrameBytes, replayLimit, replayRecord, replayToken, decodeArtifactChunk, } from "./diagnosticReplayProtocol.js";
11
+ const verifiedStreams = new WeakSet();
12
+ class ReplayCursor {
13
+ iterator;
14
+ checkCancellation;
15
+ sequence = 0;
16
+ hash = createSha256();
17
+ constructor(iterator, checkCancellation) {
18
+ this.iterator = iterator;
19
+ this.checkCancellation = checkCancellation;
20
+ }
21
+ async next() {
22
+ this.checkCancellation();
23
+ const item = await this.iterator.next();
24
+ this.checkCancellation();
25
+ if (item.done)
26
+ badReplay("Replay ended before its required trailer or section boundary");
27
+ const frame = item.value;
28
+ if (frame.length < 2 ||
29
+ frame[0] !== this.sequence ||
30
+ !Number.isSafeInteger(frame[0]) ||
31
+ typeof frame[1] !== "string")
32
+ badReplay("Replay frame has an invalid sequence or event");
33
+ this.sequence++;
34
+ if (frame[1] !== "end")
35
+ this.hash.update(replayFrameBytes(frame));
36
+ return frame.slice(1);
37
+ }
38
+ digest() {
39
+ return this.hash.digest();
40
+ }
41
+ async requireEof() {
42
+ this.checkCancellation();
43
+ if (!(await this.iterator.next()).done)
44
+ badReplay("Unexpected frames after the replay trailer");
45
+ this.checkCancellation();
46
+ }
47
+ async close() {
48
+ await this.iterator.return(undefined);
49
+ }
50
+ }
51
+ function event(frame, name, arity) {
52
+ if (frame[0] !== name || frame.length !== arity)
53
+ badReplay(`Expected ${name} with exact arity ${arity}`);
54
+ }
55
+ async function readValue(cursor, ending, limits) {
56
+ const builder = new ReplayValueBuilder(limits);
57
+ for (;;) {
58
+ const frame = await cursor.next();
59
+ if (frame[0] === ending) {
60
+ event(frame, ending, 1);
61
+ return builder.finish();
62
+ }
63
+ builder.push(frame);
64
+ }
65
+ }
66
+ /** Compare complete expected canonical text with bounded candidate fragments. */
67
+ async function compareEvidence(cursor, channel, document) {
68
+ const expected = iterateDiagnosticIdentityJson(document);
69
+ let chunk = "", index = 0, position = 0, done = false;
70
+ function advance() {
71
+ while (!done && index === chunk.length) {
72
+ const item = expected.next();
73
+ done = Boolean(item.done);
74
+ chunk = item.done ? "" : item.value;
75
+ index = 0;
76
+ }
77
+ }
78
+ try {
79
+ for (;;) {
80
+ const frame = await cursor.next();
81
+ if (frame[0] === `${channel}-end`) {
82
+ event(frame, `${channel}-end`, 1);
83
+ advance();
84
+ if (!done)
85
+ mismatch(`${channel} evidence is truncated at code-unit offset ${position}`);
86
+ return;
87
+ }
88
+ event(frame, channel, 2);
89
+ const text = frame[1];
90
+ if (typeof text !== "string" || text.length === 0 || text.length > REPLAY_TEXT_UNITS)
91
+ badReplay("Invalid bounded canonical evidence fragment");
92
+ let start = 0;
93
+ while (start < text.length) {
94
+ advance();
95
+ if (done)
96
+ mismatch(`${channel} evidence has extra content at code-unit offset ${position}`);
97
+ const length = Math.min(text.length - start, chunk.length - index);
98
+ for (let offset = 0; offset < length; offset++)
99
+ if (text.charCodeAt(start + offset) !== chunk.charCodeAt(index + offset))
100
+ mismatch(`${channel} evidence differs at code-unit offset ${position + offset}`);
101
+ start += length;
102
+ index += length;
103
+ position += length;
104
+ }
105
+ }
106
+ }
107
+ finally {
108
+ expected.return(undefined);
109
+ }
110
+ }
111
+ function artifactMetadata(value) {
112
+ const item = replayRecord(value, [
113
+ "id",
114
+ "scope",
115
+ "assurance",
116
+ "algorithm",
117
+ "value",
118
+ "byteLength",
119
+ ]);
120
+ const id = replayToken(item.id);
121
+ if (item.scope !== "input" && item.scope !== "preparation")
122
+ badReplay("Invalid artifact scope");
123
+ const scope = item.scope;
124
+ if (item.assurance === "caller-declared") {
125
+ if (Object.hasOwn(item, "byteLength"))
126
+ badReplay("Declared artifact cannot claim a computed byte length");
127
+ return Object.freeze({
128
+ id,
129
+ scope,
130
+ assurance: "caller-declared",
131
+ algorithm: replayToken(item.algorithm),
132
+ value: replayToken(item.value),
133
+ });
134
+ }
135
+ if (item.assurance !== "sdk-computed" ||
136
+ item.algorithm !== "sha256" ||
137
+ typeof item.value !== "string" ||
138
+ !/^[a-f0-9]{64}$/.test(item.value) ||
139
+ typeof item.byteLength !== "number" ||
140
+ !Number.isSafeInteger(item.byteLength) ||
141
+ item.byteLength < 0)
142
+ badReplay("Invalid computed artifact digest metadata");
143
+ return Object.freeze({
144
+ id,
145
+ scope,
146
+ assurance: "sdk-computed",
147
+ algorithm: "sha256",
148
+ value: item.value,
149
+ byteLength: item.byteLength,
150
+ });
151
+ }
152
+ async function readArtifact(cursor, inputLimits, maximumArtifactBytes) {
153
+ const artifact = artifactMetadata(await readValue(cursor, "artifact-data", inputLimits));
154
+ if (artifact.assurance === "caller-declared") {
155
+ event(await cursor.next(), "artifact-end", 1);
156
+ return artifact;
157
+ }
158
+ async function* bytes() {
159
+ for (;;) {
160
+ const frame = await cursor.next();
161
+ if (frame[0] === "artifact-end") {
162
+ event(frame, "artifact-end", 1);
163
+ return;
164
+ }
165
+ event(frame, "bytes", 2);
166
+ yield decodeArtifactChunk(frame[1]);
167
+ }
168
+ }
169
+ const computed = await digestDiagnosticArtifactChunks({
170
+ id: artifact.id,
171
+ scope: artifact.scope,
172
+ expectedByteLength: artifact.byteLength,
173
+ maximumByteLength: maximumArtifactBytes,
174
+ }, bytes());
175
+ if (computed.value !== artifact.value)
176
+ mismatch(`Artifact ${artifact.id} bytes do not match its digest`);
177
+ return computed;
178
+ }
179
+ async function readRun(cursor, artifacts, used, limits) {
180
+ const item = replayRecord(await readValue(cursor, "input-end", limits), [
181
+ "id",
182
+ "input",
183
+ "inputArtifactIds",
184
+ "preparationArtifactIds",
185
+ "preparationLineage",
186
+ ]);
187
+ const id = replayToken(item.id);
188
+ function resolve(value, scope) {
189
+ const seen = new Set();
190
+ return replayArray(value).map((key) => {
191
+ const token = replayToken(key);
192
+ if (seen.has(token))
193
+ badReplay("Duplicate artifact reference in replay run");
194
+ seen.add(token);
195
+ const artifact = artifacts.get(token);
196
+ if (!artifact || artifact.scope !== scope)
197
+ badReplay("Replay references an absent artifact or the wrong scope");
198
+ used.add(token);
199
+ return artifact;
200
+ });
201
+ }
202
+ const inputArtifacts = resolve(item.inputArtifactIds, "input");
203
+ const preparationArtifacts = resolve(item.preparationArtifactIds, "preparation");
204
+ // Candidate raw input always crosses the complete SDK schema, ownership,
205
+ // preparation and execution-policy boundaries. Parsing does not grant trust.
206
+ const completedRun = runValidatedMetricDiagnosticsCompact(validateDiagnosticRunInputCompact(item.input));
207
+ if (completedRun.status !== "completed")
208
+ mismatch(`Replay run ${id} is blocked at ${completedRun.stage}`);
209
+ const provenance = createCompactDiagnosticRunIdentity({
210
+ completedRun,
211
+ inputArtifacts,
212
+ preparationArtifacts,
213
+ preparationLineage: item.preparationLineage,
214
+ });
215
+ await compareEvidence(cursor, "manifest", provenance.manifestIdentityDocument);
216
+ await compareEvidence(cursor, "result", provenance.resultIdentityDocument);
217
+ const end = await cursor.next();
218
+ event(end, "run-end", 4);
219
+ if (end[1] !== provenance.runFingerprint ||
220
+ end[2] !== provenance.resultFingerprint ||
221
+ end[3] !== provenance.runResultFingerprint)
222
+ mismatch("Replayed fingerprint tags do not match the full verified evidence");
223
+ return Object.freeze({
224
+ id,
225
+ runFingerprint: provenance.runFingerprint,
226
+ resultFingerprint: provenance.resultFingerprint,
227
+ runResultFingerprint: provenance.runResultFingerprint,
228
+ });
229
+ }
230
+ /**
231
+ * Verify all bytes/evidence and independently replay every run, sequentially.
232
+ * Reads must be <=128 KiB. Required resource limits apply before retaining raw
233
+ * inputs; results/audits are compared as text, never reconstructed from a file.
234
+ * Only a final receipt is returned after trailer integrity AND EOF. Hosts must
235
+ * not treat a partially consumed stream as a valid archive. Cancellation is
236
+ * cooperative between chunks/phases; use the signal for host I/O as well.
237
+ */
238
+ export function verifyDiagnosticReplayStream(chunks, supplied) {
239
+ const options = replayRecord(supplied, ["limits", "signal"]);
240
+ const fields = [
241
+ "maximumEncodedBytes",
242
+ "maximumArtifacts",
243
+ "maximumRuns",
244
+ "maximumArtifactBytes",
245
+ "maximumInputDepth",
246
+ "maximumInputNodes",
247
+ "maximumInputStringUnits",
248
+ "maximumInputTotalStringUnits",
249
+ ];
250
+ const raw = replayRecord(options.limits, fields);
251
+ const limits = Object.fromEntries(fields.map((key) => [key, replayLimit(raw[key], key)]));
252
+ const inputLimits = {
253
+ maximumDepth: limits.maximumInputDepth,
254
+ maximumNodes: limits.maximumInputNodes,
255
+ maximumStringUnits: limits.maximumInputStringUnits,
256
+ maximumTotalStringUnits: limits.maximumInputTotalStringUnits,
257
+ };
258
+ const checkCancellation = replayCancellation(options.signal);
259
+ checkCancellation();
260
+ async function* bounded() {
261
+ let size = 0;
262
+ for await (const chunk of consumeDiagnosticByteSource(chunks, checkCancellation)) {
263
+ checkCancellation();
264
+ const view = diagnosticByteView(chunk);
265
+ if (view.length > MAX_REPLAY_READ_BYTES)
266
+ badReplay("Replay reads must be at most 128 KiB");
267
+ if (view.length > limits.maximumEncodedBytes - size)
268
+ badReplay("Replay exceeds the encoded byte limit");
269
+ size += view.length;
270
+ yield new Uint8Array(view);
271
+ }
272
+ }
273
+ async function verify() {
274
+ const cursor = new ReplayCursor(decodeReplayFrames(bounded()), checkCancellation);
275
+ let failed = false;
276
+ try {
277
+ const header = await cursor.next();
278
+ event(header, REPLAY_FORMAT, 2);
279
+ if (header[1] !== REPLAY_VERSION)
280
+ badReplay("Unsupported diagnostic replay version");
281
+ const artifacts = new Map();
282
+ let frame = await cursor.next();
283
+ while (frame[0] === "artifact") {
284
+ event(frame, "artifact", 1);
285
+ if (artifacts.size >= limits.maximumArtifacts)
286
+ badReplay("Replay exceeds its artifact count limit");
287
+ const artifact = await readArtifact(cursor, inputLimits, limits.maximumArtifactBytes);
288
+ if (artifacts.has(artifact.id))
289
+ badReplay("Duplicate artifact ID in replay archive");
290
+ artifacts.set(artifact.id, artifact);
291
+ frame = await cursor.next();
292
+ }
293
+ const runs = [];
294
+ const runIds = new Set(), used = new Set();
295
+ while (frame[0] === "run") {
296
+ event(frame, "run", 1);
297
+ if (runs.length >= limits.maximumRuns)
298
+ badReplay("Replay exceeds its run count limit");
299
+ const run = await readRun(cursor, artifacts, used, inputLimits);
300
+ if (runIds.has(run.id))
301
+ badReplay("Duplicate run ID in replay archive");
302
+ runIds.add(run.id);
303
+ runs.push(run);
304
+ frame = await cursor.next();
305
+ }
306
+ event(frame, "end", 4);
307
+ if (!runs.length ||
308
+ frame[1] !== artifacts.size ||
309
+ frame[2] !== runs.length ||
310
+ used.size !== artifacts.size)
311
+ badReplay("Replay trailer counts, run presence or artifact ownership are invalid");
312
+ const frameDigest = cursor.digest();
313
+ if (frame[3] !== frameDigest)
314
+ mismatch("Replay frame integrity digest does not match");
315
+ await cursor.requireEof();
316
+ const receipt = Object.freeze({
317
+ format: REPLAY_FORMAT,
318
+ version: REPLAY_VERSION,
319
+ artifacts: Object.freeze([...artifacts.values()]),
320
+ runs: Object.freeze(runs),
321
+ frameDigest,
322
+ });
323
+ verifiedStreams.add(receipt);
324
+ return receipt;
325
+ }
326
+ catch (error) {
327
+ failed = true;
328
+ throw error;
329
+ }
330
+ finally {
331
+ try {
332
+ await cursor.close();
333
+ }
334
+ catch (cleanupError) {
335
+ if (!failed)
336
+ throw cleanupError;
337
+ }
338
+ }
339
+ }
340
+ return verify();
341
+ }
342
+ export function assertVerifiedDiagnosticReplayStream(value) {
343
+ if (value === null || typeof value !== "object" || !verifiedStreams.has(value))
344
+ badReplay("Value is not an authentic fully verified replay stream receipt");
345
+ }
346
+ //# sourceMappingURL=diagnosticReplayReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticReplayReader.js","sourceRoot":"","sources":["../src/diagnosticReplayReader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type ReplayFrame } from "./diagnosticReplayFrames.js";
2
+ export interface ReplayValueLimits {
3
+ readonly maximumDepth: number;
4
+ readonly maximumNodes: number;
5
+ /** Maximum UTF-16 code units in one key or string value. */
6
+ readonly maximumStringUnits: number;
7
+ /** Maximum UTF-16 code units across every key and string value in this input. */
8
+ readonly maximumTotalStringUnits: number;
9
+ }
10
+ /**
11
+ * Reconstruct input only, within explicit host resource bounds. Reconstructed
12
+ * values still require full SDK validation. Never use this for candidate
13
+ * result/audit identity channels: those must be compared as text streams.
14
+ */
15
+ export declare class ReplayValueBuilder {
16
+ private readonly limits;
17
+ private readonly stack;
18
+ private nodes;
19
+ private assigned;
20
+ private root;
21
+ private stringParts;
22
+ private stringUnits;
23
+ private totalStringUnits;
24
+ private stringKind;
25
+ private sealed;
26
+ constructor(limits: ReplayValueLimits);
27
+ private attach;
28
+ push(frame: ReplayFrame): void;
29
+ private consume;
30
+ finish(): unknown;
31
+ }
32
+ /** Live read-only input events. The enclosing genuine run owns its snapshots. */
33
+ export declare function replayValueFrames(value: unknown): Generator<ReplayFrame>;
34
+ //# sourceMappingURL=diagnosticReplayValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticReplayValue.d.ts","sourceRoot":"","sources":["../src/diagnosticReplayValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAElF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,iFAAiF;IACjF,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;CAC1C;AAsCD;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,iBAAiB;IAGrC,OAAO,CAAC,MAAM;IAmBd,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAS9B,OAAO,CAAC,OAAO;IA4Ff,MAAM,IAAI,OAAO;CAOlB;AAED,iFAAiF;AACjF,wBAAiB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,CAsEzE"}