@ifc-lite/sdk 9.0.0 → 9.3.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 +60 -0
- package/dist/cost-store-backend.d.ts +2 -0
- package/dist/cost-store-backend.d.ts.map +1 -1
- package/dist/cost-store-backend.js.map +1 -1
- package/dist/group-store-backend.d.ts +5 -0
- package/dist/group-store-backend.d.ts.map +1 -0
- package/dist/group-store-backend.js +43 -0
- package/dist/group-store-backend.js.map +1 -0
- package/dist/headless-mutate.d.ts +0 -10
- package/dist/headless-mutate.d.ts.map +1 -1
- package/dist/headless-mutate.js +8 -2
- package/dist/headless-mutate.js.map +1 -1
- package/dist/host.d.ts +2 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +34 -11
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +6 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/namespaces/ids-authoring.d.ts +74 -0
- package/dist/namespaces/ids-authoring.d.ts.map +1 -0
- package/dist/namespaces/ids-authoring.js +99 -0
- package/dist/namespaces/ids-authoring.js.map +1 -0
- package/dist/namespaces/ids.d.ts +4 -0
- package/dist/namespaces/ids.d.ts.map +1 -1
- package/dist/namespaces/ids.js +11 -0
- package/dist/namespaces/ids.js.map +1 -1
- package/dist/namespaces/mutate.d.ts +3 -3
- package/dist/namespaces/mutate.d.ts.map +1 -1
- package/dist/namespaces/mutate.js +7 -3
- package/dist/namespaces/mutate.js.map +1 -1
- package/dist/namespaces/store-group.d.ts +9 -0
- package/dist/namespaces/store-group.d.ts.map +1 -0
- package/dist/namespaces/store-group.js +31 -0
- package/dist/namespaces/store-group.js.map +1 -0
- package/dist/namespaces/store-modelling.d.ts +42 -1
- package/dist/namespaces/store-modelling.d.ts.map +1 -1
- package/dist/namespaces/store-modelling.js +119 -0
- package/dist/namespaces/store-modelling.js.map +1 -1
- package/dist/namespaces/store.d.ts +14 -13
- package/dist/namespaces/store.d.ts.map +1 -1
- package/dist/namespaces/store.js +10 -9
- package/dist/namespaces/store.js.map +1 -1
- package/dist/review/bcf.d.ts +10 -0
- package/dist/review/bcf.d.ts.map +1 -0
- package/dist/review/bcf.js +33 -0
- package/dist/review/bcf.js.map +1 -0
- package/dist/review/capture-budget.d.ts +6 -0
- package/dist/review/capture-budget.d.ts.map +1 -0
- package/dist/review/capture-budget.js +47 -0
- package/dist/review/capture-budget.js.map +1 -0
- package/dist/review/capture-retention.d.ts +47 -0
- package/dist/review/capture-retention.d.ts.map +1 -0
- package/dist/review/capture-retention.js +141 -0
- package/dist/review/capture-retention.js.map +1 -0
- package/dist/review/capture-types.d.ts +57 -0
- package/dist/review/capture-types.d.ts.map +1 -0
- package/dist/review/capture-types.js +5 -0
- package/dist/review/capture-types.js.map +1 -0
- package/dist/review/cards.d.ts +60 -0
- package/dist/review/cards.d.ts.map +1 -0
- package/dist/review/cards.js +90 -0
- package/dist/review/cards.js.map +1 -0
- package/dist/review/disciplines.d.ts +3 -0
- package/dist/review/disciplines.d.ts.map +1 -0
- package/dist/review/disciplines.js +10 -0
- package/dist/review/disciplines.js.map +1 -0
- package/dist/review/identity.d.ts +27 -0
- package/dist/review/identity.d.ts.map +1 -0
- package/dist/review/identity.js +42 -0
- package/dist/review/identity.js.map +1 -0
- package/dist/review/native-captures.d.ts +21 -0
- package/dist/review/native-captures.d.ts.map +1 -0
- package/dist/review/native-captures.js +325 -0
- package/dist/review/native-captures.js.map +1 -0
- package/dist/review/native-snapshot.d.ts +47 -0
- package/dist/review/native-snapshot.d.ts.map +1 -0
- package/dist/review/native-snapshot.js +98 -0
- package/dist/review/native-snapshot.js.map +1 -0
- package/dist/review/portable-analysis-binding.d.ts +29 -0
- package/dist/review/portable-analysis-binding.d.ts.map +1 -0
- package/dist/review/portable-analysis-binding.js +60 -0
- package/dist/review/portable-analysis-binding.js.map +1 -0
- package/dist/review/portable-analysis.d.ts +103 -0
- package/dist/review/portable-analysis.d.ts.map +1 -0
- package/dist/review/portable-analysis.js +119 -0
- package/dist/review/portable-analysis.js.map +1 -0
- package/dist/review/portable-automation-provenance.d.ts +32 -0
- package/dist/review/portable-automation-provenance.d.ts.map +1 -0
- package/dist/review/portable-automation-provenance.js +68 -0
- package/dist/review/portable-automation-provenance.js.map +1 -0
- package/dist/review/portable-ids-report.d.ts +125 -0
- package/dist/review/portable-ids-report.d.ts.map +1 -0
- package/dist/review/portable-ids-report.js +124 -0
- package/dist/review/portable-ids-report.js.map +1 -0
- package/dist/review/portable-manual-report.d.ts +66 -0
- package/dist/review/portable-manual-report.d.ts.map +1 -0
- package/dist/review/portable-manual-report.js +121 -0
- package/dist/review/portable-manual-report.js.map +1 -0
- package/dist/review/portable-report-metadata.d.ts +42 -0
- package/dist/review/portable-report-metadata.d.ts.map +1 -0
- package/dist/review/portable-report-metadata.js +41 -0
- package/dist/review/portable-report-metadata.js.map +1 -0
- package/dist/review/portable-saved-validation.d.ts +12 -0
- package/dist/review/portable-saved-validation.d.ts.map +1 -0
- package/dist/review/portable-saved-validation.js +32 -0
- package/dist/review/portable-saved-validation.js.map +1 -0
- package/dist/review/portable-validation-evidence.d.ts +53 -0
- package/dist/review/portable-validation-evidence.d.ts.map +1 -0
- package/dist/review/portable-validation-evidence.js +52 -0
- package/dist/review/portable-validation-evidence.js.map +1 -0
- package/dist/review/snapshot.d.ts +15 -0
- package/dist/review/snapshot.d.ts.map +1 -0
- package/dist/review/snapshot.js +25 -0
- package/dist/review/snapshot.js.map +1 -0
- package/dist/review/types.d.ts +167 -0
- package/dist/review/types.d.ts.map +1 -0
- package/dist/review/types.js +11 -0
- package/dist/review/types.js.map +1 -0
- package/dist/review/validation.d.ts +14 -0
- package/dist/review/validation.d.ts.map +1 -0
- package/dist/review/validation.js +57 -0
- package/dist/review/validation.js.map +1 -0
- package/dist/review.d.ts +27 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +23 -0
- package/dist/review.js.map +1 -0
- package/dist/schedule-types.d.ts +4 -0
- package/dist/schedule-types.d.ts.map +1 -1
- package/dist/store-align-command.d.ts +13 -0
- package/dist/store-align-command.d.ts.map +1 -0
- package/dist/store-align-command.js +31 -0
- package/dist/store-align-command.js.map +1 -0
- package/dist/store-authoring-exports.d.ts +10 -0
- package/dist/store-authoring-exports.d.ts.map +1 -0
- package/dist/store-authoring-exports.js +9 -0
- package/dist/store-authoring-exports.js.map +1 -0
- package/dist/store-authoring-types.d.ts +8 -0
- package/dist/store-authoring-types.d.ts.map +1 -0
- package/dist/store-authoring-types.js +2 -0
- package/dist/store-authoring-types.js.map +1 -0
- package/dist/store-group-types.d.ts +20 -0
- package/dist/store-group-types.d.ts.map +1 -0
- package/dist/store-group-types.js +2 -0
- package/dist/store-group-types.js.map +1 -0
- package/dist/store-modelling-backend.d.ts.map +1 -1
- package/dist/store-modelling-backend.js +61 -1
- package/dist/store-modelling-backend.js.map +1 -1
- package/dist/store-modelling-types.d.ts +31 -2
- package/dist/store-modelling-types.d.ts.map +1 -1
- package/dist/store-ordinary-backend.d.ts +10 -0
- package/dist/store-ordinary-backend.d.ts.map +1 -0
- package/dist/store-ordinary-backend.js +27 -0
- package/dist/store-ordinary-backend.js.map +1 -0
- package/dist/store-physical-backend.d.ts +5 -0
- package/dist/store-physical-backend.d.ts.map +1 -0
- package/dist/store-physical-backend.js +51 -0
- package/dist/store-physical-backend.js.map +1 -0
- package/dist/store-physical-types.d.ts +33 -0
- package/dist/store-physical-types.d.ts.map +1 -0
- package/dist/store-physical-types.js +5 -0
- package/dist/store-physical-types.js.map +1 -0
- package/dist/store-room-auto-all.d.ts +5 -0
- package/dist/store-room-auto-all.d.ts.map +1 -0
- package/dist/store-room-auto-all.js +94 -0
- package/dist/store-room-auto-all.js.map +1 -0
- package/dist/store-room-command.d.ts +91 -0
- package/dist/store-room-command.d.ts.map +1 -0
- package/dist/store-room-command.js +197 -0
- package/dist/store-room-command.js.map +1 -0
- package/dist/types.d.ts +12 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +21 -14
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* Coordination cards (P18, #6922): findings that refer to exactly the same
|
|
6
|
+
* set of validated elements form one card. Cards are not transitive clusters:
|
|
7
|
+
* a clash between A and B is its own card, and links to the card of findings
|
|
8
|
+
* on A alone as *related* instead of absorbing it, so no finding is ever in
|
|
9
|
+
* two cards and one busy element cannot swallow the whole model.
|
|
10
|
+
*
|
|
11
|
+
* A finding with any element that does not resolve to exactly one loaded
|
|
12
|
+
* model (ambiguous, missing, or unresolved by its native source) is never
|
|
13
|
+
* merged: it gets a card of its own marked unvalidated.
|
|
14
|
+
*/
|
|
15
|
+
import { elementKey, resolveElement } from './identity.js';
|
|
16
|
+
const ANALYSIS_CURRENT = new Set(['observed', 'new', 'persistent', 'changed']);
|
|
17
|
+
function cardState(findings) {
|
|
18
|
+
if (findings.some(finding => finding.source !== 'bcf' && ANALYSIS_CURRENT.has(finding.lifecycle)))
|
|
19
|
+
return 'current';
|
|
20
|
+
const historical = findings.filter(finding => finding.lifecycle !== 'record');
|
|
21
|
+
if (historical.length === 0)
|
|
22
|
+
return 'record';
|
|
23
|
+
// A partial or missing re-run leaves at least one item not evaluated, which blocks a resolution candidate.
|
|
24
|
+
return historical.every(finding => finding.lifecycle === 'no-longer-observed') ? 'resolution-candidate' : 'not-evaluated';
|
|
25
|
+
}
|
|
26
|
+
const STATE_ORDER = { current: 0, 'not-evaluated': 1, 'resolution-candidate': 2, record: 3 };
|
|
27
|
+
export function buildCards(findings, models) {
|
|
28
|
+
const groups = new Map();
|
|
29
|
+
for (const finding of findings) {
|
|
30
|
+
const elements = finding.elements.map((element) => {
|
|
31
|
+
const resolution = resolveElement(element, models);
|
|
32
|
+
if (resolution.state !== 'resolved') {
|
|
33
|
+
return { ...element, key: null, resolution: resolution.state, expressId: null, resolvedModelId: null };
|
|
34
|
+
}
|
|
35
|
+
return { ...element, modelName: resolution.modelName, key: elementKey(resolution.modelName, element.globalId),
|
|
36
|
+
resolution: 'resolved', expressId: resolution.expressId, resolvedModelId: resolution.modelId };
|
|
37
|
+
});
|
|
38
|
+
const validated = elements.length > 0 && elements.every(element => element.key !== null);
|
|
39
|
+
const key = validated ? [...new Set(elements.map(element => element.key))].sort().join('\n') : `finding:${finding.id}`;
|
|
40
|
+
const group = groups.get(key) ?? { identity: validated ? 'validated' : 'unvalidated', elements: new Map(), findings: [] };
|
|
41
|
+
for (const element of elements) {
|
|
42
|
+
const id = element.key ?? `${element.modelName ?? ''}\u001f${element.globalId}`;
|
|
43
|
+
if (!group.elements.has(id))
|
|
44
|
+
group.elements.set(id, element);
|
|
45
|
+
}
|
|
46
|
+
group.findings.push(finding);
|
|
47
|
+
groups.set(key, group);
|
|
48
|
+
}
|
|
49
|
+
const byElement = new Map();
|
|
50
|
+
for (const [key, group] of groups) {
|
|
51
|
+
if (group.identity !== 'validated')
|
|
52
|
+
continue;
|
|
53
|
+
for (const elementId of group.elements.keys())
|
|
54
|
+
byElement.set(elementId, [...(byElement.get(elementId) ?? []), key]);
|
|
55
|
+
}
|
|
56
|
+
const cards = [...groups].map(([key, group]) => {
|
|
57
|
+
const related = new Set();
|
|
58
|
+
if (group.identity === 'validated')
|
|
59
|
+
for (const elementId of group.elements.keys()) {
|
|
60
|
+
for (const other of byElement.get(elementId) ?? [])
|
|
61
|
+
if (other !== key)
|
|
62
|
+
related.add(other);
|
|
63
|
+
}
|
|
64
|
+
const elements = [...group.elements.values()];
|
|
65
|
+
return { key, identity: group.identity, elements, findings: group.findings,
|
|
66
|
+
sources: [...new Set(group.findings.map(finding => finding.source))], state: cardState(group.findings),
|
|
67
|
+
topics: [...new Set(group.findings.flatMap(finding => finding.evidence.kind === 'bcf' ? [finding.evidence.topicGuid] : []))],
|
|
68
|
+
related: [...related].sort(),
|
|
69
|
+
disciplines: [...new Set(group.findings.flatMap(finding => finding.disciplines))].sort(),
|
|
70
|
+
storeys: [...new Set(group.findings.flatMap(finding => finding.storeys))].sort(),
|
|
71
|
+
models: [...new Set(elements.flatMap(element => element.modelName ? [element.modelName] : []))].sort() };
|
|
72
|
+
}).sort((a, b) => STATE_ORDER[a.state] - STATE_ORDER[b.state] || b.sources.length - a.sources.length
|
|
73
|
+
|| b.findings.length - a.findings.length || (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
|
|
74
|
+
return { cards, totals: totalsForCards(cards) };
|
|
75
|
+
}
|
|
76
|
+
/** Totals for the exact cards included in an action, independently of workspace filters. */
|
|
77
|
+
export function totalsForCards(cards) {
|
|
78
|
+
const validatedElements = new Set(cards.flatMap(card => card.elements.flatMap(element => element.key ? [element.key] : [])));
|
|
79
|
+
const unverifiedElements = new Set(cards.flatMap(card => card.elements.filter(element => !element.key).map(element => `${element.modelName ?? ''}\u001f${element.globalId}`)));
|
|
80
|
+
const analysis = cards.flatMap(card => card.findings).filter(finding => finding.lifecycle !== 'record');
|
|
81
|
+
return {
|
|
82
|
+
uniqueElements: validatedElements.size,
|
|
83
|
+
unverifiedElements: unverifiedElements.size,
|
|
84
|
+
currentFindings: analysis.filter(finding => finding.run.temporal === 'current').length,
|
|
85
|
+
historicalFindings: analysis.filter(finding => finding.run.temporal === 'historical').length,
|
|
86
|
+
cards: cards.length,
|
|
87
|
+
topics: new Set(cards.flatMap(card => card.topics)).size,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=cards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cards.js","sourceRoot":"","sources":["../../src/review/cards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disciplines.d.ts","sourceRoot":"","sources":["../../src/review/disciplines.ts"],"names":[],"mappings":"AAMA,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAGrE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
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 { DISCIPLINES, matchesSelector } from '@ifc-lite/clash';
|
|
5
|
+
/** Native taxonomy hints, retaining overlapping and unknown discipline candidates. */
|
|
6
|
+
export function typeDisciplines(ifcType) {
|
|
7
|
+
return ifcType ? Object.values(DISCIPLINES).filter(discipline => matchesSelector(ifcType, discipline.selector))
|
|
8
|
+
.map(discipline => discipline.code) : [];
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=disciplines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disciplines.js","sourceRoot":"","sources":["../../src/review/disciplines.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE/D,sFAAsF;AACtF,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;SAC5G,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Element identity validation against the loaded models (P18, #6922).
|
|
3
|
+
*
|
|
4
|
+
* A finding only joins a coordination card when every element it names
|
|
5
|
+
* resolves to exactly one loaded model that contains the GlobalId, under a
|
|
6
|
+
* model name no other loaded model shares. Revisions and federations reuse
|
|
7
|
+
* GlobalIds across models, so an element named without a model (a BCF
|
|
8
|
+
* component, a linked record) that occurs in two loaded models is ambiguous
|
|
9
|
+
* and is never merged on a guess.
|
|
10
|
+
*/
|
|
11
|
+
import type { FindingElement, ReviewModel } from './types.js';
|
|
12
|
+
export type ElementResolution = {
|
|
13
|
+
state: 'resolved';
|
|
14
|
+
modelId: string;
|
|
15
|
+
modelName: string;
|
|
16
|
+
expressId: number;
|
|
17
|
+
} | {
|
|
18
|
+
state: 'ambiguous';
|
|
19
|
+
modelNames: string[];
|
|
20
|
+
} | {
|
|
21
|
+
state: 'missing';
|
|
22
|
+
};
|
|
23
|
+
export declare function resolveElement(element: FindingElement, models: readonly ReviewModel[]): ElementResolution;
|
|
24
|
+
/** Legacy name-based display/navigation key, stable only while name and GlobalId stay unchanged.
|
|
25
|
+
* It does not prove source identity or revision equality across sessions. */
|
|
26
|
+
export declare function elementKey(modelName: string, globalId: string): string;
|
|
27
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/review/identity.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,MAAM,iBAAiB,GACzB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5C;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAEzB,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,iBAAiB,CAyBzG;AAED;6EAC6E;AAC7E,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
export function resolveElement(element, models) {
|
|
5
|
+
// A native identity failure is authoritative; a GlobalId match must not overrule it.
|
|
6
|
+
if (element.nativeUnresolved === 'ambiguous')
|
|
7
|
+
return { state: 'ambiguous', modelNames: [] };
|
|
8
|
+
if (element.nativeUnresolved === 'unmatched')
|
|
9
|
+
return { state: 'missing' };
|
|
10
|
+
let candidates;
|
|
11
|
+
if (element.modelId !== null) {
|
|
12
|
+
const named = models.find(model => model.id === element.modelId);
|
|
13
|
+
candidates = named ? [named] : element.modelName !== null ? models.filter(model => model.name === element.modelName) : [];
|
|
14
|
+
}
|
|
15
|
+
else if (element.modelName !== null) {
|
|
16
|
+
candidates = models.filter(model => model.name === element.modelName);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
candidates = models;
|
|
20
|
+
}
|
|
21
|
+
const hits = candidates.flatMap(model => {
|
|
22
|
+
const expressId = model.expressIdOf(element.globalId);
|
|
23
|
+
return expressId > 0 ? [{ model, expressId }] : [];
|
|
24
|
+
});
|
|
25
|
+
if (hits.length === 0)
|
|
26
|
+
return { state: 'missing' };
|
|
27
|
+
if (hits.length > 1)
|
|
28
|
+
return { state: 'ambiguous', modelNames: hits.map(hit => hit.model.name) };
|
|
29
|
+
const [{ model, expressId }] = hits;
|
|
30
|
+
// Legacy name-based card keys cannot distinguish two loaded models with the same name.
|
|
31
|
+
// A name and GlobalId match does not prove the same source bytes or revision.
|
|
32
|
+
const sameName = models.filter(other => other.name === model.name);
|
|
33
|
+
if (sameName.length > 1)
|
|
34
|
+
return { state: 'ambiguous', modelNames: sameName.map(other => other.name) };
|
|
35
|
+
return { state: 'resolved', modelId: model.id, modelName: model.name, expressId };
|
|
36
|
+
}
|
|
37
|
+
/** Legacy name-based display/navigation key, stable only while name and GlobalId stay unchanged.
|
|
38
|
+
* It does not prove source identity or revision equality across sessions. */
|
|
39
|
+
export function elementKey(modelName, globalId) {
|
|
40
|
+
return `${modelName}\u001f${globalId}`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/review/identity.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAoB/D,MAAM,UAAU,cAAc,CAAC,OAAuB,EAAE,MAA8B;IACpF,qFAAqF;IACrF,IAAI,OAAO,CAAC,gBAAgB,KAAK,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC5F,IAAI,OAAO,CAAC,gBAAgB,KAAK,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC1E,IAAI,UAAkC,CAAC;IACvC,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACjE,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5H,CAAC;SAAM,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACtC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,MAAM,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACtC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtD,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IAChG,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC;IACpC,uFAAuF;IACvF,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;IACnE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IACtG,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;AACpF,CAAC;AAED;6EAC6E;AAC7E,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,QAAgB;IAC5D,OAAO,GAAG,SAAS,SAAS,QAAQ,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ValidationReport } from '@ifc-lite/ids';
|
|
2
|
+
import type { NativeReviewModel, NativeReviewResult, ReviewCaptureToken } from './capture-types.js';
|
|
3
|
+
/** Actual producer-start ownership, never a reconstructed last-result fingerprint. */
|
|
4
|
+
export declare class NativeReviewCaptures {
|
|
5
|
+
private readonly capacity;
|
|
6
|
+
private readonly retention;
|
|
7
|
+
private readonly credentials;
|
|
8
|
+
private credentialBytes;
|
|
9
|
+
private credentialBound;
|
|
10
|
+
constructor(capacity?: number);
|
|
11
|
+
/** Called only with values the actual run already resolved under its grants. */
|
|
12
|
+
enrollCredentials(values: readonly string[]): void;
|
|
13
|
+
acceptsEvidence(value: unknown): boolean;
|
|
14
|
+
private protect;
|
|
15
|
+
begin(producer: 'ids' | 'rules', definition: string, models: readonly NativeReviewModel[], liveModels: () => readonly NativeReviewModel[], allowed: (id: string) => boolean, signal?: AbortSignal): Promise<ReviewCaptureToken | null>;
|
|
16
|
+
/** Release only this producer's pending reservation; never delete settled facts. */
|
|
17
|
+
abandon(token: ReviewCaptureToken | null, reason?: 'producer-failed' | 'aborted'): void;
|
|
18
|
+
finish(token: ReviewCaptureToken | null, report: ValidationReport): void;
|
|
19
|
+
read<T>(liveModels: () => readonly NativeReviewModel[], allowed: (modelId: string) => boolean, project: (result: NativeReviewResult) => T, requested?: (modelId: string) => boolean): Promise<T>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=native-captures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-captures.d.ts","sourceRoot":"","sources":["../../src/review/native-captures.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAClD,MAAM,oBAAoB,CAAC;AAWhD,sFAAsF;AACtF,qBAAa,oBAAoB;IAOnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IANrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAE7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,eAAe,CAAS;gBAEH,QAAQ,SAAK;IAK1C,gFAAgF;IAChF,iBAAiB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAqBlD,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAOxC,OAAO,CAAC,OAAO;IAMT,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,iBAAiB,EAAE,EAAE,UAAU,EAAE,MAAM,SAAS,iBAAiB,EAAE,EAC7I,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAgD7F,oFAAoF;IACpF,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAAE,MAAM,GAAE,iBAAiB,GAAG,SAA6B,GAAG,IAAI;IAQ1G,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAgClE,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,SAAS,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,CAAC,EAAE,SAAS,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAoB,GAAG,OAAO,CAAC,CAAC,CAAC;CAiGnN"}
|
|
@@ -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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"}
|