@ifc-lite/sdk 9.3.0 → 9.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -0
- package/dist/review/capture-budget.d.ts.map +1 -1
- package/dist/review/capture-budget.js +9 -0
- package/dist/review/capture-budget.js.map +1 -1
- package/dist/review/capture-ownership.d.ts +12 -0
- package/dist/review/capture-ownership.d.ts.map +1 -0
- package/dist/review/capture-ownership.js +8 -0
- package/dist/review/capture-ownership.js.map +1 -0
- package/dist/review/capture-types.d.ts +14 -0
- package/dist/review/capture-types.d.ts.map +1 -1
- package/dist/review/cards.js +1 -1
- package/dist/review/cards.js.map +1 -1
- package/dist/review/clash-identity.d.ts +9 -0
- package/dist/review/clash-identity.d.ts.map +1 -0
- package/dist/review/clash-identity.js +18 -0
- package/dist/review/clash-identity.js.map +1 -0
- package/dist/review/clash.d.ts +25 -0
- package/dist/review/clash.d.ts.map +1 -0
- package/dist/review/clash.js +97 -0
- package/dist/review/clash.js.map +1 -0
- package/dist/review/identity.d.ts +1 -1
- package/dist/review/identity.d.ts.map +1 -1
- package/dist/review/identity.js +7 -2
- package/dist/review/identity.js.map +1 -1
- package/dist/review/native-captures.d.ts +4 -0
- package/dist/review/native-captures.d.ts.map +1 -1
- package/dist/review/native-captures.js +9 -6
- package/dist/review/native-captures.js.map +1 -1
- package/dist/review/native-identity-table.d.ts +8 -0
- package/dist/review/native-identity-table.d.ts.map +1 -0
- package/dist/review/native-identity-table.js +29 -0
- package/dist/review/native-identity-table.js.map +1 -0
- package/dist/review/portable-bindings.d.ts +7 -0
- package/dist/review/portable-bindings.d.ts.map +1 -0
- package/dist/review/portable-bindings.js +88 -0
- package/dist/review/portable-bindings.js.map +1 -0
- package/dist/review/portable-native-owners.d.ts +23 -0
- package/dist/review/portable-native-owners.d.ts.map +1 -0
- package/dist/review/portable-native-owners.js +127 -0
- package/dist/review/portable-native-owners.js.map +1 -0
- package/dist/review/portable-projection.d.ts +11 -0
- package/dist/review/portable-projection.d.ts.map +1 -0
- package/dist/review/portable-projection.js +104 -0
- package/dist/review/portable-projection.js.map +1 -0
- package/dist/review/portable-report-metadata.d.ts +1 -0
- package/dist/review/portable-report-metadata.d.ts.map +1 -1
- package/dist/review/portable-report-metadata.js +5 -2
- package/dist/review/portable-report-metadata.js.map +1 -1
- package/dist/review/portable-snapshot.d.ts +89 -0
- package/dist/review/portable-snapshot.d.ts.map +1 -0
- package/dist/review/portable-snapshot.js +164 -0
- package/dist/review/portable-snapshot.js.map +1 -0
- package/dist/review/portable-source-contract.d.ts +3 -0
- package/dist/review/portable-source-contract.d.ts.map +1 -0
- package/dist/review/portable-source-contract.js +8 -0
- package/dist/review/portable-source-contract.js.map +1 -0
- package/dist/review/portable-validation-evidence.d.ts +2 -1
- package/dist/review/portable-validation-evidence.d.ts.map +1 -1
- package/dist/review/portable-validation-evidence.js +3 -1
- package/dist/review/portable-validation-evidence.js.map +1 -1
- package/dist/review/saved-validation.d.ts +16 -0
- package/dist/review/saved-validation.d.ts.map +1 -0
- package/dist/review/saved-validation.js +31 -0
- package/dist/review/saved-validation.js.map +1 -0
- package/dist/review/types.d.ts +2 -0
- package/dist/review/types.d.ts.map +1 -1
- package/dist/review.d.ts +5 -0
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +5 -0
- package/dist/review.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-identity-table.js","sourceRoot":"","sources":["../../src/review/native-identity-table.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAK/D;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAC7C,KAAiD;IAEjD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1D,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,EAAE,cAAc,GAAG,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC9F,OAAO;QACL,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK;QAC1D,CAAC,IAAI;YACH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,eAAe,CAAC,MAAM,IAAI,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC;gBACjH,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YACD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;gBACrC,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;gBACxC,yEAAyE;gBACzE,yEAAyE;gBACzE,IAAI,WAAW,KAAK,UAAU,IAAI,WAAW,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;oBACnE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACpF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SavedAnalysisRun } from './portable-analysis.js';
|
|
2
|
+
import type { SavedValidationReport } from './portable-saved-validation.js';
|
|
3
|
+
import type { PortableOwner } from './portable-native-owners.js';
|
|
4
|
+
export type PortableBindingRefusal = 'source-identity-missing' | 'source-unmatched' | 'source-ambiguous' | 'identity-unavailable' | 'identity-unmatched' | 'identity-conflict' | 'model-edited' | 'edit-state-unknown' | 'scope-unknown' | 'unsupported-kind';
|
|
5
|
+
export declare function analysisBinding(saved: SavedAnalysisRun, owners: readonly PortableOwner[], unavailable?: ReadonlyMap<string, 'model-edited' | 'identity-unavailable'>): PortableBindingRefusal | null;
|
|
6
|
+
export declare function validationBinding(saved: SavedValidationReport, owners: readonly PortableOwner[], unavailable?: ReadonlyMap<string, 'model-edited' | 'identity-unavailable'>): PortableBindingRefusal | null;
|
|
7
|
+
//# sourceMappingURL=portable-bindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-bindings.d.ts","sourceRoot":"","sources":["../../src/review/portable-bindings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAIjE,MAAM,MAAM,sBAAsB,GAAG,yBAAyB,GAAG,kBAAkB,GAAG,kBAAkB,GACpG,sBAAsB,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,cAAc,GAAG,oBAAoB,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAiBvJ,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,EAAE,WAAW,GAAE,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,sBAAsB,CAAa,GAAG,sBAAsB,GAAG,IAAI,CAyB/M;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,EAAE,WAAW,GAAE,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,sBAAsB,CAAa,GAAG,sBAAsB,GAAG,IAAI,CAkBtN"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { isFullSourceSHA256 } from './portable-source-contract.js';
|
|
2
|
+
import { clashGlobalId } from './clash.js';
|
|
3
|
+
function source(hash, owners, unavailable) {
|
|
4
|
+
if (!isFullSourceSHA256(hash))
|
|
5
|
+
return 'source-identity-missing';
|
|
6
|
+
const matches = owners.filter(owner => owner.sourceSHA256 === hash);
|
|
7
|
+
return matches.length === 1 ? matches[0] : matches.length ? 'source-ambiguous' : unavailable.get(hash) ?? 'source-unmatched';
|
|
8
|
+
}
|
|
9
|
+
function modelScope(models, owners, unavailable) {
|
|
10
|
+
const bound = new Map();
|
|
11
|
+
const hashes = new Set();
|
|
12
|
+
for (const model of models) {
|
|
13
|
+
const owner = source(model.sourceContentHash, owners, unavailable);
|
|
14
|
+
if (typeof owner === 'string')
|
|
15
|
+
return owner;
|
|
16
|
+
if (hashes.has(owner.sourceSHA256))
|
|
17
|
+
return 'source-ambiguous';
|
|
18
|
+
hashes.add(owner.sourceSHA256);
|
|
19
|
+
bound.set(model.key, owner);
|
|
20
|
+
}
|
|
21
|
+
return bound;
|
|
22
|
+
}
|
|
23
|
+
export function analysisBinding(saved, owners, unavailable = new Map()) {
|
|
24
|
+
if (saved.edited !== false)
|
|
25
|
+
return saved.edited ? 'model-edited' : 'edit-state-unknown';
|
|
26
|
+
if (saved.examined === null || !saved.models.length || new Set(saved.examined).size !== saved.examined.length
|
|
27
|
+
|| saved.examined.length !== saved.models.length || saved.examined.some(key => !saved.models.some(model => model.key === key)))
|
|
28
|
+
return 'scope-unknown';
|
|
29
|
+
const bound = modelScope([...saved.models, ...(saved.frame?.others ?? [])], owners, unavailable);
|
|
30
|
+
if (typeof bound === 'string')
|
|
31
|
+
return bound;
|
|
32
|
+
if (saved.frame && saved.frame.openModels !== bound.size)
|
|
33
|
+
return 'scope-unknown';
|
|
34
|
+
if (saved.kind === 'validation') {
|
|
35
|
+
for (const spec of saved.report.specificationResults) {
|
|
36
|
+
for (const row of spec.entityResults) {
|
|
37
|
+
const owner = bound.get(row.modelId);
|
|
38
|
+
const actual = owner?.GlobalIds.get(row.expressId);
|
|
39
|
+
if (!actual)
|
|
40
|
+
return 'identity-unmatched';
|
|
41
|
+
if (row.globalId && actual !== row.globalId)
|
|
42
|
+
return 'identity-conflict';
|
|
43
|
+
}
|
|
44
|
+
for (const set of spec.setResults ?? [])
|
|
45
|
+
for (const member of set.members) {
|
|
46
|
+
if (!bound.get(member.modelId)?.GlobalIds.has(member.expressId))
|
|
47
|
+
return 'identity-unmatched';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else
|
|
52
|
+
for (const clash of saved.result.clashes)
|
|
53
|
+
for (const row of [clash.a, clash.b]) {
|
|
54
|
+
const actual = bound.get(row.model)?.GlobalIds.get(row.expressId);
|
|
55
|
+
if (!actual)
|
|
56
|
+
return 'identity-unmatched';
|
|
57
|
+
if (!row.key.startsWith('expressid:') && actual !== clashGlobalId(row))
|
|
58
|
+
return 'identity-conflict';
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
export function validationBinding(saved, owners, unavailable = new Map()) {
|
|
63
|
+
const scope = saved.snapshot.reportModels;
|
|
64
|
+
if (!scope?.length)
|
|
65
|
+
return 'scope-unknown';
|
|
66
|
+
const hashes = new Set();
|
|
67
|
+
for (const model of scope) {
|
|
68
|
+
const owner = source(model.sourceContentHash, owners, unavailable);
|
|
69
|
+
if (typeof owner === 'string')
|
|
70
|
+
return owner;
|
|
71
|
+
if (hashes.has(owner.sourceSHA256))
|
|
72
|
+
return 'source-ambiguous';
|
|
73
|
+
hashes.add(owner.sourceSHA256);
|
|
74
|
+
}
|
|
75
|
+
if (saved.snapshot.kind !== 'ids-report')
|
|
76
|
+
return 'unsupported-kind';
|
|
77
|
+
for (const row of saved.snapshot.elementEvidence?.rows ?? []) {
|
|
78
|
+
const owner = source(row.modelContentHash, owners, unavailable);
|
|
79
|
+
if (typeof owner === 'string')
|
|
80
|
+
return owner;
|
|
81
|
+
if (!hashes.has(owner.sourceSHA256))
|
|
82
|
+
return 'scope-unknown';
|
|
83
|
+
if (row.GlobalId === null || !owner.identities.has(row.GlobalId))
|
|
84
|
+
return 'identity-unmatched';
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=portable-bindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-bindings.js","sourceRoot":"","sources":["../../src/review/portable-bindings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { NativeReviewModel } from './capture-types.js';
|
|
2
|
+
export type PortableOwnerRefusal = 'work-bound' | 'source-unavailable' | 'target-changed' | 'scope' | 'model-edited' | 'identity-unavailable' | 'identity-ambiguous' | 'source-ambiguous' | 'aborted';
|
|
3
|
+
export interface PortableOwner {
|
|
4
|
+
model: NativeReviewModel;
|
|
5
|
+
sourceSHA256: string;
|
|
6
|
+
/** Complete, duplicate-checked actual rows, never a last-write point lookup. */
|
|
7
|
+
identities: ReadonlyMap<string, number>;
|
|
8
|
+
GlobalIds: ReadonlyMap<number, string>;
|
|
9
|
+
}
|
|
10
|
+
type OwnerResult<T> = {
|
|
11
|
+
ok: true;
|
|
12
|
+
value: T;
|
|
13
|
+
} | {
|
|
14
|
+
ok: false;
|
|
15
|
+
refusal: PortableOwnerRefusal;
|
|
16
|
+
};
|
|
17
|
+
/** Read-only source binding does not attest that an imported producer ran.
|
|
18
|
+
* All target leases are acquired synchronously before the FIRST source await.
|
|
19
|
+
* Projection stays inside the final lease/permission check's synchronous turn.
|
|
20
|
+
*/
|
|
21
|
+
export declare function withPortableOwners<T>(liveModels: () => readonly NativeReviewModel[], allowed: (id: string) => boolean, project: (owners: readonly PortableOwner[], unavailable: ReadonlyMap<string, 'model-edited' | 'identity-unavailable'>) => T, signal?: AbortSignal): Promise<OwnerResult<T>>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=portable-native-owners.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-native-owners.d.ts","sourceRoot":"","sources":["../../src/review/portable-native-owners.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,OAAO,GAC/F,cAAc,GAAG,sBAAsB,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,SAAS,CAAC;AACpG,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,iBAAiB,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAMD,KAAK,WAAW,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAG5F;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,SAAS,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,EAC1H,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAM5K"}
|
|
@@ -0,0 +1,127 @@
|
|
|
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 { reviewSHA256 } from './capture-budget.js';
|
|
5
|
+
import { targetState } from './capture-ownership.js';
|
|
6
|
+
const refused = (refusal) => ({ ok: false, refusal });
|
|
7
|
+
/** Read-only source binding does not attest that an imported producer ran.
|
|
8
|
+
* All target leases are acquired synchronously before the FIRST source await.
|
|
9
|
+
* Projection stays inside the final lease/permission check's synchronous turn.
|
|
10
|
+
*/
|
|
11
|
+
export async function withPortableOwners(liveModels, allowed, project, signal) {
|
|
12
|
+
try {
|
|
13
|
+
return await readOwners(liveModels, allowed, project, signal);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
console.warn('Portable Review ownership is unavailable; imported evidence remains unbound.');
|
|
17
|
+
return refused(signal?.aborted ? 'aborted' : 'source-unavailable');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function readOwners(liveModels, allowed, project, signal) {
|
|
21
|
+
const models = liveModels();
|
|
22
|
+
// The same model/source/value bounds as native Review. No partial index.
|
|
23
|
+
if (models.length > 64 || models.some(model => model.id.length > 1_024 || model.name.length > 4_096)
|
|
24
|
+
|| models.reduce((sum, model) => sum + model.source.byteLength, 0) > 67_108_864)
|
|
25
|
+
return refused('work-bound');
|
|
26
|
+
if (new Set(models.map(model => model.id)).size !== models.length)
|
|
27
|
+
return refused('identity-ambiguous');
|
|
28
|
+
const targets = [];
|
|
29
|
+
let declaredRows = 0;
|
|
30
|
+
for (const model of models) {
|
|
31
|
+
if (!allowed(model.id))
|
|
32
|
+
return refused('scope');
|
|
33
|
+
const view = model.mutationView(), revision = view?.getMutationRevision() ?? 0;
|
|
34
|
+
const identity = model.identityTable;
|
|
35
|
+
if (identity && (!Number.isSafeInteger(identity.count) || identity.count < 0))
|
|
36
|
+
return refused('identity-unavailable');
|
|
37
|
+
declaredRows += identity?.count ?? 0;
|
|
38
|
+
if (declaredRows > 100_000)
|
|
39
|
+
return refused('work-bound');
|
|
40
|
+
targets.push({ model, view, revision, identity, sourceBytes: model.source.byteLength, sourceKey: model.source.contentKey });
|
|
41
|
+
}
|
|
42
|
+
const ownership = () => {
|
|
43
|
+
if (signal?.aborted)
|
|
44
|
+
return 'aborted';
|
|
45
|
+
const current = liveModels();
|
|
46
|
+
if (current.length !== models.length || current.length > 64)
|
|
47
|
+
return 'target-changed';
|
|
48
|
+
for (const target of targets) {
|
|
49
|
+
if (!allowed(target.model.id))
|
|
50
|
+
return 'scope';
|
|
51
|
+
const live = current.find(model => model.id === target.model.id);
|
|
52
|
+
if (targetState(target, current).stale || !live
|
|
53
|
+
|| live.source.byteLength !== target.sourceBytes || live.source.contentKey !== target.sourceKey
|
|
54
|
+
|| (!!live.identityTable !== !!target.identity)
|
|
55
|
+
|| (target.identity && (live.identityTable?.owner !== target.identity.owner
|
|
56
|
+
|| live.identityTable.count !== target.identity.count
|
|
57
|
+
|| live.identityTable.expressIdColumn !== target.identity.expressIdColumn
|
|
58
|
+
|| live.identityTable.GlobalIdColumn !== target.identity.GlobalIdColumn
|
|
59
|
+
|| live.identityTable.stringTable !== target.identity.stringTable)))
|
|
60
|
+
return 'target-changed';
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
};
|
|
64
|
+
const owners = [];
|
|
65
|
+
const hashes = new Set();
|
|
66
|
+
const unavailable = new Map();
|
|
67
|
+
let rows = 0, identityText = 0;
|
|
68
|
+
try {
|
|
69
|
+
for (const target of targets) {
|
|
70
|
+
const before = ownership();
|
|
71
|
+
if (before)
|
|
72
|
+
return refused(before);
|
|
73
|
+
// Unprovable peers remain leased but cannot bind supplied records.
|
|
74
|
+
if (!target.sourceBytes || !target.sourceKey)
|
|
75
|
+
continue;
|
|
76
|
+
const sourceSHA256 = await target.model.source.withMaterializedAsync(reviewSHA256);
|
|
77
|
+
const after = ownership();
|
|
78
|
+
if (after)
|
|
79
|
+
return refused(after);
|
|
80
|
+
if (hashes.has(sourceSHA256))
|
|
81
|
+
return refused('source-ambiguous');
|
|
82
|
+
hashes.add(sourceSHA256);
|
|
83
|
+
// Source-bearing ineligible peers still participate in collision checks.
|
|
84
|
+
const identity = target.identity;
|
|
85
|
+
if (target.revision !== 0 || !identity) {
|
|
86
|
+
unavailable.set(sourceSHA256, target.revision !== 0 ? 'model-edited' : 'identity-unavailable');
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const identities = new Map(), GlobalIds = new Map(), expressIds = new Set();
|
|
90
|
+
let modelRows = 0;
|
|
91
|
+
for (const row of identity.rows()) {
|
|
92
|
+
if (++rows > 100_000 || ++modelRows > identity.count)
|
|
93
|
+
return refused('work-bound');
|
|
94
|
+
if (!Number.isSafeInteger(row.expressId) || row.expressId <= 0 || typeof row.GlobalId !== 'string'
|
|
95
|
+
|| row.GlobalId.length > 200)
|
|
96
|
+
return refused('identity-unavailable');
|
|
97
|
+
if ((identityText += row.GlobalId.length) > 1_048_576)
|
|
98
|
+
return refused('work-bound');
|
|
99
|
+
if (expressIds.has(row.expressId))
|
|
100
|
+
return refused('identity-ambiguous');
|
|
101
|
+
expressIds.add(row.expressId);
|
|
102
|
+
// Non-root entities legitimately have no IFC GlobalId.
|
|
103
|
+
if (!row.GlobalId)
|
|
104
|
+
continue;
|
|
105
|
+
if (identities.has(row.GlobalId))
|
|
106
|
+
return refused('identity-ambiguous');
|
|
107
|
+
identities.set(row.GlobalId, row.expressId);
|
|
108
|
+
GlobalIds.set(row.expressId, row.GlobalId);
|
|
109
|
+
}
|
|
110
|
+
if (modelRows !== identity.count)
|
|
111
|
+
return refused('identity-unavailable');
|
|
112
|
+
owners.push({ model: target.model, sourceSHA256, identities, GlobalIds });
|
|
113
|
+
}
|
|
114
|
+
const final = ownership();
|
|
115
|
+
if (final)
|
|
116
|
+
return refused(final);
|
|
117
|
+
const value = project(owners, unavailable);
|
|
118
|
+
const projected = ownership();
|
|
119
|
+
return projected ? refused(projected) : { ok: true, value };
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// No source/adapter exception or unauthorized name leaves this boundary.
|
|
123
|
+
console.warn('Portable Review source or identity read failed; imported evidence remains unbound.');
|
|
124
|
+
return refused(signal?.aborted ? 'aborted' : 'source-unavailable');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=portable-native-owners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-native-owners.js","sourceRoot":"","sources":["../../src/review/portable-native-owners.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAA2B,MAAM,wBAAwB,CAAC;AAkB9E,MAAM,OAAO,GAAG,CAAC,OAA6B,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAY,CAAA,CAAC;AAErF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAI,UAA8C,EAAE,OAAgC,EAC1H,OAA2H,EAAE,MAAoB;IACjJ,IAAI,CAAC;QAAC,OAAO,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IACtE,MAAM,CAAC;QACL,OAAO,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;QAC7F,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AACD,KAAK,UAAU,UAAU,CAAI,UAA8C,EAAE,OAAgC,EAC3G,OAA2H,EAAE,MAAoB;IACjJ,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,yEAAyE;IACzE,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;WAC/F,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,UAAU;QAAE,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC;IAChH,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxG,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,EAAE,QAAQ,GAAG,IAAI,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC;QACrC,IAAI,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACtH,YAAY,IAAI,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC;QACrC,IAAI,YAAY,GAAG,OAAO;YAAE,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9H,CAAC;IACD,MAAM,SAAS,GAAG,GAAgC,EAAE;QAClD,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,SAAS,CAAC;QACtC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,gBAAgB,CAAC;QACrF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,OAAO,OAAO,CAAC;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjE,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI;mBAC1C,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,SAAS;mBAC5F,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;mBAC5C,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,MAAM,CAAC,QAAQ,CAAC,KAAK;uBACtE,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,MAAM,CAAC,QAAQ,CAAC,KAAK;uBAClD,IAAI,CAAC,aAAa,CAAC,eAAe,KAAK,MAAM,CAAC,QAAQ,CAAC,eAAe;uBACtE,IAAI,CAAC,aAAa,CAAC,cAAc,KAAK,MAAM,CAAC,QAAQ,CAAC,cAAc;uBACpE,IAAI,CAAC,aAAa,CAAC,WAAW,KAAK,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAAE,OAAO,gBAAgB,CAAC;QACnG,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmD,CAAC;IAC/E,IAAI,IAAI,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,IAAI,MAAM;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,mEAAmE;YACnE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,SAAS;YACvD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;YACnF,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,IAAI,KAAK;gBAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;gBAAE,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACjE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACzB,yEAAyE;YACzE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;gBAC/F,SAAS;YACX,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,EAAE,SAAS,GAAG,IAAI,GAAG,EAAkB,EAAE,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;YACpH,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClC,IAAI,EAAE,IAAI,GAAG,OAAO,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC,KAAK;oBAAE,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC;gBACnF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;uBAC7F,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG;oBAAE,OAAO,OAAO,CAAC,sBAAsB,CAAC,CAAC;gBACvE,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS;oBAAE,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC;gBACpF,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC;gBACxE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC9B,uDAAuD;gBACvD,IAAI,CAAC,GAAG,CAAC,QAAQ;oBAAE,SAAS;gBAC5B,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC;gBACvE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5C,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,SAAS,KAAK,QAAQ,CAAC,KAAK;gBAAE,OAAO,OAAO,CAAC,sBAAsB,CAAC,CAAC;YACzE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,KAAK;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,OAAO,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;QACnG,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SavedAnalysisRun } from './portable-analysis.js';
|
|
2
|
+
import type { SavedValidationReport } from './portable-saved-validation.js';
|
|
3
|
+
import type { PortableOwner } from './portable-native-owners.js';
|
|
4
|
+
import type { FindingSourceResult } from './types.js';
|
|
5
|
+
/** Shared canonical adapters, with no mutation of the supplied decoded wire. */
|
|
6
|
+
export declare function projectPortableAnalysis(saved: SavedAnalysisRun, owners: readonly PortableOwner[]): FindingSourceResult;
|
|
7
|
+
/** Saved failure evidence keeps its recorded detail, gaps and identity. A
|
|
8
|
+
* name/fingerprint match alone cannot bind an imported row to a live source.
|
|
9
|
+
*/
|
|
10
|
+
export declare function projectPortableValidation(saved: SavedValidationReport, owners: readonly PortableOwner[]): FindingSourceResult;
|
|
11
|
+
//# sourceMappingURL=portable-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-projection.d.ts","sourceRoot":"","sources":["../../src/review/portable-projection.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAA8B,MAAM,YAAY,CAAC;AA0ClF,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,mBAAmB,CAmCtH;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,mBAAmB,CAkB7H"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { clashFindings } from './clash.js';
|
|
2
|
+
import { validationFindings } from './validation.js';
|
|
3
|
+
import { savedValidationFacts } from './saved-validation.js';
|
|
4
|
+
/** These models are aliases within the imported wire, not live model ids.
|
|
5
|
+
* Only a verified full source hash binds them to actual columnar identities.
|
|
6
|
+
*/
|
|
7
|
+
function analysisModels(saved, owners) {
|
|
8
|
+
return saved.models.map(model => {
|
|
9
|
+
const owner = owners.find(item => item.sourceSHA256 === model.sourceContentHash);
|
|
10
|
+
return { id: model.key, name: owner?.model.name ?? model.name,
|
|
11
|
+
...(owner ? { sourceIdentity: owner.sourceSHA256 } : {}),
|
|
12
|
+
expressIdOf: GlobalId => owner?.identities.get(GlobalId) ?? 0,
|
|
13
|
+
globalIdOf: expressId => owner?.GlobalIds.get(expressId) ?? '',
|
|
14
|
+
...(owner?.model.storeyOf ? { storeyOf: (expressId) => owner.model.storeyOf?.(expressId) ?? null } : {}) };
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/** Preserve native evidence and statuses; import never attests a new run or
|
|
18
|
+
* turns saved freshness/currentness into independent evaluation.
|
|
19
|
+
*/
|
|
20
|
+
function historical(result, id, capturedAt) {
|
|
21
|
+
const runs = result.runs.map(run => ({ ...run, id, capturedAt, temporal: 'historical', complete: false,
|
|
22
|
+
incomplete: [...run.incomplete, ...(run.incomplete.some(gap => gap.code === 'partial-source'
|
|
23
|
+
&& gap.detail === 'Imported history is not independent native execution.') ? [] : [{ code: 'partial-source',
|
|
24
|
+
detail: 'Imported history is not independent native execution.' }])] }));
|
|
25
|
+
const findings = result.findings.map(finding => {
|
|
26
|
+
const index = result.runs.indexOf(finding.run), run = runs[index];
|
|
27
|
+
if (!run)
|
|
28
|
+
throw new Error('Imported Review run ownership is unavailable');
|
|
29
|
+
return { ...finding, id: JSON.stringify([id, finding.id]), run, lifecycle: 'not-evaluated' };
|
|
30
|
+
});
|
|
31
|
+
return { runs, findings };
|
|
32
|
+
}
|
|
33
|
+
function missingIdentity(finding, models) {
|
|
34
|
+
return { ...finding, elements: finding.elements.map(element => {
|
|
35
|
+
const model = models.find(item => item.id === element.modelId);
|
|
36
|
+
const expressId = model?.expressIdOf(element.globalId) ?? 0;
|
|
37
|
+
const recorded = finding.evidence.kind === 'validation' ? finding.evidence.expressId : null;
|
|
38
|
+
return model?.sourceIdentity && expressId > 0 && (recorded === null || recorded === expressId) ? { ...element }
|
|
39
|
+
: { ...element, modelId: null, nativeUnresolved: 'unmatched' };
|
|
40
|
+
}) };
|
|
41
|
+
}
|
|
42
|
+
/** Shared canonical adapters, with no mutation of the supplied decoded wire. */
|
|
43
|
+
export function projectPortableAnalysis(saved, owners) {
|
|
44
|
+
const models = analysisModels(saved, owners);
|
|
45
|
+
let result;
|
|
46
|
+
if (saved.kind === 'validation') {
|
|
47
|
+
result = validationFindings({ report: { ...saved.report, timestamp: new Date(saved.report.timestamp) }, stale: false }, models);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// The canonical baseline adapter consumes no renderer geometry. `ref`
|
|
51
|
+
// retains the recorded local EXPRESS id; it is never an invented offset.
|
|
52
|
+
const native = { ...saved.result, clashes: saved.result.clashes.map(clash => ({ ...clash,
|
|
53
|
+
a: { ...clash.a, ref: clash.a.expressId }, b: { ...clash.b, ref: clash.b.expressId },
|
|
54
|
+
distance: typeof clash.distance === 'number' ? clash.distance : Number(clash.distance) })) };
|
|
55
|
+
result = clashFindings({ current: null, baseline: { result: native,
|
|
56
|
+
modelNames: Object.fromEntries(saved.models.map(model => [model.key, model.name])), takenAt: Date.parse(saved.capturedAt) } }, models);
|
|
57
|
+
// The baseline adapter intentionally emits no live model id. Rebind each
|
|
58
|
+
// occurrence only via its original saved model key and full source proof.
|
|
59
|
+
result.findings = result.findings.map((finding, index) => ({ ...finding,
|
|
60
|
+
elements: finding.elements.map((element, side) => {
|
|
61
|
+
const ref = side === 0 ? saved.result.clashes[index].a : saved.result.clashes[index].b;
|
|
62
|
+
const model = models.find(item => item.id === ref.model);
|
|
63
|
+
const actualGuid = model?.globalIdOf(ref.expressId) ?? '';
|
|
64
|
+
const recordedGuid = ref.key.startsWith('expressid:') ? '' : element.globalId;
|
|
65
|
+
return { ...element, globalId: recordedGuid || actualGuid, modelId: ref.model,
|
|
66
|
+
...(!actualGuid || (recordedGuid && recordedGuid !== actualGuid)
|
|
67
|
+
? { modelId: null, nativeUnresolved: 'unmatched' } : {}) };
|
|
68
|
+
}) }));
|
|
69
|
+
}
|
|
70
|
+
result.findings = result.findings.map(finding => {
|
|
71
|
+
const checked = missingIdentity(finding, models);
|
|
72
|
+
return { ...checked, elements: checked.elements.map(element => {
|
|
73
|
+
const savedModel = saved.models.find(model => model.key === element.modelId);
|
|
74
|
+
const owner = owners.find(item => item.sourceSHA256 === savedModel?.sourceContentHash);
|
|
75
|
+
return { ...element, modelId: owner?.model.id ?? null };
|
|
76
|
+
}) };
|
|
77
|
+
});
|
|
78
|
+
return historical(result, JSON.stringify(['imported-analysis', saved.id]), saved.capturedAt);
|
|
79
|
+
}
|
|
80
|
+
/** Saved failure evidence keeps its recorded detail, gaps and identity. A
|
|
81
|
+
* name/fingerprint match alone cannot bind an imported row to a live source.
|
|
82
|
+
*/
|
|
83
|
+
export function projectPortableValidation(saved, owners) {
|
|
84
|
+
const result = savedValidationFacts(saved, { identityAvailable: row => !!row.GlobalId
|
|
85
|
+
&& !!owners.find(owner => owner.sourceSHA256 === row.modelContentHash)?.identities.has(row.GlobalId) });
|
|
86
|
+
if (saved.snapshot.kind !== 'ids-report')
|
|
87
|
+
return result;
|
|
88
|
+
const rows = saved.snapshot.elementEvidence?.rows ?? [];
|
|
89
|
+
result.findings = result.findings.map((finding, index) => {
|
|
90
|
+
const row = rows[index];
|
|
91
|
+
const owner = row?.modelContentHash ? owners.find(item => item.sourceSHA256 === row.modelContentHash) : undefined;
|
|
92
|
+
return { ...finding, elements: finding.elements.map(element => {
|
|
93
|
+
if (!owner || !owner.identities.has(element.globalId))
|
|
94
|
+
return { ...element, modelId: null, nativeUnresolved: 'unmatched' };
|
|
95
|
+
const bound = { ...element, modelId: owner.model.id, modelName: owner.model.name };
|
|
96
|
+
// The legacy adapter's missing-name marker is not a native identity
|
|
97
|
+
// failure. Full source/GUID proof binds independently of display names.
|
|
98
|
+
delete bound.nativeUnresolved;
|
|
99
|
+
return bound;
|
|
100
|
+
}) };
|
|
101
|
+
});
|
|
102
|
+
return historical(result, JSON.stringify(['imported-saved-validation', saved.id]), saved.snapshot.generatedAt);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=portable-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-projection.js","sourceRoot":"","sources":["../../src/review/portable-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,7 @@ export declare function validateBlockTitle(block: Record<string, unknown>, at: s
|
|
|
26
26
|
export interface ReportModelScope {
|
|
27
27
|
name: string;
|
|
28
28
|
fingerprint?: string;
|
|
29
|
+
sourceContentHash?: string;
|
|
29
30
|
}
|
|
30
31
|
/** The author's choice to print or omit a report's stamp rows (#6566, #6678).
|
|
31
32
|
* Absent means shown, so every document saved before the choice printed the same. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portable-report-metadata.d.ts","sourceRoot":"","sources":["../../src/review/portable-report-metadata.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"portable-report-metadata.d.ts","sourceRoot":"","sources":["../../src/review/portable-report-metadata.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEpH,MAAM,WAAW,6BAA6B;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAEhF,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE1D;AAED,2GAA2G;AAC3G,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,6GAA6G;AAC7G,MAAM,WAAW,sBAAsB;IACrC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sGAAsG;IACtG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,0FAA0F;AAC1F,MAAM,WAAW,UAAW,SAAQ,sBAAsB;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,6BAA6B,EAAE,GAAG,IAAI,CAS5H;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE;AACpG;qFACqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,UAAU,CAAC,EAAE,0BAA0B,CAAC;IACxC,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,6BAA6B,EAAE,GAAG,IAAI,CAelI"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
import { isAutomationReportProvenance } from './portable-automation-provenance.js';
|
|
5
|
+
import { isFullSourceSHA256 } from './portable-source-contract.js';
|
|
5
6
|
/** Opaque sRGB document colours; named/alpha/short forms are intentionally excluded. */
|
|
6
7
|
export function isRgbColor(value) {
|
|
7
8
|
return typeof value === 'string' && /^#[0-9a-f]{6}$/i.test(value);
|
|
@@ -34,8 +35,10 @@ export function validateReportProvenance(block, at, errors) {
|
|
|
34
35
|
if (typeof model !== 'object' || model === null || Array.isArray(model))
|
|
35
36
|
return false;
|
|
36
37
|
const m = model;
|
|
37
|
-
return typeof m.name === 'string' && m.name.trim().length > 0
|
|
38
|
+
return typeof m.name === 'string' && m.name.trim().length > 0
|
|
39
|
+
&& (m.fingerprint === undefined || (typeof m.fingerprint === 'string' && m.fingerprint.length > 0))
|
|
40
|
+
&& (m.sourceContentHash === undefined || isFullSourceSHA256(m.sourceContentHash));
|
|
38
41
|
})))
|
|
39
|
-
errors.push({ path: `${at}.reportModels`, message: 'expected non-empty model names
|
|
42
|
+
errors.push({ path: `${at}.reportModels`, message: 'expected non-empty model names, optional non-empty fingerprints and optional lowercase 64-hex sourceContentHash' });
|
|
40
43
|
}
|
|
41
44
|
//# sourceMappingURL=portable-report-metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portable-report-metadata.js","sourceRoot":"","sources":["../../src/review/portable-report-metadata.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,4BAA4B,EAAmC,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"portable-report-metadata.js","sourceRoot":"","sources":["../../src/review/portable-report-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { NativeReviewModel } from './capture-types.js';
|
|
2
|
+
import type { NativeReviewCaptures } from './native-captures.js';
|
|
3
|
+
import { type SavedAnalysisRun } from './portable-analysis.js';
|
|
4
|
+
import { type SavedValidationReport } from './portable-saved-validation.js';
|
|
5
|
+
import { type FindingSourceKind, type ReviewFinding, type FindingRun } from './types.js';
|
|
6
|
+
export interface PortableReviewRequest {
|
|
7
|
+
sources?: unknown;
|
|
8
|
+
modelIds?: unknown;
|
|
9
|
+
maxFindings?: unknown;
|
|
10
|
+
savedAnalysisRuns?: unknown;
|
|
11
|
+
savedValidationReports?: unknown;
|
|
12
|
+
}
|
|
13
|
+
/** Supplied records remain imported history, even when full source bytes and GUIDs bind.
|
|
14
|
+
* No producer, storage, editor, reconciliation or publication is invoked here.
|
|
15
|
+
*/
|
|
16
|
+
export declare function readPortableReview(captures: NativeReviewCaptures, liveModels: () => readonly NativeReviewModel[], request: PortableReviewRequest, allowed: (id: string) => boolean): Promise<{
|
|
17
|
+
origin: "imported";
|
|
18
|
+
retention: null;
|
|
19
|
+
latestAttempt: null;
|
|
20
|
+
findings: ReviewFinding[];
|
|
21
|
+
runs: FindingRun[];
|
|
22
|
+
provenance: never[];
|
|
23
|
+
coverage: never[];
|
|
24
|
+
records: Array<{
|
|
25
|
+
format: string;
|
|
26
|
+
value: SavedAnalysisRun | SavedValidationReport;
|
|
27
|
+
}>;
|
|
28
|
+
bindings: Array<{
|
|
29
|
+
id: string;
|
|
30
|
+
format: string;
|
|
31
|
+
state: string;
|
|
32
|
+
refusal: string | null;
|
|
33
|
+
}>;
|
|
34
|
+
cards: import("./cards.js").CoordinationCard<import("./types.js").ReviewMessage>[];
|
|
35
|
+
totals: import("./cards.js").ReviewTotals;
|
|
36
|
+
sources: {
|
|
37
|
+
source: FindingSourceKind;
|
|
38
|
+
state: string;
|
|
39
|
+
refusal: string;
|
|
40
|
+
}[];
|
|
41
|
+
bounds: {
|
|
42
|
+
knownFindings: number | null;
|
|
43
|
+
omittedFindings: number | null;
|
|
44
|
+
rowLimit: number;
|
|
45
|
+
textLimit: number;
|
|
46
|
+
clippedTextFields: number;
|
|
47
|
+
knownFindingsScope: "supplied-historical-records";
|
|
48
|
+
nativeCoverageComplete: boolean;
|
|
49
|
+
presentationComplete: boolean;
|
|
50
|
+
};
|
|
51
|
+
} | {
|
|
52
|
+
findings: ReviewFinding<import("./types.js").ReviewMessage>[];
|
|
53
|
+
runs: FindingRun<import("./types.js").ReviewMessage>[];
|
|
54
|
+
bindings: {
|
|
55
|
+
id: string;
|
|
56
|
+
format: string;
|
|
57
|
+
state: string;
|
|
58
|
+
refusal: string | null;
|
|
59
|
+
}[];
|
|
60
|
+
records: ({
|
|
61
|
+
format: string;
|
|
62
|
+
value: SavedAnalysisRun;
|
|
63
|
+
} | {
|
|
64
|
+
format: string;
|
|
65
|
+
value: SavedValidationReport;
|
|
66
|
+
})[];
|
|
67
|
+
cards: import("./cards.js").CoordinationCard<import("./types.js").ReviewMessage>[];
|
|
68
|
+
totals: import("./cards.js").ReviewTotals;
|
|
69
|
+
sources: {
|
|
70
|
+
source: FindingSourceKind;
|
|
71
|
+
state: string;
|
|
72
|
+
}[];
|
|
73
|
+
bounds: {
|
|
74
|
+
knownFindings: number | null;
|
|
75
|
+
omittedFindings: number | null;
|
|
76
|
+
rowLimit: number;
|
|
77
|
+
textLimit: number;
|
|
78
|
+
clippedTextFields: number;
|
|
79
|
+
knownFindingsScope: "supplied-historical-records";
|
|
80
|
+
nativeCoverageComplete: boolean;
|
|
81
|
+
presentationComplete: boolean;
|
|
82
|
+
};
|
|
83
|
+
origin: "imported";
|
|
84
|
+
retention: null;
|
|
85
|
+
latestAttempt: null;
|
|
86
|
+
provenance: never[];
|
|
87
|
+
coverage: never[];
|
|
88
|
+
}>;
|
|
89
|
+
//# sourceMappingURL=portable-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-snapshot.d.ts","sourceRoot":"","sources":["../../src/review/portable-snapshot.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAIjG,OAAO,EAAwB,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAA4B,MAAM,YAAY,CAAC;AAEzI,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC/D;AAaD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,SAAS,iBAAiB,EAAE,EACrH,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO;;;;cAU8B,aAAa,EAAE;UAAc,UAAU,EAAE;;;aACtF,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,gBAAgB,GAAG,qBAAqB,CAAA;KAAE,CAAC;cAAkB,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;;;;gBAEhK,iBAAiB;;;;;uBACrC,MAAM,GAAG,IAAI;yBAA2B,MAAM,GAAG,IAAI;;;;;;;;;;;;YA4BH,MAAM;gBAAU,MAAM;eAAS,MAAM;iBAAW,MAAM,GAAG,IAAI;;;;;;;;;;;;gBA4D3F,iBAAiB;;;;;;;;;;;;;;;;;;GAY3E"}
|