@actuarial-ts/compliance 0.6.1 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -3
- package/dist/diagnosticArtifactStream.d.ts +30 -0
- package/dist/diagnosticArtifactStream.d.ts.map +1 -0
- package/dist/diagnosticArtifactStream.js +128 -0
- package/dist/diagnosticArtifactStream.js.map +1 -0
- package/dist/diagnosticByteSource.d.ts +10 -0
- package/dist/diagnosticByteSource.d.ts.map +1 -0
- package/dist/diagnosticByteSource.js +70 -0
- package/dist/diagnosticByteSource.js.map +1 -0
- package/dist/diagnosticByteView.d.ts +3 -0
- package/dist/diagnosticByteView.d.ts.map +1 -0
- package/dist/diagnosticByteView.js +27 -0
- package/dist/diagnosticByteView.js.map +1 -0
- package/dist/diagnosticCompactRun.d.ts +43 -0
- package/dist/diagnosticCompactRun.d.ts.map +1 -0
- package/dist/diagnosticCompactRun.js +253 -0
- package/dist/diagnosticCompactRun.js.map +1 -0
- package/dist/diagnosticReplayFrames.d.ts +10 -0
- package/dist/diagnosticReplayFrames.d.ts.map +1 -0
- package/dist/diagnosticReplayFrames.js +99 -0
- package/dist/diagnosticReplayFrames.js.map +1 -0
- package/dist/diagnosticReplayProtocol.d.ts +17 -0
- package/dist/diagnosticReplayProtocol.d.ts.map +1 -0
- package/dist/diagnosticReplayProtocol.js +98 -0
- package/dist/diagnosticReplayProtocol.js.map +1 -0
- package/dist/diagnosticReplayReader.d.ts +41 -0
- package/dist/diagnosticReplayReader.d.ts.map +1 -0
- package/dist/diagnosticReplayReader.js +346 -0
- package/dist/diagnosticReplayReader.js.map +1 -0
- package/dist/diagnosticReplayValue.d.ts +34 -0
- package/dist/diagnosticReplayValue.d.ts.map +1 -0
- package/dist/diagnosticReplayValue.js +269 -0
- package/dist/diagnosticReplayValue.js.map +1 -0
- package/dist/diagnosticReplayWriter.d.ts +25 -0
- package/dist/diagnosticReplayWriter.d.ts.map +1 -0
- package/dist/diagnosticReplayWriter.js +148 -0
- package/dist/diagnosticReplayWriter.js.map +1 -0
- package/dist/diagnosticRun.d.ts.map +1 -1
- package/dist/diagnosticRun.js +1 -193
- package/dist/diagnosticRun.js.map +1 -1
- package/dist/diagnosticRunEvidence.d.ts +18 -0
- package/dist/diagnosticRunEvidence.d.ts.map +1 -0
- package/dist/diagnosticRunEvidence.js +195 -0
- package/dist/diagnosticRunEvidence.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/sha256Stream.d.ts +6 -0
- package/dist/sha256Stream.d.ts.map +1 -0
- package/dist/sha256Stream.js +103 -0
- package/dist/sha256Stream.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/src/diagnosticArtifactStream.ts +148 -0
- package/src/diagnosticByteSource.ts +82 -0
- package/src/diagnosticByteView.ts +27 -0
- package/src/diagnosticCompactRun.ts +462 -0
- package/src/diagnosticReplayFrames.ts +99 -0
- package/src/diagnosticReplayProtocol.ts +99 -0
- package/src/diagnosticReplayReader.ts +428 -0
- package/src/diagnosticReplayValue.ts +269 -0
- package/src/diagnosticReplayWriter.ts +190 -0
- package/src/diagnosticRun.ts +7 -373
- package/src/diagnosticRunEvidence.ts +391 -0
- package/src/index.ts +10 -0
- package/src/sha256Stream.ts +108 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { ComplianceError } from "./errors.js";
|
|
2
|
+
export const token = (value, path) => {
|
|
3
|
+
if (value.length === 0 ||
|
|
4
|
+
/^[\t-\r ]|[\t-\r ]$/.test(value) ||
|
|
5
|
+
value.includes("\0"))
|
|
6
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `${path} must be a nonempty token`, path);
|
|
7
|
+
for (let index = 0; index < value.length; index++) {
|
|
8
|
+
const unit = value.charCodeAt(index);
|
|
9
|
+
if (unit >= 0xd800 && unit <= 0xdbff) {
|
|
10
|
+
const next = value.charCodeAt(index + 1);
|
|
11
|
+
if (!(next >= 0xdc00 && next <= 0xdfff))
|
|
12
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `${path} contains malformed Unicode`, path);
|
|
13
|
+
index++;
|
|
14
|
+
}
|
|
15
|
+
else if (unit >= 0xdc00 && unit <= 0xdfff)
|
|
16
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `${path} contains malformed Unicode`, path);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export function plain(value) {
|
|
20
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
21
|
+
return false;
|
|
22
|
+
const prototype = Object.getPrototypeOf(value);
|
|
23
|
+
return prototype === Object.prototype || prototype === null;
|
|
24
|
+
}
|
|
25
|
+
export function exactKeys(value, allowed, path) {
|
|
26
|
+
for (const key of Object.keys(value))
|
|
27
|
+
if (!allowed.includes(key))
|
|
28
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Unknown field ${key}`, `${path}.${key}`);
|
|
29
|
+
}
|
|
30
|
+
export function snapshotLineage(lineage) {
|
|
31
|
+
if (!Array.isArray(lineage))
|
|
32
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "$.preparationLineage must be an array", "$.preparationLineage");
|
|
33
|
+
return lineage
|
|
34
|
+
.map((raw, index) => {
|
|
35
|
+
const path = `$.preparationLineage[${index}]`;
|
|
36
|
+
if (!plain(raw))
|
|
37
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "Lineage edge must be a plain object", path);
|
|
38
|
+
exactKeys(raw, ["outputArtifactId", "inputArtifactIds", "transformationArtifactIds"], path);
|
|
39
|
+
if (typeof raw.outputArtifactId !== "string")
|
|
40
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "Lineage output must be a string", `${path}.outputArtifactId`);
|
|
41
|
+
token(raw.outputArtifactId, `${path}.outputArtifactId`);
|
|
42
|
+
const readIds = (value, key) => {
|
|
43
|
+
if (!Array.isArray(value))
|
|
44
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Lineage ${key} must be an array`, `${path}.${key}`);
|
|
45
|
+
const result = value.map((id, inputIndex) => {
|
|
46
|
+
if (typeof id !== "string")
|
|
47
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "Lineage artifact id must be a string", `${path}.${key}[${inputIndex}]`);
|
|
48
|
+
token(id, `${path}.${key}[${inputIndex}]`);
|
|
49
|
+
return id;
|
|
50
|
+
});
|
|
51
|
+
if (new Set(result).size !== result.length)
|
|
52
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Lineage ${key} must be unique`, `${path}.${key}`);
|
|
53
|
+
return [...result].sort();
|
|
54
|
+
};
|
|
55
|
+
const inputs = readIds(raw.inputArtifactIds, "inputArtifactIds"), transformations = readIds(raw.transformationArtifactIds, "transformationArtifactIds");
|
|
56
|
+
if (inputs.length + transformations.length === 0)
|
|
57
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "Lineage edge must have at least one upstream artifact", path);
|
|
58
|
+
return {
|
|
59
|
+
outputArtifactId: raw.outputArtifactId,
|
|
60
|
+
inputArtifactIds: inputs,
|
|
61
|
+
transformationArtifactIds: transformations,
|
|
62
|
+
};
|
|
63
|
+
})
|
|
64
|
+
.sort((a, b) => a.outputArtifactId < b.outputArtifactId
|
|
65
|
+
? -1
|
|
66
|
+
: a.outputArtifactId > b.outputArtifactId
|
|
67
|
+
? 1
|
|
68
|
+
: 0);
|
|
69
|
+
}
|
|
70
|
+
export function validateArtifactGraph(run, inputArtifacts, preparationArtifacts, lineage) {
|
|
71
|
+
const byId = new Map();
|
|
72
|
+
for (const [index, item] of [
|
|
73
|
+
...inputArtifacts,
|
|
74
|
+
...preparationArtifacts,
|
|
75
|
+
].entries()) {
|
|
76
|
+
if (byId.has(item.id))
|
|
77
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Duplicate artifact ID ${item.id}`, `$.${index < inputArtifacts.length ? "inputArtifacts" : "preparationArtifacts"}[${index < inputArtifacts.length ? index : index - inputArtifacts.length}].id`);
|
|
78
|
+
byId.set(item.id, item);
|
|
79
|
+
}
|
|
80
|
+
const referenced = new Set();
|
|
81
|
+
const requireArtifact = (id, scope, path) => {
|
|
82
|
+
const artifact = byId.get(id);
|
|
83
|
+
if (!artifact)
|
|
84
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Artifact reference ${id} is unresolved`, path);
|
|
85
|
+
if (artifact.scope !== scope)
|
|
86
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Artifact ${id} must have ${scope} scope`, path);
|
|
87
|
+
referenced.add(id);
|
|
88
|
+
};
|
|
89
|
+
let unsourced = false;
|
|
90
|
+
for (const [index, item] of run.prepared.inputAudit.entries()) {
|
|
91
|
+
const source = item.record.source;
|
|
92
|
+
if (source)
|
|
93
|
+
requireArtifact(source.artifactId, "input", `$.completedRun.prepared.inputAudit[${index}].record.source.artifactId`);
|
|
94
|
+
else
|
|
95
|
+
unsourced = true;
|
|
96
|
+
}
|
|
97
|
+
const evidence = run.review.evidence;
|
|
98
|
+
if (evidence) {
|
|
99
|
+
for (const [index, item] of evidence.groupingAssignments.entries()) {
|
|
100
|
+
if (item.source)
|
|
101
|
+
requireArtifact(item.source.artifactId, "input", `$.completedRun.review.evidence.groupingAssignments[${index}].source.artifactId`);
|
|
102
|
+
else
|
|
103
|
+
unsourced = true;
|
|
104
|
+
}
|
|
105
|
+
for (const [index, item] of evidence.cachedFormulas.entries()) {
|
|
106
|
+
if (item.source)
|
|
107
|
+
requireArtifact(item.source.artifactId, "input", `$.completedRun.review.evidence.cachedFormulas[${index}].source.artifactId`);
|
|
108
|
+
else
|
|
109
|
+
unsourced = true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (unsourced) {
|
|
113
|
+
if (run.datasetArtifactId === null)
|
|
114
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "Unsourced diagnostic input requires datasetArtifactId", "$.completedRun.datasetArtifactId");
|
|
115
|
+
const fallback = byId.get(run.datasetArtifactId);
|
|
116
|
+
if (!fallback ||
|
|
117
|
+
fallback.scope !== "input" ||
|
|
118
|
+
fallback.assurance !== "sdk-computed")
|
|
119
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "datasetArtifactId must resolve to SDK-computed input evidence", "$.completedRun.datasetArtifactId");
|
|
120
|
+
referenced.add(run.datasetArtifactId);
|
|
121
|
+
}
|
|
122
|
+
else if (run.datasetArtifactId !== null) {
|
|
123
|
+
requireArtifact(run.datasetArtifactId, "input", "$.completedRun.datasetArtifactId");
|
|
124
|
+
if (byId.get(run.datasetArtifactId).assurance !== "sdk-computed")
|
|
125
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "datasetArtifactId must resolve to SDK-computed input evidence", "$.completedRun.datasetArtifactId");
|
|
126
|
+
}
|
|
127
|
+
for (const [basisIndex, basis,] of run.prepared.definition.definition.amountBases.entries())
|
|
128
|
+
for (const [componentIndex, component] of basis.components.entries())
|
|
129
|
+
if (component.limitation.kind !== "unlimited" &&
|
|
130
|
+
component.limitation.kind !== "unknown" &&
|
|
131
|
+
component.limitation.derivation.kind === "external")
|
|
132
|
+
requireArtifact(component.limitation.derivation.transformationRef, "preparation", `$.definition.amountBases[${basisIndex}].components[${componentIndex}].limitation.derivation.transformationRef`);
|
|
133
|
+
for (const [ruleIndex, rule,] of run.prepared.definition.definition.reviewRules.entries())
|
|
134
|
+
if (rule.kind === "layer-order" &&
|
|
135
|
+
rule.comparability.kind === "caller-asserted")
|
|
136
|
+
requireArtifact(rule.comparability.rationaleArtifactId, "preparation", `$.definition.reviewRules[${ruleIndex}].comparability.rationaleArtifactId`);
|
|
137
|
+
if (run.gate.rationaleRef !== null)
|
|
138
|
+
requireArtifact(run.gate.rationaleRef, "preparation", "$.completedRun.gate.rationaleRef");
|
|
139
|
+
const edges = new Map();
|
|
140
|
+
for (const [index, edge] of lineage.entries()) {
|
|
141
|
+
const path = `$.preparationLineage[${index}]`;
|
|
142
|
+
if (edges.has(edge.outputArtifactId))
|
|
143
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "An artifact may have only one producing lineage edge", `${path}.outputArtifactId`);
|
|
144
|
+
const downstream = byId.get(edge.outputArtifactId);
|
|
145
|
+
if (!downstream)
|
|
146
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Lineage artifact ${edge.outputArtifactId} is unresolved`, `${path}.outputArtifactId`);
|
|
147
|
+
if (downstream.scope !== "input")
|
|
148
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "Lineage output artifact must have input scope", `${path}.outputArtifactId`);
|
|
149
|
+
for (const [inputIndex, id] of edge.inputArtifactIds.entries()) {
|
|
150
|
+
if (id === edge.outputArtifactId)
|
|
151
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "Lineage may not reference itself", `${path}.inputArtifactIds[${inputIndex}]`);
|
|
152
|
+
const artifact = byId.get(id);
|
|
153
|
+
if (!artifact || artifact.scope !== "input")
|
|
154
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Lineage input ${id} must resolve to input evidence`, `${path}.inputArtifactIds[${inputIndex}]`);
|
|
155
|
+
}
|
|
156
|
+
for (const [transformIndex, id,] of edge.transformationArtifactIds.entries()) {
|
|
157
|
+
const artifact = byId.get(id);
|
|
158
|
+
if (!artifact || artifact.scope !== "preparation")
|
|
159
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Lineage transformation ${id} must resolve to preparation evidence`, `${path}.transformationArtifactIds[${transformIndex}]`);
|
|
160
|
+
}
|
|
161
|
+
edges.set(edge.outputArtifactId, [
|
|
162
|
+
...edge.inputArtifactIds,
|
|
163
|
+
...edge.transformationArtifactIds,
|
|
164
|
+
]);
|
|
165
|
+
}
|
|
166
|
+
const visiting = new Set(), visited = new Set();
|
|
167
|
+
for (const root of [...referenced]) {
|
|
168
|
+
const stack = [{ id: root, exit: false }];
|
|
169
|
+
while (stack.length > 0) {
|
|
170
|
+
const { id, exit } = stack.pop();
|
|
171
|
+
if (exit) {
|
|
172
|
+
visiting.delete(id);
|
|
173
|
+
visited.add(id);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (visiting.has(id))
|
|
177
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", "Artifact lineage contains a cycle", "$.preparationLineage");
|
|
178
|
+
if (visited.has(id))
|
|
179
|
+
continue;
|
|
180
|
+
visiting.add(id);
|
|
181
|
+
stack.push({ id, exit: true });
|
|
182
|
+
for (const upstream of [...(edges.get(id) ?? [])].reverse()) {
|
|
183
|
+
referenced.add(upstream);
|
|
184
|
+
stack.push({ id: upstream, exit: false });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
for (const [index, artifact] of inputArtifacts.entries())
|
|
189
|
+
if (!referenced.has(artifact.id))
|
|
190
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Artifact ${artifact.id} is orphaned`, `$.inputArtifacts[${index}].id`);
|
|
191
|
+
for (const [index, artifact] of preparationArtifacts.entries())
|
|
192
|
+
if (!referenced.has(artifact.id))
|
|
193
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", `Artifact ${artifact.id} is orphaned`, `$.preparationArtifacts[${index}].id`);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=diagnosticRunEvidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnosticRunEvidence.js","sourceRoot":"","sources":["../src/diagnosticRunEvidence.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAa9C,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE;IACnD,IACE,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAEpB,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,GAAG,IAAI,2BAA2B,EAClC,IAAI,CACL,CAAC;IACJ,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;gBACrC,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,GAAG,IAAI,6BAA6B,EACpC,IAAI,CACL,CAAC;YACJ,KAAK,EAAE,CAAC;QACV,CAAC;aAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;YACzC,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,GAAG,IAAI,6BAA6B,EACpC,IAAI,CACL,CAAC;IACN,CAAC;AACH,CAAC,CAAC;AACF,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AACD,MAAM,UAAU,SAAS,CACvB,KAA8B,EAC9B,OAA0B,EAC1B,IAAY;IAEZ,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxB,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,iBAAiB,GAAG,EAAE,EACtB,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;AACR,CAAC;AACD,MAAM,UAAU,eAAe,CAC7B,OAAgB;IAEhB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACzB,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,uCAAuC,EACvC,sBAAsB,CACvB,CAAC;IACJ,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,wBAAwB,KAAK,GAAG,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACb,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,qCAAqC,EACrC,IAAI,CACL,CAAC;QACJ,SAAS,CACP,GAAG,EACH,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,2BAA2B,CAAC,EACrE,IAAI,CACL,CAAC;QACF,IAAI,OAAO,GAAG,CAAC,gBAAgB,KAAK,QAAQ;YAC1C,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,iCAAiC,EACjC,GAAG,IAAI,mBAAmB,CAC3B,CAAC;QACJ,KAAK,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,IAAI,mBAAmB,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,GAAW,EAAE,EAAE;YAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACvB,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,WAAW,GAAG,mBAAmB,EACjC,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;YACJ,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE;gBAC1C,IAAI,OAAO,EAAE,KAAK,QAAQ;oBACxB,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,sCAAsC,EACtC,GAAG,IAAI,IAAI,GAAG,IAAI,UAAU,GAAG,CAChC,CAAC;gBACJ,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,UAAU,GAAG,CAAC,CAAC;gBAC3C,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;gBACxC,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,WAAW,GAAG,iBAAiB,EAC/B,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;YACJ,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EAC9D,eAAe,GAAG,OAAO,CACvB,GAAG,CAAC,yBAAyB,EAC7B,2BAA2B,CAC5B,CAAC;QACJ,IAAI,MAAM,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC;YAC9C,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,uDAAuD,EACvD,IAAI,CACL,CAAC;QACJ,OAAO;YACL,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,gBAAgB,EAAE,MAAM;YACxB,yBAAyB,EAAE,eAAe;SAC3C,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACb,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB;QACrC,CAAC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB;YACvC,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,CACR,CAAC;AACN,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,GAAmC,EACnC,cAGG,EACH,oBAGG,EACH,OAAgD;IAEhD,MAAM,IAAI,GAAG,IAAI,GAAG,EAGjB,CAAC;IACJ,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI;QAC1B,GAAG,cAAc;QACjB,GAAG,oBAAoB;KACxB,CAAC,OAAO,EAAE,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,yBAAyB,IAAI,CAAC,EAAE,EAAE,EAClC,KAAK,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,IAAI,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,cAAc,CAAC,MAAM,MAAM,CAC9J,CAAC;QACJ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,eAAe,GAAG,CACtB,EAAU,EACV,KAA8B,EAC9B,IAAY,EACZ,EAAE;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ;YACX,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,sBAAsB,EAAE,gBAAgB,EACxC,IAAI,CACL,CAAC;QACJ,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK;YAC1B,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,YAAY,EAAE,cAAc,KAAK,QAAQ,EACzC,IAAI,CACL,CAAC;QACJ,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC,CAAC;IACF,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,MAAM;YACR,eAAe,CACb,MAAM,CAAC,UAAU,EACjB,OAAO,EACP,sCAAsC,KAAK,4BAA4B,CACxE,CAAC;;YACC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;IACrC,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC;YACnE,IAAI,IAAI,CAAC,MAAM;gBACb,eAAe,CACb,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,OAAO,EACP,sDAAsD,KAAK,qBAAqB,CACjF,CAAC;;gBACC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,MAAM;gBACb,eAAe,CACb,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,OAAO,EACP,iDAAiD,KAAK,qBAAqB,CAC5E,CAAC;;gBACC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,GAAG,CAAC,iBAAiB,KAAK,IAAI;YAChC,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,uDAAuD,EACvD,kCAAkC,CACnC,CAAC;QACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACjD,IACE,CAAC,QAAQ;YACT,QAAQ,CAAC,KAAK,KAAK,OAAO;YAC1B,QAAQ,CAAC,SAAS,KAAK,cAAc;YAErC,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,+DAA+D,EAC/D,kCAAkC,CACnC,CAAC;QACJ,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,GAAG,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAC1C,eAAe,CACb,GAAG,CAAC,iBAAiB,EACrB,OAAO,EACP,kCAAkC,CACnC,CAAC;QACF,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAE,CAAC,SAAS,KAAK,cAAc;YAC/D,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,+DAA+D,EAC/D,kCAAkC,CACnC,CAAC;IACN,CAAC;IACD,KAAK,MAAM,CACT,UAAU,EACV,KAAK,EACN,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE;QAC3D,KAAK,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE;YAClE,IACE,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW;gBACzC,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS;gBACvC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,UAAU;gBAEnD,eAAe,CACb,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,iBAAiB,EACjD,aAAa,EACb,4BAA4B,UAAU,gBAAgB,cAAc,2CAA2C,CAChH,CAAC;IACR,KAAK,MAAM,CACT,SAAS,EACT,IAAI,EACL,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE;QAC3D,IACE,IAAI,CAAC,IAAI,KAAK,aAAa;YAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,iBAAiB;YAE7C,eAAe,CACb,IAAI,CAAC,aAAa,CAAC,mBAAmB,EACtC,aAAa,EACb,4BAA4B,SAAS,qCAAqC,CAC3E,CAAC;IACN,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI;QAChC,eAAe,CACb,GAAG,CAAC,IAAI,CAAC,YAAY,EACrB,aAAa,EACb,kCAAkC,CACnC,CAAC;IACJ,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;IACnD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,wBAAwB,KAAK,GAAG,CAAC;QAC9C,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAClC,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,sDAAsD,EACtD,GAAG,IAAI,mBAAmB,CAC3B,CAAC;QACJ,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU;YACb,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,oBAAoB,IAAI,CAAC,gBAAgB,gBAAgB,EACzD,GAAG,IAAI,mBAAmB,CAC3B,CAAC;QACJ,IAAI,UAAU,CAAC,KAAK,KAAK,OAAO;YAC9B,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,+CAA+C,EAC/C,GAAG,IAAI,mBAAmB,CAC3B,CAAC;QACJ,KAAK,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,EAAE,KAAK,IAAI,CAAC,gBAAgB;gBAC9B,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,kCAAkC,EAClC,GAAG,IAAI,qBAAqB,UAAU,GAAG,CAC1C,CAAC;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO;gBACzC,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,iBAAiB,EAAE,iCAAiC,EACpD,GAAG,IAAI,qBAAqB,UAAU,GAAG,CAC1C,CAAC;QACN,CAAC;QACD,KAAK,MAAM,CACT,cAAc,EACd,EAAE,EACH,IAAI,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,aAAa;gBAC/C,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,0BAA0B,EAAE,uCAAuC,EACnE,GAAG,IAAI,8BAA8B,cAAc,GAAG,CACvD,CAAC;QACN,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC/B,GAAG,IAAI,CAAC,gBAAgB;YACxB,GAAG,IAAI,CAAC,yBAAyB;SAClC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,EAChC,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;YAClC,IAAI,IAAI,EAAE,CAAC;gBACT,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,mCAAmC,EACnC,sBAAsB,CACvB,CAAC;YACJ,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/B,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5D,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE;QACtD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,YAAY,QAAQ,CAAC,EAAE,cAAc,EACrC,oBAAoB,KAAK,MAAM,CAChC,CAAC;IACN,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,oBAAoB,CAAC,OAAO,EAAE;QAC5D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,YAAY,QAAQ,CAAC,EAAE,cAAc,EACrC,0BAA0B,KAAK,MAAM,CACtC,CAAC;AACR,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,10 @@ export * from "./ledger.js";
|
|
|
5
5
|
export * from "./modelCards.js";
|
|
6
6
|
export * from "./disclosure.js";
|
|
7
7
|
export * from "./diagnosticRun.js";
|
|
8
|
+
export * from "./diagnosticArtifactStream.js";
|
|
9
|
+
export { createCompactDiagnosticRunIdentity, assertVerifiedCompactDiagnosticRunProvenance, type CompactDiagnosticArtifactEvidence, type CreateCompactDiagnosticRunIdentityInput, type VerifiedCompactDiagnosticRunProvenance, } from "./diagnosticCompactRun.js";
|
|
10
|
+
export * from "./diagnosticReplayWriter.js";
|
|
11
|
+
export * from "./diagnosticReplayReader.js";
|
|
8
12
|
export * from "./bundle.js";
|
|
9
13
|
export * from "./ave.js";
|
|
10
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EACL,kCAAkC,EAClC,4CAA4C,EAC5C,KAAK,iCAAiC,EACtC,KAAK,uCAAuC,EAC5C,KAAK,sCAAsC,GAC5C,MAAM,2BAA2B,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,10 @@ export * from "./ledger.js";
|
|
|
5
5
|
export * from "./modelCards.js";
|
|
6
6
|
export * from "./disclosure.js";
|
|
7
7
|
export * from "./diagnosticRun.js";
|
|
8
|
+
export * from "./diagnosticArtifactStream.js";
|
|
9
|
+
export { createCompactDiagnosticRunIdentity, assertVerifiedCompactDiagnosticRunProvenance, } from "./diagnosticCompactRun.js";
|
|
10
|
+
export * from "./diagnosticReplayWriter.js";
|
|
11
|
+
export * from "./diagnosticReplayReader.js";
|
|
8
12
|
export * from "./bundle.js";
|
|
9
13
|
export * from "./ave.js";
|
|
10
14
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EACL,kCAAkC,EAClC,4CAA4C,GAI7C,MAAM,2BAA2B,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha256Stream.d.ts","sourceRoot":"","sources":["../src/sha256Stream.ts"],"names":[],"mappings":"AAkBA,yEAAyE;AACzE,wBAAgB,YAAY;kBAkDV,UAAU,GAAG,IAAI;cAiBrB,MAAM;EAqBnB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Private incremental SHA-256, following FIPS 180-4 sections 4.1.2, 4.2.2,
|
|
3
|
+
* 5.1.1, 5.3.3 and 6.2.2. No I/O, dependencies or whole-message buffering.
|
|
4
|
+
* https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf
|
|
5
|
+
* This implementation is not a NIST/FIPS-validated cryptographic module.
|
|
6
|
+
*/
|
|
7
|
+
const ROUND = new Uint32Array([
|
|
8
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
9
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
10
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
11
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
12
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
13
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
14
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
15
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
|
|
16
|
+
]);
|
|
17
|
+
const rotate = (value, count) => (value >>> count) | (value << (32 - count));
|
|
18
|
+
/** Internal state never escapes; update consumes bytes synchronously. */
|
|
19
|
+
export function createSha256() {
|
|
20
|
+
const state = new Uint32Array([
|
|
21
|
+
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
|
|
22
|
+
]);
|
|
23
|
+
const block = new Uint8Array(64);
|
|
24
|
+
const words = new Uint32Array(64);
|
|
25
|
+
let buffered = 0;
|
|
26
|
+
let byteLength = 0;
|
|
27
|
+
let finalized = false;
|
|
28
|
+
function compress() {
|
|
29
|
+
const view = new DataView(block.buffer);
|
|
30
|
+
for (let index = 0; index < 16; index++)
|
|
31
|
+
words[index] = view.getUint32(index * 4, false);
|
|
32
|
+
for (let index = 16; index < 64; index++) {
|
|
33
|
+
const a = words[index - 15];
|
|
34
|
+
const b = words[index - 2];
|
|
35
|
+
const small0 = rotate(a, 7) ^ rotate(a, 18) ^ (a >>> 3);
|
|
36
|
+
const small1 = rotate(b, 17) ^ rotate(b, 19) ^ (b >>> 10);
|
|
37
|
+
words[index] = (words[index - 16] + small0 + words[index - 7] + small1) >>> 0;
|
|
38
|
+
}
|
|
39
|
+
let a = state[0], b = state[1], c = state[2], d = state[3];
|
|
40
|
+
let e = state[4], f = state[5], g = state[6], h = state[7];
|
|
41
|
+
for (let index = 0; index < 64; index++) {
|
|
42
|
+
const large1 = rotate(e, 6) ^ rotate(e, 11) ^ rotate(e, 25);
|
|
43
|
+
const choose = (e & f) ^ (~e & g);
|
|
44
|
+
const t1 = (h + large1 + choose + ROUND[index] + words[index]) >>> 0;
|
|
45
|
+
const large0 = rotate(a, 2) ^ rotate(a, 13) ^ rotate(a, 22);
|
|
46
|
+
const majority = (a & b) ^ (a & c) ^ (b & c);
|
|
47
|
+
const t2 = (large0 + majority) >>> 0;
|
|
48
|
+
h = g;
|
|
49
|
+
g = f;
|
|
50
|
+
f = e;
|
|
51
|
+
e = (d + t1) >>> 0;
|
|
52
|
+
d = c;
|
|
53
|
+
c = b;
|
|
54
|
+
b = a;
|
|
55
|
+
a = (t1 + t2) >>> 0;
|
|
56
|
+
}
|
|
57
|
+
const completed = [a, b, c, d, e, f, g, h];
|
|
58
|
+
for (let index = 0; index < 8; index++)
|
|
59
|
+
state[index] = (state[index] + completed[index]) >>> 0;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
update(bytes) {
|
|
63
|
+
if (finalized)
|
|
64
|
+
throw new Error("SHA-256 state is finalized");
|
|
65
|
+
if (!Number.isSafeInteger(byteLength + bytes.byteLength))
|
|
66
|
+
throw new RangeError("SHA-256 byte length exceeds the safe integer range");
|
|
67
|
+
byteLength += bytes.byteLength;
|
|
68
|
+
let offset = 0;
|
|
69
|
+
while (offset < bytes.byteLength) {
|
|
70
|
+
const count = Math.min(64 - buffered, bytes.byteLength - offset);
|
|
71
|
+
block.set(bytes.subarray(offset, offset + count), buffered);
|
|
72
|
+
buffered += count;
|
|
73
|
+
offset += count;
|
|
74
|
+
if (buffered === 64) {
|
|
75
|
+
compress();
|
|
76
|
+
buffered = 0;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
digest() {
|
|
81
|
+
if (finalized)
|
|
82
|
+
throw new Error("SHA-256 state is finalized");
|
|
83
|
+
finalized = true;
|
|
84
|
+
block[buffered++] = 0x80;
|
|
85
|
+
block.fill(0, buffered);
|
|
86
|
+
if (buffered > 56) {
|
|
87
|
+
compress();
|
|
88
|
+
block.fill(0);
|
|
89
|
+
}
|
|
90
|
+
const view = new DataView(block.buffer);
|
|
91
|
+
// Split the bit length before multiplying: exact for every safe byte length.
|
|
92
|
+
view.setUint32(56, Math.floor(byteLength / 0x20000000), false);
|
|
93
|
+
view.setUint32(60, (byteLength % 0x20000000) * 8, false);
|
|
94
|
+
compress();
|
|
95
|
+
const hex = Array.from(state, (word) => word.toString(16).padStart(8, "0")).join("");
|
|
96
|
+
block.fill(0);
|
|
97
|
+
words.fill(0);
|
|
98
|
+
state.fill(0);
|
|
99
|
+
return hex;
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=sha256Stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha256Stream.js","sourceRoot":"","sources":["../src/sha256Stream.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const COMPLIANCE_PACKAGE_VERSION = "0.
|
|
1
|
+
export declare const COMPLIANCE_PACKAGE_VERSION = "0.7.1";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const COMPLIANCE_PACKAGE_VERSION = "0.
|
|
1
|
+
export const COMPLIANCE_PACKAGE_VERSION = "0.7.1";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actuarial-ts/compliance",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "ASOP-compliance-support layer for the actuarial-ts SDK: estimate metadata, assumption ledger, disclosures, model cards, diagnostics provenance, reproducibility bundles, and actual-vs-expected roll-forward. Responsibility for compliance remains with the credentialed actuary.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -47,9 +47,9 @@
|
|
|
47
47
|
"prepublishOnly": "node ../../tools/release/verify-release-attestation.mjs @actuarial-ts/compliance"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@actuarial-ts/core": "^0.
|
|
51
|
-
"@actuarial-ts/data": "^0.
|
|
52
|
-
"@actuarial-ts/interchange": "^0.
|
|
50
|
+
"@actuarial-ts/core": "^0.7.1",
|
|
51
|
+
"@actuarial-ts/data": "^0.7.1",
|
|
52
|
+
"@actuarial-ts/interchange": "^0.7.1"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@types/node": "^22.10.5",
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import {
|
|
2
|
+
diagnosticJsonPreflight,
|
|
3
|
+
isDiagnosticPlainRecord,
|
|
4
|
+
isDiagnosticToken,
|
|
5
|
+
} from "@actuarial-ts/core";
|
|
6
|
+
import { ComplianceError } from "./errors.js";
|
|
7
|
+
import type { DiagnosticArtifactDigest } from "./diagnosticRun.js";
|
|
8
|
+
import { createSha256 } from "./sha256Stream.js";
|
|
9
|
+
import { diagnosticByteView } from "./diagnosticByteView.js";
|
|
10
|
+
import { consumeDiagnosticByteSource } from "./diagnosticByteSource.js";
|
|
11
|
+
|
|
12
|
+
export interface DiagnosticArtifactStreamMetadata {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly scope: "input" | "preparation";
|
|
15
|
+
/** Optional completeness check; no digest handle is issued on truncation. */
|
|
16
|
+
readonly expectedByteLength?: number;
|
|
17
|
+
/** Caller-selected resource ceiling, at most Number.MAX_SAFE_INTEGER. */
|
|
18
|
+
readonly maximumByteLength?: number;
|
|
19
|
+
}
|
|
20
|
+
declare const computedArtifactDigestBrand: unique symbol;
|
|
21
|
+
export type ComputedDiagnosticArtifactDigest = Extract<
|
|
22
|
+
DiagnosticArtifactDigest,
|
|
23
|
+
{ assurance: "sdk-computed" }
|
|
24
|
+
> & { readonly [computedArtifactDigestBrand]: true };
|
|
25
|
+
|
|
26
|
+
const computed = new WeakSet<object>();
|
|
27
|
+
const signalAborted = Object.getOwnPropertyDescriptor(AbortSignal.prototype, "aborted")!.get!;
|
|
28
|
+
const throwIfAborted = AbortSignal.prototype.throwIfAborted;
|
|
29
|
+
const COPY_SIZE = 65_536;
|
|
30
|
+
|
|
31
|
+
function invalid(message: string, path = "$"): never {
|
|
32
|
+
throw new ComplianceError("BAD_DIAGNOSTIC_RUN", message, path);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function ownedMetadata(value: DiagnosticArtifactStreamMetadata) {
|
|
36
|
+
// Read descriptors once. A Proxy must not pass validation with one property
|
|
37
|
+
// value and supply a different value when the final digest is assembled.
|
|
38
|
+
if (!isDiagnosticPlainRecord(value)) invalid("Artifact metadata must be a plain object");
|
|
39
|
+
const snapshot = Object.create(null) as Record<string, unknown>;
|
|
40
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
41
|
+
if (typeof key !== "string") invalid("Artifact metadata cannot have symbol keys");
|
|
42
|
+
const field = Object.getOwnPropertyDescriptor(value, key);
|
|
43
|
+
if (!field || !("value" in field) || !field.enumerable)
|
|
44
|
+
invalid("Artifact metadata must contain enumerable data properties", `$.${key}`);
|
|
45
|
+
snapshot[key] = field.value;
|
|
46
|
+
}
|
|
47
|
+
value = snapshot as unknown as DiagnosticArtifactStreamMetadata;
|
|
48
|
+
const issues = diagnosticJsonPreflight(value, "input");
|
|
49
|
+
if (issues.length) invalid(issues[0]!.message, issues[0]!.path);
|
|
50
|
+
if (!isDiagnosticPlainRecord(value)) invalid("Artifact metadata must be a plain object");
|
|
51
|
+
for (const key of Object.keys(value))
|
|
52
|
+
if (!["id", "scope", "expectedByteLength", "maximumByteLength"].includes(key))
|
|
53
|
+
invalid("Unknown artifact metadata key", `$.${key}`);
|
|
54
|
+
if (!isDiagnosticToken(value.id)) invalid("Artifact ID must be a valid token", "$.id");
|
|
55
|
+
if (value.scope !== "input" && value.scope !== "preparation")
|
|
56
|
+
invalid("Artifact scope must be input or preparation", "$.scope");
|
|
57
|
+
for (const key of ["expectedByteLength", "maximumByteLength"] as const)
|
|
58
|
+
if (value[key] !== undefined && (!Number.isSafeInteger(value[key]) || value[key]! < 0))
|
|
59
|
+
invalid("Byte length must be a nonnegative safe integer", `$.${key}`);
|
|
60
|
+
const maximumByteLength = value.maximumByteLength ?? Number.MAX_SAFE_INTEGER;
|
|
61
|
+
if (value.expectedByteLength !== undefined && value.expectedByteLength > maximumByteLength)
|
|
62
|
+
invalid("Expected byte length exceeds the resource ceiling", "$.expectedByteLength");
|
|
63
|
+
return {
|
|
64
|
+
id: value.id,
|
|
65
|
+
scope: value.scope,
|
|
66
|
+
expectedByteLength: value.expectedByteLength,
|
|
67
|
+
maximumByteLength,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function cancellation(options: { readonly signal?: AbortSignal }): () => void {
|
|
72
|
+
if (!isDiagnosticPlainRecord(options)) invalid("Artifact stream options must be a plain object");
|
|
73
|
+
for (const key of Reflect.ownKeys(options))
|
|
74
|
+
if (key !== "signal") invalid("Unknown artifact stream option");
|
|
75
|
+
const field = Object.getOwnPropertyDescriptor(options, "signal");
|
|
76
|
+
if (field && (!("value" in field) || !field.enumerable))
|
|
77
|
+
invalid("Artifact signal must be supplied as a data property");
|
|
78
|
+
const signal = field?.value;
|
|
79
|
+
if (signal === undefined) return () => {};
|
|
80
|
+
try {
|
|
81
|
+
signalAborted.call(signal);
|
|
82
|
+
} catch {
|
|
83
|
+
invalid("Artifact signal must be an AbortSignal");
|
|
84
|
+
}
|
|
85
|
+
// Capture the genuine signal and intrinsic method before any producer await.
|
|
86
|
+
return () => throwIfAborted.call(signal);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Hash the bytes actually received, retaining only a bounded chunk copy.
|
|
91
|
+
* The producer owns I/O. A completed handle means SDK-computed content digest,
|
|
92
|
+
* not source authenticity, a signature, or validation of an actuarial run.
|
|
93
|
+
* Shared buffers are refused; bytes are consumed before requesting the next
|
|
94
|
+
* chunk. A changing producer must be checked again against this digest on replay.
|
|
95
|
+
* Cancellation is cooperative between received chunks; the producer should use
|
|
96
|
+
* the same signal to cancel pending I/O. One synchronous chunk is not interrupted.
|
|
97
|
+
*/
|
|
98
|
+
export async function digestDiagnosticArtifactChunks(
|
|
99
|
+
metadata: DiagnosticArtifactStreamMetadata,
|
|
100
|
+
chunks: AsyncIterable<Uint8Array> | Iterable<Uint8Array>,
|
|
101
|
+
options: { readonly signal?: AbortSignal } = {},
|
|
102
|
+
): Promise<ComputedDiagnosticArtifactDigest> {
|
|
103
|
+
const owned = ownedMetadata(metadata);
|
|
104
|
+
const checkCancellation = cancellation(options);
|
|
105
|
+
checkCancellation();
|
|
106
|
+
const hash = createSha256();
|
|
107
|
+
const copy = new Uint8Array(COPY_SIZE);
|
|
108
|
+
let byteLength = 0;
|
|
109
|
+
try {
|
|
110
|
+
for await (const chunk of consumeDiagnosticByteSource(chunks, checkCancellation)) {
|
|
111
|
+
checkCancellation();
|
|
112
|
+
const view = diagnosticByteView(chunk);
|
|
113
|
+
const size = view.byteLength;
|
|
114
|
+
if (!Number.isSafeInteger(byteLength + size) || byteLength + size > owned.maximumByteLength)
|
|
115
|
+
invalid("Artifact byte length exceeds the resource ceiling", "$.chunks");
|
|
116
|
+
if (owned.expectedByteLength !== undefined && byteLength + size > owned.expectedByteLength)
|
|
117
|
+
invalid("Artifact has more bytes than declared", "$.chunks");
|
|
118
|
+
for (let start = 0; start < size; start += COPY_SIZE) {
|
|
119
|
+
const length = Math.min(COPY_SIZE, size - start);
|
|
120
|
+
copy.set(new Uint8Array(view.buffer, view.byteOffset + start, length));
|
|
121
|
+
hash.update(copy.subarray(0, length));
|
|
122
|
+
}
|
|
123
|
+
byteLength += size;
|
|
124
|
+
}
|
|
125
|
+
checkCancellation();
|
|
126
|
+
if (owned.expectedByteLength !== undefined && byteLength !== owned.expectedByteLength)
|
|
127
|
+
invalid("Artifact ended before its declared byte length", "$.chunks");
|
|
128
|
+
const digest = Object.freeze({
|
|
129
|
+
id: owned.id,
|
|
130
|
+
scope: owned.scope,
|
|
131
|
+
assurance: "sdk-computed" as const,
|
|
132
|
+
algorithm: "sha256" as const,
|
|
133
|
+
value: hash.digest(),
|
|
134
|
+
byteLength,
|
|
135
|
+
}) as ComputedDiagnosticArtifactDigest;
|
|
136
|
+
computed.add(digest);
|
|
137
|
+
return digest;
|
|
138
|
+
} finally {
|
|
139
|
+
copy.fill(0);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function assertComputedDiagnosticArtifactDigest(
|
|
144
|
+
value: unknown,
|
|
145
|
+
): asserts value is ComputedDiagnosticArtifactDigest {
|
|
146
|
+
if (value === null || typeof value !== "object" || !computed.has(value))
|
|
147
|
+
invalid("Value is not an authentic SDK-computed streamed artifact digest");
|
|
148
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
type DiagnosticByteSource = Iterable<Uint8Array> | AsyncIterable<Uint8Array>;
|
|
2
|
+
|
|
3
|
+
function isObject(value: unknown): value is object {
|
|
4
|
+
return (
|
|
5
|
+
value !== null && (typeof value === "object" || typeof value === "function")
|
|
6
|
+
);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Own one producer iterator through completion, cancellation or read failure.
|
|
11
|
+
* Unlike a bare for-await loop, a rejected next() also closes the producer.
|
|
12
|
+
* A cleanup failure never replaces the error that caused cleanup. Hosts should
|
|
13
|
+
* pass the same cancellation signal to pending I/O; checks cannot interrupt it.
|
|
14
|
+
*/
|
|
15
|
+
export async function* consumeDiagnosticByteSource(
|
|
16
|
+
source: DiagnosticByteSource,
|
|
17
|
+
checkCancellation: () => void = () => {},
|
|
18
|
+
): AsyncGenerator<Uint8Array> {
|
|
19
|
+
if (!isObject(source))
|
|
20
|
+
throw new TypeError("Diagnostic byte source must be iterable");
|
|
21
|
+
const iterable = source as Partial<
|
|
22
|
+
Iterable<Uint8Array> & AsyncIterable<Uint8Array>
|
|
23
|
+
>;
|
|
24
|
+
const asynchronous = iterable[Symbol.asyncIterator];
|
|
25
|
+
const method = asynchronous ?? iterable[Symbol.iterator];
|
|
26
|
+
if (typeof method !== "function")
|
|
27
|
+
throw new TypeError(
|
|
28
|
+
"Diagnostic byte source must provide an iterator method",
|
|
29
|
+
);
|
|
30
|
+
const iterator: unknown = Reflect.apply(method, source, []);
|
|
31
|
+
if (!isObject(iterator))
|
|
32
|
+
throw new TypeError("Diagnostic byte iterator must be an object");
|
|
33
|
+
const protocol = iterator as { next?: unknown; return?: unknown };
|
|
34
|
+
let completed = false;
|
|
35
|
+
let failed = false;
|
|
36
|
+
try {
|
|
37
|
+
// Capture next once, as the iterator protocol does; never use a producer's
|
|
38
|
+
// potentially overwritten Function.call property.
|
|
39
|
+
const next = protocol.next;
|
|
40
|
+
if (typeof next !== "function")
|
|
41
|
+
throw new TypeError("Diagnostic byte iterator must provide next()");
|
|
42
|
+
for (;;) {
|
|
43
|
+
checkCancellation();
|
|
44
|
+
const result: unknown = await Reflect.apply(next, iterator, []);
|
|
45
|
+
if (!isObject(result))
|
|
46
|
+
throw new TypeError(
|
|
47
|
+
"Diagnostic byte read must return an iterator result",
|
|
48
|
+
);
|
|
49
|
+
const item = result as IteratorResult<Uint8Array>;
|
|
50
|
+
completed = Boolean(item.done);
|
|
51
|
+
checkCancellation();
|
|
52
|
+
if (completed) return;
|
|
53
|
+
// An async generator also observes a rejected value from a synchronous
|
|
54
|
+
// iterator here, so that failure follows the same cleanup path.
|
|
55
|
+
yield item.value;
|
|
56
|
+
}
|
|
57
|
+
} catch (error) {
|
|
58
|
+
failed = true;
|
|
59
|
+
throw error;
|
|
60
|
+
} finally {
|
|
61
|
+
if (!completed) {
|
|
62
|
+
try {
|
|
63
|
+
// Read return only when closing, once, following normal iterator
|
|
64
|
+
// semantics. The generator's finally executes at most once.
|
|
65
|
+
const close = protocol.return;
|
|
66
|
+
if (close !== undefined && close !== null) {
|
|
67
|
+
if (typeof close !== "function")
|
|
68
|
+
throw new TypeError(
|
|
69
|
+
"Diagnostic byte iterator return must be a function",
|
|
70
|
+
);
|
|
71
|
+
const result: unknown = await Reflect.apply(close, iterator, []);
|
|
72
|
+
if (!isObject(result))
|
|
73
|
+
throw new TypeError(
|
|
74
|
+
"Diagnostic byte iterator return must return an iterator result",
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
} catch (cleanupError) {
|
|
78
|
+
if (!failed) throw cleanupError;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|