@actuarial-ts/core 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 (133) hide show
  1. package/README.md +12 -3
  2. package/dist/canonical.d.ts +11 -0
  3. package/dist/canonical.d.ts.map +1 -1
  4. package/dist/canonical.js +136 -26
  5. package/dist/canonical.js.map +1 -1
  6. package/dist/capping.d.ts.map +1 -1
  7. package/dist/capping.js +39 -6
  8. package/dist/capping.js.map +1 -1
  9. package/dist/diagnosticAggregation.d.ts +3 -0
  10. package/dist/diagnosticAggregation.d.ts.map +1 -1
  11. package/dist/diagnosticAggregation.js +30 -7
  12. package/dist/diagnosticAggregation.js.map +1 -1
  13. package/dist/diagnosticDefinitions.d.ts +3 -0
  14. package/dist/diagnosticDefinitions.d.ts.map +1 -1
  15. package/dist/diagnosticDefinitions.js +844 -182
  16. package/dist/diagnosticDefinitions.js.map +1 -1
  17. package/dist/diagnosticDerivations.d.ts +23 -0
  18. package/dist/diagnosticDerivations.d.ts.map +1 -1
  19. package/dist/diagnosticDerivations.js +187 -43
  20. package/dist/diagnosticDerivations.js.map +1 -1
  21. package/dist/diagnosticEvidenceIntern.d.ts +16 -0
  22. package/dist/diagnosticEvidenceIntern.d.ts.map +1 -0
  23. package/dist/diagnosticEvidenceIntern.js +139 -0
  24. package/dist/diagnosticEvidenceIntern.js.map +1 -0
  25. package/dist/diagnosticExposure.d.ts +2 -2
  26. package/dist/diagnosticExposure.d.ts.map +1 -1
  27. package/dist/diagnosticExposure.js +319 -21
  28. package/dist/diagnosticExposure.js.map +1 -1
  29. package/dist/diagnosticExpressions.d.ts +1 -1
  30. package/dist/diagnosticExpressions.d.ts.map +1 -1
  31. package/dist/diagnosticExpressions.js +35 -15
  32. package/dist/diagnosticExpressions.js.map +1 -1
  33. package/dist/diagnosticFormulas.d.ts +3 -0
  34. package/dist/diagnosticFormulas.d.ts.map +1 -1
  35. package/dist/diagnosticFormulas.js +160 -26
  36. package/dist/diagnosticFormulas.js.map +1 -1
  37. package/dist/diagnosticIdentity.d.ts +15 -1
  38. package/dist/diagnosticIdentity.d.ts.map +1 -1
  39. package/dist/diagnosticIdentity.js +321 -51
  40. package/dist/diagnosticIdentity.js.map +1 -1
  41. package/dist/diagnosticIdentityStream.d.ts +56 -0
  42. package/dist/diagnosticIdentityStream.d.ts.map +1 -0
  43. package/dist/diagnosticIdentityStream.js +472 -0
  44. package/dist/diagnosticIdentityStream.js.map +1 -0
  45. package/dist/diagnosticOrdering.d.ts +8 -0
  46. package/dist/diagnosticOrdering.d.ts.map +1 -0
  47. package/dist/diagnosticOrdering.js +73 -0
  48. package/dist/diagnosticOrdering.js.map +1 -0
  49. package/dist/diagnosticPeriodAxis.d.ts +9 -0
  50. package/dist/diagnosticPeriodAxis.d.ts.map +1 -0
  51. package/dist/diagnosticPeriodAxis.js +69 -0
  52. package/dist/diagnosticPeriodAxis.js.map +1 -0
  53. package/dist/diagnosticPeriods.d.ts +2 -3
  54. package/dist/diagnosticPeriods.d.ts.map +1 -1
  55. package/dist/diagnosticPeriods.js +20 -68
  56. package/dist/diagnosticPeriods.js.map +1 -1
  57. package/dist/diagnosticPreparation.d.ts +75 -14
  58. package/dist/diagnosticPreparation.d.ts.map +1 -1
  59. package/dist/diagnosticPreparation.js +1606 -112
  60. package/dist/diagnosticPreparation.js.map +1 -1
  61. package/dist/diagnosticReview.d.ts +40 -15
  62. package/dist/diagnosticReview.d.ts.map +1 -1
  63. package/dist/diagnosticReview.js +600 -42
  64. package/dist/diagnosticReview.js.map +1 -1
  65. package/dist/diagnosticReviewSources.d.ts +18 -0
  66. package/dist/diagnosticReviewSources.d.ts.map +1 -0
  67. package/dist/diagnosticReviewSources.js +76 -0
  68. package/dist/diagnosticReviewSources.js.map +1 -0
  69. package/dist/diagnosticReviewStore.d.ts +88 -0
  70. package/dist/diagnosticReviewStore.d.ts.map +1 -0
  71. package/dist/diagnosticReviewStore.js +455 -0
  72. package/dist/diagnosticReviewStore.js.map +1 -0
  73. package/dist/diagnosticRunner.d.ts +27 -2
  74. package/dist/diagnosticRunner.d.ts.map +1 -1
  75. package/dist/diagnosticRunner.js +764 -70
  76. package/dist/diagnosticRunner.js.map +1 -1
  77. package/dist/diagnosticRuntime.d.ts +26 -0
  78. package/dist/diagnosticRuntime.d.ts.map +1 -0
  79. package/dist/diagnosticRuntime.js +243 -0
  80. package/dist/diagnosticRuntime.js.map +1 -0
  81. package/dist/diagnosticSourceOrdering.d.ts +6 -0
  82. package/dist/diagnosticSourceOrdering.d.ts.map +1 -0
  83. package/dist/diagnosticSourceOrdering.js +38 -0
  84. package/dist/diagnosticSourceOrdering.js.map +1 -0
  85. package/dist/fnvAccumulator.d.ts +6 -0
  86. package/dist/fnvAccumulator.d.ts.map +1 -0
  87. package/dist/fnvAccumulator.js +21 -0
  88. package/dist/fnvAccumulator.js.map +1 -0
  89. package/dist/index.d.ts +15 -8
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +10 -4
  92. package/dist/index.js.map +1 -1
  93. package/dist/mack.d.ts +4 -0
  94. package/dist/mack.d.ts.map +1 -1
  95. package/dist/mack.js +32 -4
  96. package/dist/mack.js.map +1 -1
  97. package/dist/triangle.d.ts.map +1 -1
  98. package/dist/triangle.js +59 -9
  99. package/dist/triangle.js.map +1 -1
  100. package/dist/types.d.ts +4 -0
  101. package/dist/types.d.ts.map +1 -1
  102. package/dist/types.js +22 -8
  103. package/dist/types.js.map +1 -1
  104. package/dist/version.d.ts +1 -1
  105. package/dist/version.js +1 -1
  106. package/package.json +3 -2
  107. package/src/canonical.ts +144 -26
  108. package/src/capping.ts +109 -18
  109. package/src/diagnosticAggregation.ts +69 -20
  110. package/src/diagnosticDefinitions.ts +2675 -426
  111. package/src/diagnosticDerivations.ts +281 -49
  112. package/src/diagnosticEvidenceIntern.ts +151 -0
  113. package/src/diagnosticExposure.ts +550 -50
  114. package/src/diagnosticExpressions.ts +99 -17
  115. package/src/diagnosticFormulas.ts +239 -39
  116. package/src/diagnosticIdentity.ts +700 -191
  117. package/src/diagnosticIdentityStream.ts +553 -0
  118. package/src/diagnosticOrdering.ts +106 -0
  119. package/src/diagnosticPeriodAxis.ts +92 -0
  120. package/src/diagnosticPeriods.ts +67 -82
  121. package/src/diagnosticPreparation.ts +2558 -132
  122. package/src/diagnosticReview.ts +1072 -58
  123. package/src/diagnosticReviewSources.ts +85 -0
  124. package/src/diagnosticReviewStore.ts +692 -0
  125. package/src/diagnosticRunner.ts +1273 -72
  126. package/src/diagnosticRuntime.ts +264 -0
  127. package/src/diagnosticSourceOrdering.ts +50 -0
  128. package/src/fnvAccumulator.ts +20 -0
  129. package/src/index.ts +69 -4
  130. package/src/mack.ts +72 -9
  131. package/src/triangle.ts +103 -13
  132. package/src/types.ts +55 -20
  133. package/src/version.ts +1 -1
@@ -0,0 +1,56 @@
1
+ declare const documentBrand: unique symbol;
2
+ /**
3
+ * A structural serialization descriptor, NOT proof of diagnostic authenticity.
4
+ * Values and sequence callbacks are live views, not snapshots. Re-iteration
5
+ * observes later mutations. Compliance must obtain documents from genuine
6
+ * prepared/review/completed-run owners, never trust an arbitrary document.
7
+ */
8
+ export interface DiagnosticIdentityDocument {
9
+ readonly [documentBrand]: true;
10
+ }
11
+ /** A live projected view; construction neither clones nor freezes caller data. */
12
+ export declare function createDiagnosticIdentityValue(value: unknown): DiagnosticIdentityDocument;
13
+ /** Copies the field-to-descriptor map, not the live values behind its children. */
14
+ export declare function createDiagnosticIdentityObject(fields: Readonly<Record<string, DiagnosticIdentityDocument>>): DiagnosticIdentityDocument;
15
+ /**
16
+ * A structural lazy sequence. The callback grants NO review/run authority and
17
+ * is invoked only as iteration reaches an index. It must remain repeatable for
18
+ * deterministic output; only an immutable SDK owner may cache a resulting tag.
19
+ */
20
+ export declare function createDiagnosticIdentityArray(count: number, itemAt: (index: number) => DiagnosticIdentityDocument): DiagnosticIdentityDocument;
21
+ /**
22
+ * Exact legacy diagnostic projection, emitted in bounded canonical chunks.
23
+ * Arrays are visited in order; object key lists and paths still scale with
24
+ * object width/depth. No full identity graph or escaped string atom is made.
25
+ * One explicit traversal stack feeds the bounded sink directly: raw fields
26
+ * never allocate public descriptors, and tokens do not bounce through nested
27
+ * generators. Diagnostic validation still rejects accessors without invoking
28
+ * them, and each iteration reads the live descriptor values afresh.
29
+ */
30
+ export declare function iterateDiagnosticIdentityJson(document: DiagnosticIdentityDocument): Generator<string>;
31
+ /** Full legacy FNV tag; structure alone is not proof of a completed SDK run. */
32
+ export declare function fingerprintDiagnosticIdentity(document: DiagnosticIdentityDocument, envelope: {
33
+ readonly kind: string;
34
+ readonly property: string;
35
+ }): string;
36
+ export type DiagnosticIdentityComparison = {
37
+ readonly equal: true;
38
+ } | {
39
+ readonly equal: false;
40
+ readonly codeUnitOffset: number;
41
+ };
42
+ /**
43
+ * Exact canonical text comparison, independent of chunk boundaries; never hash
44
+ * equality. A mismatch stops iteration and reports its UTF-16 offset, without
45
+ * building a giant candidate just to recover a nested JSON path.
46
+ */
47
+ export declare function compareDiagnosticIdentityDocuments(left: DiagnosticIdentityDocument, right: DiagnosticIdentityDocument): DiagnosticIdentityComparison;
48
+ /**
49
+ * Exact UTF-16 text comparison only: this does NOT validate JSON, normalize
50
+ * input, or authenticate evidence. Candidate decoders must validate their own
51
+ * format, and diagnostic verification must independently authenticate SDK
52
+ * owners. Empty chunks and split surrogate pairs do not affect equality.
53
+ */
54
+ export declare function compareDiagnosticIdentityJsonChunks(left: Iterable<string>, right: Iterable<string>): DiagnosticIdentityComparison;
55
+ export {};
56
+ //# sourceMappingURL=diagnosticIdentityStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticIdentityStream.d.ts","sourceRoot":"","sources":["../src/diagnosticIdentityStream.ts"],"names":[],"mappings":"AAUA,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,MAAM,CAAC;AAC3C;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC;CAChC;AA0CD,kFAAkF;AAClF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,0BAA0B,CAExF;AAED,mFAAmF;AACnF,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,GAC3D,0BAA0B,CAe5B;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,0BAA0B,GACpD,0BAA0B,CAM5B;AA6GD;;;;;;;;GAQG;AACH,wBAAiB,6BAA6B,CAC5C,QAAQ,EAAE,0BAA0B,GACnC,SAAS,CAAC,MAAM,CAAC,CAwNnB;AAED,gFAAgF;AAChF,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,0BAA0B,EACpC,QAAQ,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC7D,MAAM,CAuCR;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,0BAA0B,EAChC,KAAK,EAAE,0BAA0B,GAChC,4BAA4B,CAK9B;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EACtB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GACtB,4BAA4B,CAyC9B"}
@@ -0,0 +1,472 @@
1
+ import { projectDiagnosticIdentity } from "./diagnosticIdentity.js";
2
+ import { MAX_DIAGNOSTIC_JSON_DEPTH, isDiagnosticPlainRecord, isDiagnosticToken, isWellFormedDiagnosticString, } from "./diagnosticRuntime.js";
3
+ import { createFnvAccumulator } from "./fnvAccumulator.js";
4
+ import { DiagnosticValidationError } from "./types.js";
5
+ const plainMode = { sourceSlot: false, freeJson: false };
6
+ const sourceMode = { sourceSlot: true, freeJson: false };
7
+ const freeMode = { sourceSlot: false, freeJson: true };
8
+ const nodes = new WeakMap();
9
+ const CHUNK_UNITS = 16_384;
10
+ const QUOTE_UNITS = 4_096;
11
+ function fail(path, message, code = "invalid-json-value") {
12
+ throw new DiagnosticValidationError([{ domain: "input", code, path, message }]);
13
+ }
14
+ function descriptor(node) {
15
+ const document = Object.freeze({});
16
+ nodes.set(document, node);
17
+ return document;
18
+ }
19
+ function readDocument(value, path) {
20
+ if (value === null || typeof value !== "object" || !nodes.has(value))
21
+ fail(path, "Value is not a diagnostic identity serialization descriptor", "invalid-type");
22
+ return nodes.get(value);
23
+ }
24
+ /** A live projected view; construction neither clones nor freezes caller data. */
25
+ export function createDiagnosticIdentityValue(value) {
26
+ return descriptor({ kind: "value", value });
27
+ }
28
+ /** Copies the field-to-descriptor map, not the live values behind its children. */
29
+ export function createDiagnosticIdentityObject(fields) {
30
+ if (!isDiagnosticPlainRecord(fields))
31
+ fail("$", "Identity fields must be a plain record", "invalid-type");
32
+ const keys = Object.keys(fields).sort();
33
+ const values = [];
34
+ for (const key of keys) {
35
+ if (!isWellFormedDiagnosticString(key))
36
+ fail(`$.${key}`, "Object key is not well-formed UTF-16 or contains U+0000");
37
+ const field = Object.getOwnPropertyDescriptor(fields, key);
38
+ if (!field || !("value" in field))
39
+ fail(`$.${key}`, "JSON objects may contain only data properties");
40
+ readDocument(field.value, `$.${key}`);
41
+ values.push(field.value);
42
+ }
43
+ return descriptor({ kind: "object", fields: { keys, values, documents: true } });
44
+ }
45
+ /**
46
+ * A structural lazy sequence. The callback grants NO review/run authority and
47
+ * is invoked only as iteration reaches an index. It must remain repeatable for
48
+ * deterministic output; only an immutable SDK owner may cache a resulting tag.
49
+ */
50
+ export function createDiagnosticIdentityArray(count, itemAt) {
51
+ if (!Number.isSafeInteger(count) || count < 0)
52
+ fail("$.count", "Identity sequence count must be a nonnegative safe integer", "invalid-number");
53
+ if (typeof itemAt !== "function")
54
+ fail("$.itemAt", "Identity sequence reader must be a function", "invalid-type");
55
+ return descriptor({ kind: "array", count, itemAt });
56
+ }
57
+ function childMode(mode, key) {
58
+ if (mode.freeJson || key === "groupDimensions" || key === "dimensions")
59
+ return freeMode;
60
+ return key === "source" || key === "sources" ? sourceMode : plainMode;
61
+ }
62
+ function childPath(path, key) {
63
+ return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)
64
+ ? `${path}.${key}`
65
+ : `${path}[${JSON.stringify(key)}]`;
66
+ }
67
+ function scalar(fields, index) {
68
+ if (!fields.documents)
69
+ return fields.values[index];
70
+ const node = readDocument(fields.values[index], "$");
71
+ // Non-scalar composition has an object value, and cannot be a source token.
72
+ return node.kind === "value" ? node.value : {};
73
+ }
74
+ function sourceFields(fields, mode, path) {
75
+ if (mode.freeJson || !mode.sourceSlot)
76
+ return fields;
77
+ const artifact = fields.keys.indexOf("artifactId");
78
+ if (artifact < 0 || typeof scalar(fields, artifact) !== "string")
79
+ return fields;
80
+ const source = Object.create(null);
81
+ for (let index = 0; index < fields.keys.length; index++)
82
+ source[fields.keys[index]] = scalar(fields, index);
83
+ try {
84
+ // Reuse the authoritative source-slot normalization/validation, including
85
+ // optional nulls, rather than maintaining a second source schema.
86
+ const normalized = projectDiagnosticIdentity({ source }).source;
87
+ const keys = Object.keys(normalized).sort();
88
+ return {
89
+ keys,
90
+ values: keys.map((key) => normalized[key]),
91
+ documents: false,
92
+ };
93
+ }
94
+ catch (error) {
95
+ if (error instanceof DiagnosticValidationError)
96
+ throw new DiagnosticValidationError(error.issues.map((issue) => ({
97
+ ...issue,
98
+ path: issue.path.replace(/^\$\.source/, path),
99
+ })));
100
+ throw error;
101
+ }
102
+ }
103
+ function rawFields(raw, path) {
104
+ const keys = Object.keys(raw).sort();
105
+ const values = [];
106
+ // Read every sibling descriptor before traversing a child, exactly as in the
107
+ // legacy streaming projection. Accessors fail without ever being invoked.
108
+ for (const key of keys) {
109
+ const location = childPath(path, key);
110
+ if (!isWellFormedDiagnosticString(key))
111
+ fail(location, "Object key is not well-formed UTF-16 or contains U+0000");
112
+ const field = Object.getOwnPropertyDescriptor(raw, key);
113
+ if (!field || !("value" in field))
114
+ fail(location, "JSON objects may contain only data properties");
115
+ values.push(field.value);
116
+ }
117
+ return { keys, values, documents: false };
118
+ }
119
+ function safeEnd(text, start, count) {
120
+ let end = Math.min(start + count, text.length);
121
+ const before = text.charCodeAt(end - 1), after = text.charCodeAt(end);
122
+ if (before >= 0xd800 && before <= 0xdbff && after >= 0xdc00 && after <= 0xdfff)
123
+ end--;
124
+ return end;
125
+ }
126
+ function* quote(text) {
127
+ yield '"';
128
+ for (let start = 0; start < text.length;) {
129
+ const end = safeEnd(text, start, QUOTE_UNITS);
130
+ yield JSON.stringify(text.slice(start, end)).slice(1, -1);
131
+ start = end;
132
+ }
133
+ yield '"';
134
+ }
135
+ function checkDepth(path, depth) {
136
+ if (depth > MAX_DIAGNOSTIC_JSON_DEPTH)
137
+ fail(path, `JSON depth exceeds ${MAX_DIAGNOSTIC_JSON_DEPTH}`, "expression-limit");
138
+ }
139
+ /**
140
+ * Exact legacy diagnostic projection, emitted in bounded canonical chunks.
141
+ * Arrays are visited in order; object key lists and paths still scale with
142
+ * object width/depth. No full identity graph or escaped string atom is made.
143
+ * One explicit traversal stack feeds the bounded sink directly: raw fields
144
+ * never allocate public descriptors, and tokens do not bounce through nested
145
+ * generators. Diagnostic validation still rejects accessors without invoking
146
+ * them, and each iteration reads the live descriptor values afresh.
147
+ */
148
+ export function* iterateDiagnosticIdentityJson(document) {
149
+ readDocument(document, "$");
150
+ const activeDocuments = new Set();
151
+ const activeValues = new Set();
152
+ const stack = [{ kind: "document", document, mode: plainMode, path: "$", depth: 1 }];
153
+ let buffered = "";
154
+ let token = "";
155
+ let tokenStart = 0;
156
+ try {
157
+ while (stack.length || tokenStart < token.length) {
158
+ // Drain one bounded token before visiting anything else. Keeping the
159
+ // token/chunk boundaries also preserves when lazy callbacks are read.
160
+ if (tokenStart < token.length) {
161
+ const end = safeEnd(token, tokenStart, CHUNK_UNITS - buffered.length);
162
+ if (end === tokenStart) {
163
+ yield buffered;
164
+ buffered = "";
165
+ continue;
166
+ }
167
+ buffered += token.slice(tokenStart, end);
168
+ tokenStart = end;
169
+ if (buffered.length >= CHUNK_UNITS - 1) {
170
+ yield buffered;
171
+ buffered = "";
172
+ }
173
+ continue;
174
+ }
175
+ token = "";
176
+ tokenStart = 0;
177
+ const frame = stack[stack.length - 1];
178
+ switch (frame.kind) {
179
+ case "leave-document":
180
+ activeDocuments.delete(frame.document);
181
+ stack.pop();
182
+ break;
183
+ case "leave-value":
184
+ activeValues.delete(frame.value);
185
+ stack.pop();
186
+ break;
187
+ case "quote": {
188
+ if (!frame.opened) {
189
+ frame.opened = true;
190
+ token = '"';
191
+ }
192
+ else if (frame.start < frame.text.length) {
193
+ const end = safeEnd(frame.text, frame.start, QUOTE_UNITS);
194
+ token = JSON.stringify(frame.text.slice(frame.start, end)).slice(1, -1);
195
+ frame.start = end;
196
+ }
197
+ else {
198
+ token = '"';
199
+ stack.pop();
200
+ }
201
+ break;
202
+ }
203
+ case "document": {
204
+ const { document: current, mode, path, depth } = frame;
205
+ const node = readDocument(current, path);
206
+ checkDepth(path, depth);
207
+ if (activeDocuments.has(current))
208
+ fail(path, "Identity document contains a cycle", "cycle");
209
+ activeDocuments.add(current);
210
+ stack[stack.length - 1] = { kind: "leave-document", document: current };
211
+ if (node.kind === "value")
212
+ stack.push({ kind: "value", value: node.value, mode, path, depth });
213
+ else if (node.kind === "object") {
214
+ const fields = sourceFields(node.fields, mode, path);
215
+ stack.push({ kind: "object", fields, mode, path, depth, index: 0, phase: "separator" });
216
+ token = "{";
217
+ }
218
+ else {
219
+ stack.push({ kind: "sequence", node, mode, path, depth, index: 0, phase: "separator" });
220
+ token = "[";
221
+ }
222
+ break;
223
+ }
224
+ case "value": {
225
+ const { value: raw, mode, path, depth } = frame;
226
+ checkDepth(path, depth);
227
+ stack.pop();
228
+ if (raw === null)
229
+ token = "null";
230
+ else if (typeof raw === "boolean")
231
+ token = String(raw);
232
+ else if (typeof raw === "number") {
233
+ if (!Number.isFinite(raw))
234
+ fail(path, "JSON numeric value must be finite");
235
+ token = Object.is(raw, -0) ? "0" : String(raw);
236
+ }
237
+ else if (typeof raw === "string") {
238
+ if (!isWellFormedDiagnosticString(raw))
239
+ fail(path, "String is not well-formed UTF-16 or contains U+0000");
240
+ stack.push({ kind: "quote", text: raw, start: 0, opened: false });
241
+ }
242
+ else {
243
+ if (typeof raw !== "object")
244
+ fail(path, "Value is not plain JSON data");
245
+ const array = Array.isArray(raw);
246
+ if (array ? Object.getPrototypeOf(raw) !== Array.prototype : !isDiagnosticPlainRecord(raw))
247
+ fail(path, "Value must use a plain object or array prototype");
248
+ if (activeValues.has(raw))
249
+ fail(path, "JSON value contains a cycle", "cycle");
250
+ activeValues.add(raw);
251
+ stack.push({ kind: "leave-value", value: raw });
252
+ if (array) {
253
+ const values = raw;
254
+ for (const key of Reflect.ownKeys(values)) {
255
+ if (key === "length")
256
+ continue;
257
+ const index = typeof key === "string" ? Number(key) : NaN;
258
+ if (!Number.isInteger(index) ||
259
+ index < 0 ||
260
+ index >= values.length ||
261
+ String(index) !== key)
262
+ fail(typeof key === "symbol" ? path : childPath(path, key), "JSON arrays may contain only indexed data properties");
263
+ }
264
+ stack.push({ kind: "array", values, mode, path, depth, index: 0 });
265
+ token = "[";
266
+ }
267
+ else {
268
+ const fields = sourceFields(rawFields(raw, path), mode, path);
269
+ stack.push({
270
+ kind: "object",
271
+ fields,
272
+ mode,
273
+ path,
274
+ depth,
275
+ index: 0,
276
+ phase: "separator",
277
+ });
278
+ token = "{";
279
+ }
280
+ }
281
+ break;
282
+ }
283
+ case "object": {
284
+ const { fields, index, mode, path, depth } = frame;
285
+ if (index === fields.keys.length) {
286
+ token = "}";
287
+ stack.pop();
288
+ break;
289
+ }
290
+ const key = fields.keys[index];
291
+ if (frame.phase === "separator") {
292
+ frame.phase = "key";
293
+ if (index)
294
+ token = ",";
295
+ }
296
+ else if (frame.phase === "key") {
297
+ frame.phase = "colon";
298
+ stack.push({ kind: "quote", text: key, start: 0, opened: false });
299
+ }
300
+ else if (frame.phase === "colon") {
301
+ frame.phase = "child";
302
+ token = ":";
303
+ }
304
+ else {
305
+ const child = fields.values[index];
306
+ const location = {
307
+ mode: childMode(mode, key),
308
+ path: childPath(path, key),
309
+ depth: depth + 1,
310
+ };
311
+ stack.push(fields.documents
312
+ ? { kind: "document", document: child, ...location }
313
+ : { kind: "value", value: child, ...location });
314
+ frame.index++;
315
+ frame.phase = "separator";
316
+ }
317
+ break;
318
+ }
319
+ case "array": {
320
+ const { values, index, mode, path, depth } = frame;
321
+ if (index >= values.length) {
322
+ token = "]";
323
+ stack.pop();
324
+ break;
325
+ }
326
+ const field = Object.getOwnPropertyDescriptor(values, String(index));
327
+ if (!field || !("value" in field))
328
+ fail(`${path}[${index}]`, "JSON arrays may contain only indexed data properties");
329
+ stack.push({
330
+ kind: "value",
331
+ value: field.value,
332
+ mode,
333
+ path: `${path}[${index}]`,
334
+ depth: depth + 1,
335
+ });
336
+ frame.index++;
337
+ if (index)
338
+ token = ",";
339
+ break;
340
+ }
341
+ case "sequence": {
342
+ const { node, index, mode, path, depth } = frame;
343
+ if (index === node.count) {
344
+ token = "]";
345
+ stack.pop();
346
+ }
347
+ else if (frame.phase === "separator") {
348
+ frame.phase = "child";
349
+ if (index)
350
+ token = ",";
351
+ }
352
+ else {
353
+ const child = node.itemAt(index);
354
+ stack.push({
355
+ kind: "document",
356
+ document: child,
357
+ mode,
358
+ path: `${path}[${index}]`,
359
+ depth: depth + 1,
360
+ });
361
+ frame.index++;
362
+ frame.phase = "separator";
363
+ }
364
+ break;
365
+ }
366
+ }
367
+ }
368
+ if (buffered)
369
+ yield buffered;
370
+ }
371
+ finally {
372
+ // Cancellation must release live views without traversing later children.
373
+ stack.length = 0;
374
+ activeDocuments.clear();
375
+ activeValues.clear();
376
+ }
377
+ }
378
+ /** Full legacy FNV tag; structure alone is not proof of a completed SDK run. */
379
+ export function fingerprintDiagnosticIdentity(document, envelope) {
380
+ if (!isDiagnosticToken(envelope?.kind) ||
381
+ !isDiagnosticToken(envelope?.property) ||
382
+ ["kind", "identityVersion"].includes(envelope.property))
383
+ fail("$.envelope", "Identity envelope requires distinct nonempty kind/property tokens", "invalid-string");
384
+ readDocument(document, "$");
385
+ function* envelopeTokens() {
386
+ yield "{";
387
+ let index = 0;
388
+ for (const key of ["identityVersion", "kind", envelope.property].sort()) {
389
+ if (index++)
390
+ yield ",";
391
+ yield* quote(key);
392
+ yield ":";
393
+ if (key === "identityVersion")
394
+ yield "1";
395
+ else if (key === "kind")
396
+ yield* quote(envelope.kind);
397
+ // The body is already an identity projection. The envelope must not
398
+ // change its source context or consume an extra diagnostic depth level.
399
+ else
400
+ yield* iterateDiagnosticIdentityJson(document);
401
+ }
402
+ yield "}";
403
+ }
404
+ const hash = createFnvAccumulator();
405
+ const encoder = new TextEncoder();
406
+ const bytes = new Uint8Array(CHUNK_UNITS * 3);
407
+ for (const text of envelopeTokens()) {
408
+ for (let start = 0; start < text.length;) {
409
+ const end = safeEnd(text, start, CHUNK_UNITS);
410
+ const { written } = encoder.encodeInto(text.slice(start, end), bytes);
411
+ hash.update(bytes.subarray(0, written));
412
+ start = end;
413
+ }
414
+ }
415
+ return `fnv1a64-jcs-v1:${hash.digest()}`;
416
+ }
417
+ /**
418
+ * Exact canonical text comparison, independent of chunk boundaries; never hash
419
+ * equality. A mismatch stops iteration and reports its UTF-16 offset, without
420
+ * building a giant candidate just to recover a nested JSON path.
421
+ */
422
+ export function compareDiagnosticIdentityDocuments(left, right) {
423
+ return compareDiagnosticIdentityJsonChunks(iterateDiagnosticIdentityJson(left), iterateDiagnosticIdentityJson(right));
424
+ }
425
+ /**
426
+ * Exact UTF-16 text comparison only: this does NOT validate JSON, normalize
427
+ * input, or authenticate evidence. Candidate decoders must validate their own
428
+ * format, and diagnostic verification must independently authenticate SDK
429
+ * owners. Empty chunks and split surrogate pairs do not affect equality.
430
+ */
431
+ export function compareDiagnosticIdentityJsonChunks(left, right) {
432
+ const a = left[Symbol.iterator]();
433
+ let b;
434
+ const next = (iterator) => {
435
+ for (;;) {
436
+ const item = iterator.next();
437
+ if (item.done)
438
+ return item;
439
+ if (typeof item.value !== "string")
440
+ fail("$", "Canonical text chunks must be strings", "invalid-type");
441
+ if (item.value.length)
442
+ return item;
443
+ }
444
+ };
445
+ try {
446
+ b = right[Symbol.iterator]();
447
+ let x = next(a), y = next(b), xi = 0, yi = 0, offset = 0;
448
+ while (!x.done && !y.done) {
449
+ const count = Math.min(x.value.length - xi, y.value.length - yi);
450
+ for (let index = 0; index < count; index++)
451
+ if (x.value.charCodeAt(xi + index) !== y.value.charCodeAt(yi + index))
452
+ return { equal: false, codeUnitOffset: offset + index };
453
+ offset += count;
454
+ xi += count;
455
+ yi += count;
456
+ if (xi === x.value.length) {
457
+ x = next(a);
458
+ xi = 0;
459
+ }
460
+ if (yi === y.value.length) {
461
+ y = next(b);
462
+ yi = 0;
463
+ }
464
+ }
465
+ return x.done && y.done ? { equal: true } : { equal: false, codeUnitOffset: offset };
466
+ }
467
+ finally {
468
+ a.return?.();
469
+ b?.return?.();
470
+ }
471
+ }
472
+ //# sourceMappingURL=diagnosticIdentityStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticIdentityStream.js","sourceRoot":"","sources":["../src/diagnosticIdentityStream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DiagnosticMeasureContribution, DiagnosticStructuralBlocker } from "./diagnosticAggregation.js";
2
+ import type { DiagnosticMetricFinding } from "./diagnosticFormulas.js";
3
+ /** Section 15 total order, for values already validated by a public boundary. */
4
+ export declare function compareDiagnosticIdentityValues(left: unknown, right: unknown): number;
5
+ export declare function compareDiagnosticFindings(left: DiagnosticMetricFinding, right: DiagnosticMetricFinding): number;
6
+ export declare function compareDiagnosticContributions(left: DiagnosticMeasureContribution, right: DiagnosticMeasureContribution): number;
7
+ export declare function compareDiagnosticBlockers(left: DiagnosticStructuralBlocker, right: DiagnosticStructuralBlocker): number;
8
+ //# sourceMappingURL=diagnosticOrdering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticOrdering.d.ts","sourceRoot":"","sources":["../src/diagnosticOrdering.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,6BAA6B,EAC7B,2BAA2B,EAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAIvE,iFAAiF;AACjF,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,GACb,MAAM,CAoBR;AAaD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,uBAAuB,EAC7B,KAAK,EAAE,uBAAuB,GAC7B,MAAM,CA4BR;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,6BAA6B,EACnC,KAAK,EAAE,6BAA6B,GACnC,MAAM,CASR;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,2BAA2B,EACjC,KAAK,EAAE,2BAA2B,GACjC,MAAM,CASR"}
@@ -0,0 +1,73 @@
1
+ import { canonicalJson } from "./canonical.js";
2
+ import { compareDiagnosticSourceLocations } from "./diagnosticSourceOrdering.js";
3
+ /** Section 15 total order, for values already validated by a public boundary. */
4
+ export function compareDiagnosticIdentityValues(left, right) {
5
+ if (left === right)
6
+ return 0;
7
+ if (left === undefined)
8
+ return -1;
9
+ if (right === undefined)
10
+ return 1;
11
+ if (left === null)
12
+ return -1;
13
+ if (right === null)
14
+ return 1;
15
+ if (typeof left === "number" && typeof right === "number")
16
+ return left - right;
17
+ if (typeof left === "boolean" && typeof right === "boolean")
18
+ return Number(left) - Number(right);
19
+ if (Array.isArray(left) && Array.isArray(right)) {
20
+ for (let i = 0; i < Math.min(left.length, right.length); i++) {
21
+ const comparison = compareDiagnosticIdentityValues(left[i], right[i]);
22
+ if (comparison !== 0)
23
+ return comparison;
24
+ }
25
+ return left.length - right.length;
26
+ }
27
+ const a = typeof left === "string" ? left : canonicalJson(left);
28
+ const b = typeof right === "string" ? right : canonicalJson(right);
29
+ return a < b ? -1 : a > b ? 1 : 0;
30
+ }
31
+ function compareSources(left, right) {
32
+ for (let i = 0; i < Math.min(left.length, right.length); i++) {
33
+ const comparison = compareDiagnosticSourceLocations(left[i], right[i]);
34
+ if (comparison !== 0)
35
+ return comparison;
36
+ }
37
+ return left.length - right.length;
38
+ }
39
+ export function compareDiagnosticFindings(left, right) {
40
+ const fields = [
41
+ "category",
42
+ "severity",
43
+ "code",
44
+ "ruleId",
45
+ "instanceId",
46
+ "measureId",
47
+ "expressionPath",
48
+ "sourceGroup",
49
+ "group",
50
+ "origin",
51
+ "valuation",
52
+ "developmentAge",
53
+ "ageUnit",
54
+ "recordId",
55
+ "claimId",
56
+ "exposureKey",
57
+ "message",
58
+ ];
59
+ return (compareDiagnosticIdentityValues(fields.map((key) => left[key]), fields.map((key) => right[key])) ||
60
+ compareDiagnosticIdentityValues(left.offendingKey, right.offendingKey) ||
61
+ compareSources(left.sources, right.sources));
62
+ }
63
+ export function compareDiagnosticContributions(left, right) {
64
+ return (compareDiagnosticIdentityValues([left.sourceId, left.status, left.deduplicated], [right.sourceId, right.status, right.deduplicated]) ||
65
+ compareSources(left.sources, right.sources) ||
66
+ compareDiagnosticIdentityValues(left, right));
67
+ }
68
+ export function compareDiagnosticBlockers(left, right) {
69
+ return (compareDiagnosticIdentityValues([left.code, left.message, left.sourceIds], [right.code, right.message, right.sourceIds]) ||
70
+ compareSources(left.sources, right.sources) ||
71
+ compareDiagnosticIdentityValues(left.finding, right.finding));
72
+ }
73
+ //# sourceMappingURL=diagnosticOrdering.js.map