@ifc-lite/sdk 9.2.0 → 9.4.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 (70) hide show
  1. package/README.md +30 -0
  2. package/dist/review/capture-budget.d.ts +6 -0
  3. package/dist/review/capture-budget.d.ts.map +1 -0
  4. package/dist/review/capture-budget.js +47 -0
  5. package/dist/review/capture-budget.js.map +1 -0
  6. package/dist/review/capture-retention.d.ts +47 -0
  7. package/dist/review/capture-retention.d.ts.map +1 -0
  8. package/dist/review/capture-retention.js +141 -0
  9. package/dist/review/capture-retention.js.map +1 -0
  10. package/dist/review/capture-types.d.ts +57 -0
  11. package/dist/review/capture-types.d.ts.map +1 -0
  12. package/dist/review/capture-types.js +5 -0
  13. package/dist/review/capture-types.js.map +1 -0
  14. package/dist/review/clash-identity.d.ts +9 -0
  15. package/dist/review/clash-identity.d.ts.map +1 -0
  16. package/dist/review/clash-identity.js +18 -0
  17. package/dist/review/clash-identity.js.map +1 -0
  18. package/dist/review/clash.d.ts +25 -0
  19. package/dist/review/clash.d.ts.map +1 -0
  20. package/dist/review/clash.js +97 -0
  21. package/dist/review/clash.js.map +1 -0
  22. package/dist/review/native-captures.d.ts +21 -0
  23. package/dist/review/native-captures.d.ts.map +1 -0
  24. package/dist/review/native-captures.js +325 -0
  25. package/dist/review/native-captures.js.map +1 -0
  26. package/dist/review/native-snapshot.d.ts +47 -0
  27. package/dist/review/native-snapshot.d.ts.map +1 -0
  28. package/dist/review/native-snapshot.js +98 -0
  29. package/dist/review/native-snapshot.js.map +1 -0
  30. package/dist/review/portable-analysis-binding.d.ts +29 -0
  31. package/dist/review/portable-analysis-binding.d.ts.map +1 -0
  32. package/dist/review/portable-analysis-binding.js +60 -0
  33. package/dist/review/portable-analysis-binding.js.map +1 -0
  34. package/dist/review/portable-analysis.d.ts +103 -0
  35. package/dist/review/portable-analysis.d.ts.map +1 -0
  36. package/dist/review/portable-analysis.js +119 -0
  37. package/dist/review/portable-analysis.js.map +1 -0
  38. package/dist/review/portable-automation-provenance.d.ts +32 -0
  39. package/dist/review/portable-automation-provenance.d.ts.map +1 -0
  40. package/dist/review/portable-automation-provenance.js +68 -0
  41. package/dist/review/portable-automation-provenance.js.map +1 -0
  42. package/dist/review/portable-ids-report.d.ts +125 -0
  43. package/dist/review/portable-ids-report.d.ts.map +1 -0
  44. package/dist/review/portable-ids-report.js +124 -0
  45. package/dist/review/portable-ids-report.js.map +1 -0
  46. package/dist/review/portable-manual-report.d.ts +66 -0
  47. package/dist/review/portable-manual-report.d.ts.map +1 -0
  48. package/dist/review/portable-manual-report.js +121 -0
  49. package/dist/review/portable-manual-report.js.map +1 -0
  50. package/dist/review/portable-report-metadata.d.ts +42 -0
  51. package/dist/review/portable-report-metadata.d.ts.map +1 -0
  52. package/dist/review/portable-report-metadata.js +41 -0
  53. package/dist/review/portable-report-metadata.js.map +1 -0
  54. package/dist/review/portable-saved-validation.d.ts +12 -0
  55. package/dist/review/portable-saved-validation.d.ts.map +1 -0
  56. package/dist/review/portable-saved-validation.js +32 -0
  57. package/dist/review/portable-saved-validation.js.map +1 -0
  58. package/dist/review/portable-validation-evidence.d.ts +53 -0
  59. package/dist/review/portable-validation-evidence.d.ts.map +1 -0
  60. package/dist/review/portable-validation-evidence.js +52 -0
  61. package/dist/review/portable-validation-evidence.js.map +1 -0
  62. package/dist/review/saved-validation.d.ts +14 -0
  63. package/dist/review/saved-validation.d.ts.map +1 -0
  64. package/dist/review/saved-validation.js +31 -0
  65. package/dist/review/saved-validation.js.map +1 -0
  66. package/dist/review.d.ts +19 -0
  67. package/dist/review.d.ts.map +1 -1
  68. package/dist/review.js +14 -0
  69. package/dist/review.js.map +1 -1
  70. package/package.json +5 -5
@@ -0,0 +1,325 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { CaptureRetention } from './capture-retention.js';
5
+ import { validationFindings } from './validation.js';
6
+ import { reviewSHA256, reviewValueFits, reviewContainsSecret } from './capture-budget.js';
7
+ function targetState(target, models) {
8
+ const live = models.find(model => model.id === target.model.id);
9
+ const replaced = !live || live.owner !== target.model.owner || live.store !== target.model.store || live.source !== target.model.source;
10
+ return { replaced, stale: replaced || live?.mutationView() !== target.view
11
+ || (target.view?.getMutationRevision() ?? 0) !== target.revision };
12
+ }
13
+ /** Actual producer-start ownership, never a reconstructed last-result fingerprint. */
14
+ export class NativeReviewCaptures {
15
+ capacity;
16
+ retention;
17
+ // Owner-local credentials never enter captures, output, errors or persistence.
18
+ credentials = new Set();
19
+ credentialBytes = 0;
20
+ credentialBound = false;
21
+ constructor(capacity = 32) {
22
+ this.capacity = capacity;
23
+ if (!Number.isSafeInteger(capacity) || capacity < 0 || capacity > 32)
24
+ throw new Error('Invalid native Review capture bound');
25
+ this.retention = new CaptureRetention(capacity);
26
+ }
27
+ /** Called only with values the actual run already resolved under its grants. */
28
+ enrollCredentials(values) {
29
+ if (this.credentialBound)
30
+ return;
31
+ if (values.length > 256) {
32
+ this.credentialBound = true;
33
+ return;
34
+ }
35
+ for (const supplied of values) {
36
+ // Bound before encoding/trimming an arbitrarily large SDK input.
37
+ if (supplied.length > 16_384) {
38
+ this.credentialBound = true;
39
+ return;
40
+ }
41
+ // Native XML text uses trim(); both exact known forms stay protected.
42
+ const normalized = supplied.trim();
43
+ for (const value of normalized === supplied ? [supplied] : [supplied, normalized]) {
44
+ if (!value || this.credentials.has(value))
45
+ continue;
46
+ const bytes = new TextEncoder().encode(value).byteLength;
47
+ if (this.credentials.size >= 128 || bytes > 16_384 || this.credentialBytes + bytes > 1_048_576) {
48
+ // Retain all previously known values and permanently fail this owner
49
+ // closed; dropping an old value would reopen an earlier capture leak.
50
+ this.credentialBound = true;
51
+ return;
52
+ }
53
+ this.credentials.add(value);
54
+ this.credentialBytes += bytes;
55
+ }
56
+ }
57
+ }
58
+ acceptsEvidence(value) {
59
+ if (this.credentialBound)
60
+ return false;
61
+ const serialized = JSON.stringify(value);
62
+ return typeof serialized === 'string'
63
+ && !reviewContainsSecret(serialized, [...this.credentials]);
64
+ }
65
+ protect(result) {
66
+ if (this.acceptsEvidence(result))
67
+ return;
68
+ result.runs = [];
69
+ result.findings = [];
70
+ result.provenance = [];
71
+ result.coverage = [];
72
+ result.latestAttempt = null;
73
+ result.availability = 'unavailable';
74
+ result.refusal = this.credentialBound ? 'work-bound' : 'sensitive-input';
75
+ }
76
+ async begin(producer, definition, models, liveModels, allowed, signal) {
77
+ if (!models.length || models.length > 64 || definition.length > 1_048_576
78
+ || models.some(m => m.id.length > 1_024 || m.name.length > 4_096)
79
+ || models.reduce((sum, m) => sum + m.source.byteLength, 0) > 67_108_864) {
80
+ this.retention.refuse([], 'work-bound');
81
+ return null;
82
+ }
83
+ if (!this.acceptsEvidence([definition, models.map(model => [model.id, model.name])])) {
84
+ this.retention.refuse([], this.credentialBound ? 'work-bound' : 'sensitive-input');
85
+ return null;
86
+ }
87
+ // Reserve before ANY proof await. Settled native contexts use a separate
88
+ // bounded role and never make this a lifetime limit on valid analysis.
89
+ const attempt = this.retention.reserve(models);
90
+ if (!attempt)
91
+ return null;
92
+ const refuse = (code) => {
93
+ this.retention.fail(attempt, code, code === 'aborted' ? 'aborted' : 'refused');
94
+ return null;
95
+ };
96
+ if (signal?.aborted)
97
+ return refuse('aborted');
98
+ if (models.some(m => !m.source.byteLength || !m.source.contentKey))
99
+ return refuse('source-unavailable');
100
+ try {
101
+ const targets = [];
102
+ for (const model of models) {
103
+ const view = model.mutationView();
104
+ const revision = view?.getMutationRevision() ?? 0;
105
+ const proof = { modelId: model.id, sourceByteLength: model.source.byteLength,
106
+ sourceSHA256: await model.source.withMaterializedAsync(reviewSHA256) };
107
+ if (model.mutationView() !== view || (view?.getMutationRevision() ?? 0) !== revision)
108
+ return refuse('target-changed');
109
+ targets.push({ model, view, revision, proof });
110
+ }
111
+ const provenance = { runId: attempt.token.runId, producer,
112
+ definitionSHA256: await reviewSHA256(new TextEncoder().encode(definition)), capturedAt: new Date().toISOString(),
113
+ sources: targets.map(x => x.proof), origin: 'captured' };
114
+ const current = liveModels();
115
+ if (signal?.aborted)
116
+ return refuse('aborted');
117
+ if (targets.some(target => !allowed(target.model.id)))
118
+ return refuse('scope');
119
+ if (current.length > 64 || targets.some(target => targetState(target, current).stale))
120
+ return refuse('target-changed');
121
+ if (!this.acceptsEvidence([definition, models.map(model => [model.id, model.name])])) {
122
+ return refuse(this.credentialBound ? 'work-bound' : 'sensitive-input');
123
+ }
124
+ // The pending reservation is still held. No await separates final
125
+ // ownership/permission checks and attaching the proven producer context.
126
+ this.retention.prepare(attempt, targets, provenance);
127
+ return attempt.token;
128
+ }
129
+ catch {
130
+ // Failures release reservations and retain no raw exception/definition.
131
+ return refuse(signal?.aborted ? 'aborted' : 'source-unavailable');
132
+ }
133
+ }
134
+ /** Release only this producer's pending reservation; never delete settled facts. */
135
+ abandon(token, reason = 'producer-failed') {
136
+ if (!token)
137
+ return;
138
+ const attempt = this.retention.pending.get(token.runId);
139
+ if (!attempt)
140
+ return;
141
+ if (attempt.token !== token)
142
+ throw new Error('Unknown native Review producer capture');
143
+ this.retention.fail(attempt, reason, reason === 'aborted' ? 'aborted' : 'failed');
144
+ }
145
+ finish(token, report) {
146
+ if (!token)
147
+ return;
148
+ const attempt = this.retention.pending.get(token.runId);
149
+ if (!attempt || attempt.token !== token || !attempt.targets || !attempt.provenance)
150
+ throw new Error('Unknown native Review producer capture');
151
+ const targets = attempt.targets;
152
+ const provenance = attempt.provenance;
153
+ if (reviewValueFits(report) && !this.acceptsEvidence(report)) {
154
+ this.retention.fail(attempt, this.credentialBound ? 'work-bound' : 'sensitive-input', 'refused');
155
+ return;
156
+ }
157
+ const targetIds = new Set(targets.map(x => x.model.id));
158
+ if (report.source.kind !== provenance.producer || !reviewValueFits(report) || report.specificationResults.length > 256
159
+ || report.modelInfo.some(x => !targetIds.has(x.modelId))
160
+ || report.specificationResults.some(spec => spec.entityResults.some(x => !targetIds.has(x.modelId)))) {
161
+ this.retention.fail(attempt, 'capture-bound', 'refused');
162
+ return;
163
+ }
164
+ const actualTargets = new Set(report.modelInfo.map(x => x.modelId));
165
+ if (actualTargets.size !== targetIds.size || [...targetIds].some(id => !actualTargets.has(id))) {
166
+ this.retention.fail(attempt, 'target-changed', 'refused');
167
+ return;
168
+ }
169
+ const facts = structuredClone(validationFindings({ report, stale: false }, targets.map(x => x.model)));
170
+ if (targets.some(x => x.revision > 0))
171
+ for (const run of facts.runs) {
172
+ // These native MCP inputs do not prove complete effective-overlay
173
+ // attributes/properties. Preserve their native rows without inventing it.
174
+ run.complete = false;
175
+ run.incomplete.push({ code: 'partial-source' });
176
+ }
177
+ const coverage = report.specificationResults.map(spec => ({ specificationId: spec.specification.id,
178
+ applicableCount: spec.applicableCount, passedCount: spec.passedCount, failedCount: spec.failedCount,
179
+ detailRows: spec.entityResults.length }));
180
+ attempt.provenance = { ...provenance, capturedAt: new Date().toISOString() };
181
+ this.retention.complete(attempt, facts, coverage);
182
+ }
183
+ async read(liveModels, allowed, project, requested = () => true) {
184
+ const result = { runs: [], findings: [], provenance: [], coverage: [], availability: 'not-run' };
185
+ if (this.capacity === 0) {
186
+ result.availability = 'unavailable';
187
+ result.refusal = 'work-bound';
188
+ }
189
+ let sourceWork = 0;
190
+ const hashes = new Map();
191
+ const pending = [];
192
+ const retained = [...this.retention.settled.values()];
193
+ for (const capture of retained) {
194
+ // A scope change suppresses the WHOLE target envelope, including totals,
195
+ // names and proof digests, even when the matching failure row is allowed.
196
+ if (capture.targets.some(x => !allowed(x.model.id))) {
197
+ result.availability = 'unavailable';
198
+ result.refusal = 'scope';
199
+ continue;
200
+ }
201
+ const selected = capture.targets.filter(target => requested(target.model.id));
202
+ if (selected.length === 0)
203
+ continue;
204
+ if (selected.length !== capture.targets.length) {
205
+ result.availability = 'unavailable';
206
+ result.refusal = 'scope';
207
+ continue;
208
+ }
209
+ let stale = false;
210
+ let replaced = false;
211
+ for (const target of capture.targets) {
212
+ const live = liveModels().find(x => x.id === target.model.id);
213
+ if (!live || live.owner !== target.model.owner || live.store !== target.model.store || live.source !== target.model.source
214
+ || live.mutationView() !== target.view || (target.view?.getMutationRevision() ?? 0) !== target.revision) {
215
+ stale = true;
216
+ if (!live || live.owner !== target.model.owner || live.store !== target.model.store || live.source !== target.model.source)
217
+ replaced = true;
218
+ continue;
219
+ }
220
+ let hash = hashes.get(live.source);
221
+ if (hash === undefined) {
222
+ sourceWork += live.source.byteLength;
223
+ if (sourceWork > 67_108_864 || !live.source.byteLength) {
224
+ result.availability = 'unavailable';
225
+ result.refusal = 'work-bound';
226
+ stale = true;
227
+ continue;
228
+ }
229
+ try {
230
+ hash = await live.source.withMaterializedAsync(reviewSHA256);
231
+ }
232
+ catch {
233
+ result.availability = 'unavailable';
234
+ result.refusal = 'source-unavailable';
235
+ stale = true;
236
+ continue;
237
+ }
238
+ hashes.set(live.source, hash);
239
+ }
240
+ if (hash !== target.proof.sourceSHA256) {
241
+ stale = true;
242
+ replaced = true;
243
+ }
244
+ }
245
+ pending.push({ capture, stale, replaced });
246
+ }
247
+ // No await follows this final live ownership/permission pass. Earlier
248
+ // captures must also be checked after later captures have finished hashing.
249
+ if (this.retention.settled.size !== retained.length
250
+ || retained.some(capture => this.retention.settled.get(capture.attempt.token.runId) !== capture)) {
251
+ return project({ runs: [], findings: [], provenance: [], coverage: [], availability: 'unavailable', refusal: 'capture-bound' });
252
+ }
253
+ if (retained.some(capture => capture.targets.some(target => !allowed(target.model.id)))) {
254
+ result.availability = 'unavailable';
255
+ result.refusal = 'scope';
256
+ }
257
+ const current = liveModels();
258
+ if (current.length > 64)
259
+ return project({ runs: [], findings: [], provenance: [], coverage: [], availability: 'unavailable', refusal: 'work-bound' });
260
+ for (const item of pending) {
261
+ const { capture } = item;
262
+ if (capture.targets.some(target => !allowed(target.model.id) || !requested(target.model.id))) {
263
+ result.availability = 'unavailable';
264
+ result.refusal = 'scope';
265
+ continue;
266
+ }
267
+ const states = capture.targets.map(target => targetState(target, current));
268
+ const stale = item.stale || states.some(state => state.stale);
269
+ const replaced = item.replaced || states.some(state => state.replaced);
270
+ const facts = structuredClone(capture.facts);
271
+ if (capture.laterFailure)
272
+ for (const run of facts.runs) {
273
+ run.temporal = 'historical';
274
+ run.complete = false;
275
+ run.incomplete.push({ code: 'check-error', detail: 'A later native producer attempt failed; these facts are earlier evidence' });
276
+ }
277
+ if (stale)
278
+ for (const run of facts.runs) {
279
+ run.complete = false;
280
+ run.incomplete.push({ code: 'stale' });
281
+ }
282
+ if (replaced)
283
+ for (const finding of facts.findings)
284
+ for (const element of finding.elements)
285
+ element.nativeUnresolved = 'unmatched';
286
+ for (const run of facts.runs) {
287
+ const oldId = run.id;
288
+ run.id = capture.attempt.token.runId;
289
+ for (const finding of facts.findings)
290
+ if (finding.run === run)
291
+ finding.id = finding.id.replace(oldId, run.id);
292
+ }
293
+ for (const run of facts.runs)
294
+ result.runs.push(run);
295
+ for (const finding of facts.findings)
296
+ result.findings.push(finding);
297
+ result.provenance.push(structuredClone(capture.provenance));
298
+ result.coverage.push({ runId: capture.attempt.token.runId, specifications: structuredClone(capture.coverage ?? []) });
299
+ if (result.availability !== 'unavailable')
300
+ result.availability = 'available';
301
+ }
302
+ const latest = this.retention.latest;
303
+ if (latest && (latest.models.length === 0 || latest.models.every(model => allowed(model.id) && requested(model.id)))) {
304
+ result.latestAttempt = { state: latest.outcome, ...(latest.refusal ? { refusal: latest.refusal } : {}),
305
+ proof: latest.provenance ? structuredClone(latest.provenance) : null };
306
+ if (latest.outcome === 'pending' || latest.refusal) {
307
+ result.availability = 'unavailable';
308
+ result.refusal = latest.refusal ?? 'producer-pending';
309
+ }
310
+ }
311
+ else {
312
+ result.latestAttempt = null;
313
+ if (latest?.models.some(model => requested(model.id))
314
+ && latest.models.some(model => !allowed(model.id) || !requested(model.id))) {
315
+ result.availability = 'unavailable';
316
+ result.refusal = 'scope';
317
+ }
318
+ }
319
+ result.retention = { policy: 'latest-successful-native-context', limit: this.capacity,
320
+ inventoryOmitted: this.retention.inventoryOmitted, omittedHistoricalRuns: null, captureRefusal: this.retention.captureRefusal };
321
+ this.protect(result);
322
+ return project(result);
323
+ }
324
+ }
325
+ //# sourceMappingURL=native-captures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-captures.js","sourceRoot":"","sources":["../../src/review/native-captures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { type FindingSourceKind } from './types.js';
2
+ import type { NativeReviewModel, NativeReviewResult } from './capture-types.js';
3
+ import type { NativeReviewCaptures } from './native-captures.js';
4
+ /** One bounded read projection used by actual Flow and MCP dispatch. */
5
+ export declare function readNativeReview(captures: NativeReviewCaptures, liveModels: () => readonly NativeReviewModel[], request: {
6
+ sources?: unknown;
7
+ modelIds?: unknown;
8
+ maxFindings?: unknown;
9
+ }, allowed: (id: string) => boolean): Promise<{
10
+ retention: {
11
+ policy: "latest-successful-native-context";
12
+ limit: number;
13
+ inventoryOmitted: boolean;
14
+ omittedHistoricalRuns: null;
15
+ captureRefusal: "capture-bound" | null;
16
+ } | null;
17
+ latestAttempt: {
18
+ state: "pending" | "succeeded" | "failed" | "aborted" | "refused" | "superseded";
19
+ refusal?: NativeReviewResult["refusal"];
20
+ proof: import("./capture-types.js").ReviewRunProvenance | null;
21
+ } | null;
22
+ findings: import("./types.js").ReviewFinding<import("./types.js").ReviewMessage>[];
23
+ runs: import("./types.js").FindingRun<import("./types.js").ReviewMessage>[];
24
+ provenance: import("./capture-types.js").ReviewRunProvenance[];
25
+ coverage: {
26
+ runId: string;
27
+ specifications: import("./capture-types.js").ReviewSpecificationCoverage[];
28
+ }[];
29
+ cards: import("./cards.js").CoordinationCard<import("./types.js").ReviewMessage>[];
30
+ totals: import("./cards.js").ReviewTotals;
31
+ sources: {
32
+ refusal?: "capture-bound" | "aborted" | "source-unavailable" | "work-bound" | "target-changed" | "scope" | "sensitive-input" | "producer-pending" | "producer-failed" | undefined;
33
+ source: FindingSourceKind;
34
+ state: string;
35
+ }[];
36
+ bounds: {
37
+ knownFindings: number | null;
38
+ omittedFindings: number | null;
39
+ rowLimit: number;
40
+ textLimit: number;
41
+ clippedTextFields: number;
42
+ knownFindingsScope: "retained-current-contexts";
43
+ nativeCoverageComplete: boolean;
44
+ presentationComplete: boolean;
45
+ };
46
+ }>;
47
+ //# sourceMappingURL=native-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-snapshot.d.ts","sourceRoot":"","sources":["../../src/review/native-snapshot.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAUjE,wEAAwE;AACxE,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,SAAS,iBAAiB,EAAE,EACnH,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO;;;;;;;;;;;;;;;;;;;;;;;;gBA0C7C,iBAAiB;;;;;;;;;;;;;GAwBhF"}
@@ -0,0 +1,98 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { buildCards } from './cards.js';
5
+ import { FINDING_SOURCE_KINDS } from './types.js';
6
+ function selectors(value, maximum) {
7
+ if (value === undefined)
8
+ return undefined;
9
+ if (!Array.isArray(value) || value.length > maximum || value.some(x => typeof x !== 'string' || x.length > 1_024)) {
10
+ throw new Error('Review selectors must be bounded string arrays');
11
+ }
12
+ return value.slice();
13
+ }
14
+ /** One bounded read projection used by actual Flow and MCP dispatch. */
15
+ export async function readNativeReview(captures, liveModels, request, allowed) {
16
+ const selected = selectors(request.sources, 5) ?? [...FINDING_SOURCE_KINDS];
17
+ if (selected.some(x => !FINDING_SOURCE_KINDS.some(kind => kind === x)))
18
+ throw new Error('Unknown Review source kind');
19
+ const requested = selectors(request.modelIds, 64);
20
+ if (requested?.some(id => !allowed(id)))
21
+ throw new Error('A requested Review model is outside the caller scope');
22
+ const cap = request.maxFindings ?? 128;
23
+ if (typeof cap !== 'number' || !Number.isSafeInteger(cap) || cap < 0 || cap > 512)
24
+ throw new Error('Review row limit must be an integer from 0 to 512');
25
+ const selectedModel = (id) => !requested || requested.includes(id);
26
+ const admitted = (id) => allowed(id) && selectedModel(id);
27
+ const scopedModels = () => liveModels().filter(model => admitted(model.id));
28
+ let scoped = scopedModels();
29
+ if (scoped.length > 64)
30
+ throw new Error('Review model enumeration exceeds the work bound');
31
+ // Projection runs synchronously inside the final capture revalidation, so
32
+ // no promise continuation can change ownership between proof and envelope.
33
+ const project = (native) => {
34
+ scoped = scopedModels();
35
+ if (native && (native.provenance.some(run => run.sources.some(source => !admitted(source.modelId)))
36
+ || native.latestAttempt?.proof?.sources.some(source => !admitted(source.modelId)))) {
37
+ native.runs = [];
38
+ native.findings = [];
39
+ native.provenance = [];
40
+ native.coverage = [];
41
+ native.latestAttempt = null;
42
+ native.availability = 'unavailable';
43
+ native.refusal = 'scope';
44
+ }
45
+ const findings = native?.findings.slice(0, cap) ?? [];
46
+ // Presentation text is bounded independently of exact native identity/counts.
47
+ let clippedTextFields = 0;
48
+ const text = (value) => {
49
+ if (value.length <= 512)
50
+ return value;
51
+ clippedTextFields++;
52
+ // Keep the UTF-16 work bound without leaving half of an actual pair.
53
+ const high = value.charCodeAt(511), low = value.charCodeAt(512);
54
+ const end = high >= 0xD800 && high <= 0xDBFF && low >= 0xDC00 && low <= 0xDFFF ? 511 : 512;
55
+ return value.slice(0, end);
56
+ };
57
+ for (const finding of findings) {
58
+ finding.title = text(finding.title);
59
+ finding.detail = finding.detail.map(text);
60
+ finding.storeys = finding.storeys.map(text);
61
+ finding.disciplines = finding.disciplines.map(text);
62
+ for (const element of finding.elements)
63
+ if (element.name !== undefined)
64
+ element.name = text(element.name);
65
+ }
66
+ for (const run of native?.runs ?? []) {
67
+ run.label = text(run.label);
68
+ for (const gap of run.incomplete)
69
+ if (gap.detail !== undefined)
70
+ gap.detail = text(gap.detail);
71
+ }
72
+ const cards = buildCards(findings, scoped);
73
+ const sources = selected.map(source => ({ source: source,
74
+ state: source === 'validation' ? native?.availability ?? 'not-run' : 'unsupported',
75
+ ...(source === 'validation' && native?.refusal ? { refusal: native.refusal } : {}) }));
76
+ const known = native && native.availability === 'available' ? native.findings.length : null;
77
+ const response = { retention: native?.retention ?? null, latestAttempt: native?.latestAttempt ?? null, findings, runs: native?.runs ?? [], provenance: native?.provenance ?? [], coverage: native?.coverage ?? [],
78
+ cards: cards.cards, totals: cards.totals, sources,
79
+ bounds: { knownFindings: known, omittedFindings: known === null ? null : known - findings.length,
80
+ rowLimit: cap, textLimit: 512, clippedTextFields, knownFindingsScope: 'retained-current-contexts',
81
+ nativeCoverageComplete: native?.availability === 'available' && !native.retention?.inventoryOmitted && native.runs.length > 0 && native.runs.every(run => run.complete),
82
+ presentationComplete: native?.availability === 'available' && native.findings.length <= cap && !clippedTextFields } };
83
+ // Card projection also reads current display metadata. Check that final
84
+ // envelope, not only the original captured rows, before returning it.
85
+ if (!captures.acceptsEvidence(response)) {
86
+ const empty = buildCards([], []);
87
+ return { retention: null, latestAttempt: null, findings: [], runs: [], provenance: [], coverage: [], cards: empty.cards, totals: empty.totals,
88
+ sources: selected.map(source => ({ source: source,
89
+ state: source === 'validation' ? 'unavailable' : 'unsupported',
90
+ ...(source === 'validation' ? { refusal: native?.refusal ?? 'sensitive-input' } : {}) })),
91
+ bounds: { knownFindings: null, omittedFindings: null, rowLimit: cap, textLimit: 512, clippedTextFields: 0, knownFindingsScope: 'retained-current-contexts',
92
+ nativeCoverageComplete: false, presentationComplete: false } };
93
+ }
94
+ return response;
95
+ };
96
+ return selected.includes('validation') ? captures.read(liveModels, allowed, project, selectedModel) : project(null);
97
+ }
98
+ //# sourceMappingURL=native-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-snapshot.js","sourceRoot":"","sources":["../../src/review/native-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** Existing bijective saved source binding shared by native Review and viewer (#7372). */
2
+ import type { SavedAnalysisRun, SavedRunModel } from './portable-analysis.js';
3
+ export interface PortableAnalysisBindingState {
4
+ models: ReadonlyMap<string, {
5
+ name: string;
6
+ sourceFingerprint?: string;
7
+ sourceContentHash?: string;
8
+ }>;
9
+ realignedFrameKey?: string | null;
10
+ hasChanges: (modelId: string) => boolean;
11
+ /** Canonical actual placement evidence, not guessed offsets or model names. */
12
+ placementMatches: (modelId: string, recorded: NonNullable<SavedRunModel['placement']>) => boolean;
13
+ }
14
+ export type BindRefusalCode = 'runEdited' | 'frameChanged' | 'modelSetChanged' | 'modelEdited' | 'sourceUnknown' | 'modelMissing' | 'modelReplaced' | 'modelAmbiguous' | 'modelMoved';
15
+ export interface BindRefusal {
16
+ code: BindRefusalCode;
17
+ model?: string;
18
+ before?: number;
19
+ open?: number;
20
+ }
21
+ /** Resolve each saved model to one open model, or every reason it cannot be. */
22
+ export declare function bindSavedAnalysisModels(saved: Pick<SavedAnalysisRun, 'models' | 'edited' | 'placementRecorded' | 'frame'>, state: PortableAnalysisBindingState): {
23
+ ok: true;
24
+ ids: Map<string, string>;
25
+ } | {
26
+ ok: false;
27
+ refusals: BindRefusal[];
28
+ };
29
+ //# sourceMappingURL=portable-analysis-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-analysis-binding.d.ts","sourceRoot":"","sources":["../../src/review/portable-analysis-binding.ts"],"names":[],"mappings":"AAIA,0FAA0F;AAC1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE9E,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtG,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,+EAA+E;IAC/E,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,KAAK,OAAO,CAAC;CACnG;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,cAAc,GAAG,iBAAiB,GAAG,aAAa,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,GAAG,YAAY,CAAC;AACtL,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAQtG,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,GAAG,mBAAmB,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,4BAA4B,GAC7J;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,CAoChF"}
@@ -0,0 +1,60 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ function sameSource(saved, open) {
5
+ // The full-content hash decides whenever both sides have it; the sampled fingerprint only when one side lacks it.
6
+ if (saved.sourceContentHash && open.sourceContentHash)
7
+ return saved.sourceContentHash === open.sourceContentHash;
8
+ return !!saved.sourceFingerprint && saved.sourceFingerprint === open.sourceFingerprint;
9
+ }
10
+ /** Resolve each saved model to one open model, or every reason it cannot be. */
11
+ export function bindSavedAnalysisModels(saved, state) {
12
+ const refusals = [];
13
+ if (saved.edited)
14
+ refusals.push({ code: 'runEdited' });
15
+ // In its session a placement-stamped run goes stale when the realignment or the open-model set changes
16
+ // (`isAnalysisStale`); a reopened run gets a fresh stamp, so either difference refuses here instead.
17
+ if (saved.frame) {
18
+ if ((state.realignedFrameKey ?? null) !== saved.frame.realignedFrameKey)
19
+ refusals.push({ code: 'frameChanged' });
20
+ if (state.models.size !== saved.frame.openModels)
21
+ refusals.push({ code: 'modelSetChanged', before: saved.frame.openModels, open: state.models.size });
22
+ }
23
+ const ids = new Map();
24
+ const claimed = new Map();
25
+ // The frame's other models are bound like the examined ones (same file, open once, unedited, unmoved), never used by the run.
26
+ for (const model of [...saved.models, ...saved.frame?.others ?? []]) {
27
+ if (!model.sourceContentHash && !model.sourceFingerprint) {
28
+ refusals.push({ code: 'sourceUnknown', model: model.name });
29
+ continue;
30
+ }
31
+ const matches = [...state.models].filter(([, open]) => sameSource(model, open)).map(([id]) => id);
32
+ if (matches.length === 0) {
33
+ refusals.push({ code: [...state.models.values()].some(open => open.name === model.name) ? 'modelReplaced' : 'modelMissing', model: model.name });
34
+ continue;
35
+ }
36
+ // Two open copies of one file, or two saved models claiming one open model: neither has an identity.
37
+ if (matches.length > 1 || claimed.has(matches[0])) {
38
+ refusals.push({ code: 'modelAmbiguous', model: model.name });
39
+ continue;
40
+ }
41
+ const id = matches[0];
42
+ claimed.set(id, model.key);
43
+ // Unsaved edits mean the open model no longer is the file its source identity names.
44
+ if (state.hasChanges(id)) {
45
+ refusals.push({ code: 'modelEdited', model: model.name });
46
+ continue;
47
+ }
48
+ if (saved.placementRecorded) {
49
+ // The caller supplies the canonical placement comparison; a missing
50
+ // recorded placement remains unknown rather than an inferred match.
51
+ if (!model.placement || !state.placementMatches(id, model.placement)) {
52
+ refusals.push({ code: 'modelMoved', model: model.name });
53
+ continue;
54
+ }
55
+ }
56
+ ids.set(model.key, id);
57
+ }
58
+ return refusals.length ? { ok: false, refusals } : { ok: true, ids };
59
+ }
60
+ //# sourceMappingURL=portable-analysis-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-analysis-binding.js","sourceRoot":"","sources":["../../src/review/portable-analysis-binding.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAgB/D,SAAS,UAAU,CAAC,KAAoB,EAAE,IAAgE;IACxG,kHAAkH;IAClH,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB;QAAE,OAAO,KAAK,CAAC,iBAAiB,KAAK,IAAI,CAAC,iBAAiB,CAAC;IACjH,OAAO,CAAC,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,iBAAiB,KAAK,IAAI,CAAC,iBAAiB,CAAC;AACzF,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,uBAAuB,CAAC,KAAkF,EAAE,KAAmC;IAE7J,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACvD,uGAAuG;IACvG,qGAAqG;IACrG,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,iBAAiB;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACjH,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,UAAU;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,8HAA8H;IAC9H,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACpI,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAClG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACjJ,SAAS;QACX,CAAC;QACD,qGAAqG;QACrG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC9H,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,qFAAqF;QACrF,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAClG,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,oEAAoE;YACpE,oEAAoE;YACpE,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,SAAS;YACX,CAAC;QACH,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvE,CAAC"}