@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
package/dist/namespaces/store.js
CHANGED
|
@@ -2,7 +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 { isInstantiable, isKnownType, normalizeIfcTypeName } from '@ifc-lite/parser';
|
|
5
|
-
import {
|
|
5
|
+
import { StoreGroupNamespace } from './store-group.js';
|
|
6
6
|
/**
|
|
7
7
|
* `bim.store` — document-level edits on a parsed model.
|
|
8
8
|
*
|
|
@@ -18,7 +18,7 @@ import { StoreModellingNamespace } from './store-modelling.js';
|
|
|
18
18
|
* Changes accumulate in a per-model overlay and are flushed to the IFC
|
|
19
19
|
* file on the next `bim.export.ifc({ applyMutations: true })`.
|
|
20
20
|
*/
|
|
21
|
-
export class StoreNamespace extends
|
|
21
|
+
export class StoreNamespace extends StoreGroupNamespace {
|
|
22
22
|
/**
|
|
23
23
|
* Inject a new entity into the active model. Returns an `EntityRef`
|
|
24
24
|
* pointing at the freshly-allocated expressId.
|
|
@@ -100,8 +100,9 @@ export class StoreNamespace extends StoreModellingNamespace {
|
|
|
100
100
|
* so the column appears next to the existing model on export.
|
|
101
101
|
*
|
|
102
102
|
* `Position` is the base centre in storey-local coordinates (metres),
|
|
103
|
-
* `Width`×`Depth`
|
|
104
|
-
* `
|
|
103
|
+
* `Width`×`Depth` selects a centred rectangle; `Profile` selects the
|
|
104
|
+
* canonical parameterised section. `RefDirection` turns its local X axis
|
|
105
|
+
* in the storey plane, and `Height` is the +Z extrusion length.
|
|
105
106
|
*
|
|
106
107
|
* @example
|
|
107
108
|
* const storeyId = bim.query.byType('IfcBuildingStorey')[0].ref.expressId;
|
|
@@ -137,9 +138,9 @@ export class StoreNamespace extends StoreModellingNamespace {
|
|
|
137
138
|
return this.backend.store.addSlab(modelId, storeyExpressId, params);
|
|
138
139
|
}
|
|
139
140
|
/**
|
|
140
|
-
* Add an IfcBeam between `Start` and `End` with a centred
|
|
141
|
-
*
|
|
142
|
-
* extrusion runs along the beam.
|
|
141
|
+
* Add an IfcBeam between `Start` and `End` with a centred rectangle
|
|
142
|
+
* (`Width` × `Height`) or parameterised `Profile`. Local Z is the beam
|
|
143
|
+
* axis so the extrusion runs along the beam.
|
|
143
144
|
*/
|
|
144
145
|
addBeam(modelId, storeyExpressId, params) {
|
|
145
146
|
return this.backend.store.addBeam(modelId, storeyExpressId, params);
|
|
@@ -179,8 +180,8 @@ export class StoreNamespace extends StoreModellingNamespace {
|
|
|
179
180
|
}
|
|
180
181
|
/**
|
|
181
182
|
* Add an IfcMember (generic structural member — brace, post, strut)
|
|
182
|
-
* between `Start` and `End`. Same
|
|
183
|
-
* choose
|
|
183
|
+
* between `Start` and `End`. Same rectangular or parameterised Profile
|
|
184
|
+
* extrusion as `addBeam`; choose PredefinedType to disambiguate the role.
|
|
184
185
|
*/
|
|
185
186
|
addMember(modelId, storeyExpressId, params) {
|
|
186
187
|
return this.backend.store.addMember(modelId, storeyExpressId, params);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/namespaces/store.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/namespaces/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BCF topics as coordination records. A topic's elements are the IfcGuids its
|
|
3
|
+
* viewpoints select or colour; BCF names no model, so a GlobalId present in two
|
|
4
|
+
* loaded models stays ambiguous. The topic status is the topic's own and is
|
|
5
|
+
* never changed by the review workspace.
|
|
6
|
+
*/
|
|
7
|
+
import type { BCFProject } from '@ifc-lite/bcf';
|
|
8
|
+
import type { ReviewMessage, FindingSourceResult } from './types.js';
|
|
9
|
+
export declare function bcfFindings<Message extends ReviewMessage = ReviewMessage>(project: BCFProject | null): FindingSourceResult<Message>;
|
|
10
|
+
//# sourceMappingURL=bcf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bcf.d.ts","sourceRoot":"","sources":["../../src/review/bcf.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAc,mBAAmB,EAAiB,MAAM,YAAY,CAAC;AAYhG,wBAAgB,WAAW,CAAC,OAAO,SAAS,aAAa,GAAG,aAAa,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAanI"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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 topicGuids(topic) {
|
|
5
|
+
const guids = new Set();
|
|
6
|
+
for (const viewpoint of topic.viewpoints) {
|
|
7
|
+
const components = viewpoint.components;
|
|
8
|
+
for (const component of components?.selection ?? [])
|
|
9
|
+
if (component.ifcGuid)
|
|
10
|
+
guids.add(component.ifcGuid);
|
|
11
|
+
for (const coloring of components?.coloring ?? [])
|
|
12
|
+
for (const component of coloring.components)
|
|
13
|
+
if (component.ifcGuid)
|
|
14
|
+
guids.add(component.ifcGuid);
|
|
15
|
+
}
|
|
16
|
+
return [...guids];
|
|
17
|
+
}
|
|
18
|
+
export function bcfFindings(project) {
|
|
19
|
+
if (!project || project.topics.size === 0)
|
|
20
|
+
return { runs: [], findings: [] };
|
|
21
|
+
const run = { id: 'bcf:project', source: 'bcf', temporal: 'current', label: project.name || 'BCF',
|
|
22
|
+
capturedAt: null, complete: true, incomplete: [], models: [] };
|
|
23
|
+
const findings = [...project.topics.values()].map(topic => ({
|
|
24
|
+
id: `${run.id}#${topic.guid}`, lineage: `bcf|${topic.guid}`, source: 'bcf', run,
|
|
25
|
+
elements: topicGuids(topic).map(globalId => ({ globalId, modelId: null, modelName: null })),
|
|
26
|
+
nativeStatus: topic.topicStatus ?? '', title: topic.title,
|
|
27
|
+
detail: [topic.topicType, topic.priority ? `priority ${topic.priority}` : '', topic.assignedTo ? `assigned ${topic.assignedTo}` : '',
|
|
28
|
+
topic.labels?.length ? `labels ${topic.labels.join(', ')}` : ''].filter((line) => !!line),
|
|
29
|
+
lifecycle: 'record', disciplines: [], storeys: [], evidence: { kind: 'bcf', topicGuid: topic.guid },
|
|
30
|
+
}));
|
|
31
|
+
return { runs: [run], findings };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=bcf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bcf.js","sourceRoot":"","sources":["../../src/review/bcf.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAY/D,SAAS,UAAU,CAAC,KAAe;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;QACxC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,SAAS,IAAI,EAAE;YAAE,IAAI,SAAS,CAAC,OAAO;gBAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACzG,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,QAAQ,IAAI,EAAE;YAAE,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU;gBAAE,IAAI,SAAS,CAAC,OAAO;oBAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACtJ,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,WAAW,CAAgD,OAA0B;IACnG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7E,MAAM,GAAG,GAAwB,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;QACpH,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACjE,MAAM,QAAQ,GAA6B,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpF,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;QAC/E,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,YAAY,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK;QACzD,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;YAClI,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3G,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE;KACpG,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** #7372: reject a whole capture instead of retaining a silently partial graph. */
|
|
2
|
+
export declare function reviewValueFits(value: unknown): boolean;
|
|
3
|
+
export declare function reviewSHA256(bytes: Uint8Array): Promise<string>;
|
|
4
|
+
/** Both raw and JSON-escaped credentials are excluded from cross-tool facts. */
|
|
5
|
+
export declare function reviewContainsSecret(serialized: string, values: readonly string[]): boolean;
|
|
6
|
+
//# sourceMappingURL=capture-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-budget.d.ts","sourceRoot":"","sources":["../../src/review/capture-budget.ts"],"names":[],"mappings":"AAIA,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqBvD;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAGrE;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAG3F"}
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
/** #7372: reject a whole capture instead of retaining a silently partial graph. */
|
|
5
|
+
export function reviewValueFits(value) {
|
|
6
|
+
const pending = [{ value, depth: 0 }];
|
|
7
|
+
let work = 0;
|
|
8
|
+
let text = 0;
|
|
9
|
+
while (pending.length) {
|
|
10
|
+
const item = pending.pop();
|
|
11
|
+
if (!item || ++work > 100_000 || item.depth > 24)
|
|
12
|
+
return false;
|
|
13
|
+
const x = item.value;
|
|
14
|
+
if (typeof x === 'string') {
|
|
15
|
+
if (x.length > 16_384 || (text += x.length) > 1_048_576)
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
else if (typeof x === 'number') {
|
|
19
|
+
if (!Number.isFinite(x))
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
else if (x instanceof Date) {
|
|
23
|
+
if (!Number.isFinite(x.getTime()))
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
else if (x !== null && typeof x === 'object') {
|
|
27
|
+
const children = Array.isArray(x) ? x : Object.values(x);
|
|
28
|
+
if (children.length > 10_000 || pending.length + children.length > 100_000)
|
|
29
|
+
return false;
|
|
30
|
+
for (const child of children)
|
|
31
|
+
pending.push({ value: child, depth: item.depth + 1 });
|
|
32
|
+
}
|
|
33
|
+
else if (x !== null && x !== undefined && typeof x !== 'boolean')
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
export async function reviewSHA256(bytes) {
|
|
39
|
+
const hash = await crypto.subtle.digest('SHA-256', new Uint8Array(bytes));
|
|
40
|
+
return [...new Uint8Array(hash)].map(x => x.toString(16).padStart(2, '0')).join('');
|
|
41
|
+
}
|
|
42
|
+
/** Both raw and JSON-escaped credentials are excluded from cross-tool facts. */
|
|
43
|
+
export function reviewContainsSecret(serialized, values) {
|
|
44
|
+
return values.some(value => value.length > 0 && (serialized.includes(value)
|
|
45
|
+
|| serialized.includes(JSON.stringify(value).slice(1, -1))));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=capture-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-budget.js","sourceRoot":"","sources":["../../src/review/capture-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { NativeReviewModel, NativeReviewResult, ReviewCaptureToken, ReviewRunProvenance, ReviewSourceProof, ReviewSpecificationCoverage } from './capture-types.js';
|
|
2
|
+
import type { FindingSourceResult } from './types.js';
|
|
3
|
+
export interface OwnedTarget {
|
|
4
|
+
model: NativeReviewModel;
|
|
5
|
+
view: ReturnType<NativeReviewModel['mutationView']>;
|
|
6
|
+
revision: number;
|
|
7
|
+
proof: ReviewSourceProof;
|
|
8
|
+
}
|
|
9
|
+
export interface CaptureAttempt {
|
|
10
|
+
token: ReviewCaptureToken;
|
|
11
|
+
models: readonly NativeReviewModel[];
|
|
12
|
+
order: number | null;
|
|
13
|
+
outcome: 'pending' | 'succeeded' | 'failed' | 'aborted' | 'refused' | 'superseded';
|
|
14
|
+
refusal?: NativeReviewResult['refusal'];
|
|
15
|
+
targets?: OwnedTarget[];
|
|
16
|
+
provenance?: ReviewRunProvenance;
|
|
17
|
+
superseded: boolean;
|
|
18
|
+
proofHistoryUncertain?: boolean;
|
|
19
|
+
laterFailure?: NativeReviewResult['refusal'];
|
|
20
|
+
}
|
|
21
|
+
export interface SettledCapture {
|
|
22
|
+
attempt: CaptureAttempt;
|
|
23
|
+
targets: OwnedTarget[];
|
|
24
|
+
provenance: ReviewRunProvenance;
|
|
25
|
+
facts: FindingSourceResult;
|
|
26
|
+
coverage: ReviewSpecificationCoverage[];
|
|
27
|
+
laterFailure?: NativeReviewResult['refusal'];
|
|
28
|
+
}
|
|
29
|
+
/** Two bounded roles: pending reservations and latest successful native contexts. */
|
|
30
|
+
export declare class CaptureRetention {
|
|
31
|
+
readonly capacity: number;
|
|
32
|
+
readonly pending: Map<string, CaptureAttempt>;
|
|
33
|
+
readonly settled: Map<string, SettledCapture>;
|
|
34
|
+
latest: CaptureAttempt | null;
|
|
35
|
+
inventoryOmitted: boolean;
|
|
36
|
+
captureRefusal: 'capture-bound' | null;
|
|
37
|
+
private order;
|
|
38
|
+
constructor(capacity: number);
|
|
39
|
+
private nextOrder;
|
|
40
|
+
private replaceLatest;
|
|
41
|
+
refuse(models: readonly NativeReviewModel[], refusal: NativeReviewResult['refusal']): void;
|
|
42
|
+
reserve(models: readonly NativeReviewModel[]): CaptureAttempt | null;
|
|
43
|
+
prepare(attempt: CaptureAttempt, targets: OwnedTarget[], provenance: ReviewRunProvenance): void;
|
|
44
|
+
fail(attempt: CaptureAttempt, refusal: NativeReviewResult['refusal'], outcome: 'failed' | 'aborted' | 'refused'): void;
|
|
45
|
+
complete(attempt: CaptureAttempt, facts: FindingSourceResult, coverage: ReviewSpecificationCoverage[]): void;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=capture-retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-retention.d.ts","sourceRoot":"","sources":["../../src/review/capture-retention.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAC1F,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,UAAU,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AACD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;IACnF,OAAO,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;CAC9C;AACD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,mBAAmB,CAAC;IAChC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,2BAA2B,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;CAC9C;AAYD,qFAAqF;AACrF,qBAAa,gBAAgB;IAOf,QAAQ,CAAC,QAAQ,EAAE,MAAM;IANrC,QAAQ,CAAC,OAAO,8BAAqC;IACrD,QAAQ,CAAC,OAAO,8BAAqC;IACrD,MAAM,EAAE,cAAc,GAAG,IAAI,CAAQ;IACrC,gBAAgB,UAAS;IACzB,cAAc,EAAE,eAAe,GAAG,IAAI,CAAQ;IAC9C,OAAO,CAAC,KAAK,CAAK;gBACG,QAAQ,EAAE,MAAM;IAErC,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,aAAa;IAWrB,MAAM,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,EAAE,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,GAAG,IAAI;IAI1F,OAAO,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,cAAc,GAAG,IAAI;IAOpE,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,mBAAmB,GAAG,IAAI;IAO/F,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI;IAetH,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,2BAA2B,EAAE,GAAG,IAAI;CAgC7G"}
|
|
@@ -0,0 +1,141 @@
|
|
|
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 sameContext(a, b) {
|
|
5
|
+
if (!a.provenance || !b.provenance || !a.targets || !b.targets)
|
|
6
|
+
return false;
|
|
7
|
+
return a.provenance.producer === b.provenance.producer
|
|
8
|
+
&& a.provenance.definitionSHA256 === b.provenance.definitionSHA256
|
|
9
|
+
&& a.targets.length === b.targets.length && a.targets.every(target => b.targets?.some(other => target.model.id === other.model.id && target.model.owner === other.model.owner
|
|
10
|
+
&& target.model.store === other.model.store && target.model.source === other.model.source
|
|
11
|
+
&& target.proof.sourceSHA256 === other.proof.sourceSHA256
|
|
12
|
+
&& target.proof.sourceByteLength === other.proof.sourceByteLength));
|
|
13
|
+
}
|
|
14
|
+
/** Two bounded roles: pending reservations and latest successful native contexts. */
|
|
15
|
+
export class CaptureRetention {
|
|
16
|
+
capacity;
|
|
17
|
+
pending = new Map();
|
|
18
|
+
settled = new Map();
|
|
19
|
+
latest = null;
|
|
20
|
+
inventoryOmitted = false;
|
|
21
|
+
captureRefusal = null;
|
|
22
|
+
order = 0;
|
|
23
|
+
constructor(capacity) {
|
|
24
|
+
this.capacity = capacity;
|
|
25
|
+
}
|
|
26
|
+
nextOrder() {
|
|
27
|
+
// Only relative ordering among at most 65 live records matters. Resequence
|
|
28
|
+
// before a fixed bound; never accumulate lifetime counters or tombstones.
|
|
29
|
+
if (this.order >= 128) {
|
|
30
|
+
const records = new Set([...this.pending.values(), ...[...this.settled.values()].map(x => x.attempt),
|
|
31
|
+
...(this.latest ? [this.latest] : [])]);
|
|
32
|
+
const ordered = [...records].filter(x => x.order !== null).sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
33
|
+
ordered.forEach((item, index) => { item.order = index + 1; });
|
|
34
|
+
this.order = ordered.length;
|
|
35
|
+
}
|
|
36
|
+
return ++this.order;
|
|
37
|
+
}
|
|
38
|
+
replaceLatest(next) {
|
|
39
|
+
const previous = this.latest;
|
|
40
|
+
if (previous?.refusal && previous.provenance && previous.targets) {
|
|
41
|
+
for (const pending of this.pending.values()) {
|
|
42
|
+
if ((pending.order ?? -1) >= (previous.order ?? -1))
|
|
43
|
+
continue;
|
|
44
|
+
if (!pending.targets)
|
|
45
|
+
pending.proofHistoryUncertain = true;
|
|
46
|
+
else if (sameContext(previous, pending))
|
|
47
|
+
pending.laterFailure = previous.refusal;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
this.latest = next;
|
|
51
|
+
}
|
|
52
|
+
refuse(models, refusal) {
|
|
53
|
+
this.replaceLatest({ token: { runId: crypto.randomUUID() }, models, order: this.nextOrder(),
|
|
54
|
+
outcome: 'refused', refusal, superseded: false });
|
|
55
|
+
}
|
|
56
|
+
reserve(models) {
|
|
57
|
+
if (this.pending.size >= this.capacity) {
|
|
58
|
+
this.refuse(models, 'work-bound');
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const attempt = { token: { runId: crypto.randomUUID() }, models, order: this.nextOrder(),
|
|
62
|
+
outcome: 'pending', superseded: false };
|
|
63
|
+
this.pending.set(attempt.token.runId, attempt);
|
|
64
|
+
this.replaceLatest(attempt);
|
|
65
|
+
return attempt;
|
|
66
|
+
}
|
|
67
|
+
prepare(attempt, targets, provenance) {
|
|
68
|
+
if (this.pending.get(attempt.token.runId) !== attempt)
|
|
69
|
+
throw new Error('Native Review reservation is no longer pending');
|
|
70
|
+
// Proof completion cannot turn an older attempt into the latest operation.
|
|
71
|
+
attempt.targets = targets;
|
|
72
|
+
attempt.provenance = provenance;
|
|
73
|
+
if ([...this.settled.values()].some(capture => sameContext(attempt, capture.attempt)
|
|
74
|
+
&& (capture.attempt.order ?? -1) > (attempt.order ?? -1)))
|
|
75
|
+
attempt.superseded = true;
|
|
76
|
+
}
|
|
77
|
+
fail(attempt, refusal, outcome) {
|
|
78
|
+
if (this.pending.get(attempt.token.runId) !== attempt)
|
|
79
|
+
return;
|
|
80
|
+
this.pending.delete(attempt.token.runId);
|
|
81
|
+
attempt.outcome = outcome;
|
|
82
|
+
attempt.refusal = refusal;
|
|
83
|
+
for (const other of this.pending.values()) {
|
|
84
|
+
if (sameContext(attempt, other) && (attempt.order ?? -1) > (other.order ?? -1))
|
|
85
|
+
other.laterFailure = refusal;
|
|
86
|
+
// A proven failure that is no longer latest has no retained descriptor
|
|
87
|
+
// for a later proof to compare. Preserve bounded uncertainty instead of
|
|
88
|
+
// treating an older, currently unproven context as a current success.
|
|
89
|
+
else if (this.latest !== attempt && attempt.provenance && attempt.targets && !other.targets
|
|
90
|
+
&& (other.order ?? -1) < (attempt.order ?? -1))
|
|
91
|
+
other.proofHistoryUncertain = true;
|
|
92
|
+
}
|
|
93
|
+
for (const capture of this.settled.values()) {
|
|
94
|
+
if (sameContext(attempt, capture.attempt) && (attempt.order ?? -1) > (capture.attempt.order ?? -1))
|
|
95
|
+
capture.laterFailure = refusal;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
complete(attempt, facts, coverage) {
|
|
99
|
+
if (!attempt.targets || !attempt.provenance || attempt.order === null)
|
|
100
|
+
throw new Error('Native Review reservation has no producer proof');
|
|
101
|
+
const matching = [...this.settled.values()].find(capture => sameContext(attempt, capture.attempt));
|
|
102
|
+
this.pending.delete(attempt.token.runId);
|
|
103
|
+
if (attempt.superseded || matching && (matching.attempt.order ?? -1) > attempt.order) {
|
|
104
|
+
attempt.outcome = 'superseded';
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const latest = this.latest;
|
|
108
|
+
if (latest?.refusal && (latest.order ?? -1) > attempt.order && sameContext(attempt, latest)) {
|
|
109
|
+
attempt.laterFailure = latest.refusal;
|
|
110
|
+
}
|
|
111
|
+
if (attempt.proofHistoryUncertain) {
|
|
112
|
+
// Missing bounded history cannot prove that this old proof was not
|
|
113
|
+
// superseded. Refuse its capture, preserving the independent report.
|
|
114
|
+
attempt.outcome = 'refused';
|
|
115
|
+
attempt.refusal = 'capture-bound';
|
|
116
|
+
this.captureRefusal = 'capture-bound';
|
|
117
|
+
this.inventoryOmitted = true;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
for (const other of this.pending.values()) {
|
|
121
|
+
if (sameContext(attempt, other) && (other.order ?? Number.POSITIVE_INFINITY) < attempt.order)
|
|
122
|
+
other.superseded = true;
|
|
123
|
+
}
|
|
124
|
+
if (matching)
|
|
125
|
+
this.settled.delete(matching.attempt.token.runId);
|
|
126
|
+
else if (this.settled.size >= this.capacity) {
|
|
127
|
+
const oldest = this.settled.keys().next().value;
|
|
128
|
+
if (oldest === undefined)
|
|
129
|
+
throw new Error('Native Review retention has no settled context to retire');
|
|
130
|
+
for (const other of this.pending.values()) {
|
|
131
|
+
if (!other.targets && (other.order ?? -1) < attempt.order)
|
|
132
|
+
other.proofHistoryUncertain = true;
|
|
133
|
+
}
|
|
134
|
+
this.settled.delete(oldest);
|
|
135
|
+
this.inventoryOmitted = true;
|
|
136
|
+
}
|
|
137
|
+
attempt.outcome = 'succeeded';
|
|
138
|
+
this.settled.set(attempt.token.runId, { attempt, targets: attempt.targets, provenance: attempt.provenance, facts, coverage, ...(attempt.laterFailure ? { laterFailure: attempt.laterFailure } : {}) });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=capture-retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-retention.js","sourceRoot":"","sources":["../../src/review/capture-retention.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { IfcSourceBytes } from '@ifc-lite/parser';
|
|
2
|
+
import type { ReviewModel, FindingSourceResult } from './types.js';
|
|
3
|
+
/** A real host-owned source. Reading this contract never allocates an editor. */
|
|
4
|
+
export interface NativeReviewModel extends ReviewModel {
|
|
5
|
+
readonly owner: object;
|
|
6
|
+
readonly store: object;
|
|
7
|
+
readonly source: IfcSourceBytes;
|
|
8
|
+
mutationView(): {
|
|
9
|
+
getMutationRevision(): number;
|
|
10
|
+
} | null;
|
|
11
|
+
}
|
|
12
|
+
export interface ReviewSourceProof {
|
|
13
|
+
readonly modelId: string;
|
|
14
|
+
readonly sourceSHA256: string;
|
|
15
|
+
readonly sourceByteLength: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ReviewRunProvenance {
|
|
18
|
+
readonly runId: string;
|
|
19
|
+
readonly producer: 'ids' | 'rules';
|
|
20
|
+
readonly definitionSHA256: string;
|
|
21
|
+
readonly capturedAt: string;
|
|
22
|
+
readonly sources: readonly ReviewSourceProof[];
|
|
23
|
+
readonly origin: 'captured';
|
|
24
|
+
}
|
|
25
|
+
export interface ReviewSpecificationCoverage {
|
|
26
|
+
readonly specificationId: string;
|
|
27
|
+
readonly applicableCount: number;
|
|
28
|
+
readonly passedCount: number;
|
|
29
|
+
readonly failedCount: number;
|
|
30
|
+
readonly detailRows: number;
|
|
31
|
+
}
|
|
32
|
+
export interface NativeReviewResult extends FindingSourceResult {
|
|
33
|
+
provenance: ReviewRunProvenance[];
|
|
34
|
+
retention?: {
|
|
35
|
+
policy: 'latest-successful-native-context';
|
|
36
|
+
limit: number;
|
|
37
|
+
inventoryOmitted: boolean;
|
|
38
|
+
omittedHistoricalRuns: null;
|
|
39
|
+
captureRefusal: 'capture-bound' | null;
|
|
40
|
+
};
|
|
41
|
+
latestAttempt?: {
|
|
42
|
+
state: 'pending' | 'succeeded' | 'failed' | 'aborted' | 'refused' | 'superseded';
|
|
43
|
+
refusal?: NativeReviewResult['refusal'];
|
|
44
|
+
proof: ReviewRunProvenance | null;
|
|
45
|
+
} | null;
|
|
46
|
+
coverage: Array<{
|
|
47
|
+
runId: string;
|
|
48
|
+
specifications: ReviewSpecificationCoverage[];
|
|
49
|
+
}>;
|
|
50
|
+
availability: 'available' | 'not-run' | 'unavailable';
|
|
51
|
+
/** Closed host facts, never a raw exception or unauthorized model label. */
|
|
52
|
+
refusal?: 'source-unavailable' | 'work-bound' | 'capture-bound' | 'target-changed' | 'scope' | 'sensitive-input' | 'producer-pending' | 'producer-failed' | 'aborted';
|
|
53
|
+
}
|
|
54
|
+
export interface ReviewCaptureToken {
|
|
55
|
+
readonly runId: string;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=capture-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-types.d.ts","sourceRoot":"","sources":["../../src/review/capture-types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEnE,iFAAiF;AACjF,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,YAAY,IAAI;QAAE,mBAAmB,IAAI,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC7D,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE;QAAE,MAAM,EAAE,kCAAkC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAC;QAAC,qBAAqB,EAAE,IAAI,CAAC;QAAC,cAAc,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE,CAAC;IAC1K,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;QACjG,OAAO,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACtF,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,2BAA2B,EAAE,CAAA;KAAE,CAAC,CAAC;IAClF,YAAY,EAAE,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IACtD,4EAA4E;IAC5E,OAAO,CAAC,EAAE,oBAAoB,GAAG,YAAY,GAAG,eAAe,GAAG,gBAAgB,GAAG,OAAO,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,SAAS,CAAC;CACvK;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-types.js","sourceRoot":"","sources":["../../src/review/capture-types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordination cards (P18, #6922): findings that refer to exactly the same
|
|
3
|
+
* set of validated elements form one card. Cards are not transitive clusters:
|
|
4
|
+
* a clash between A and B is its own card, and links to the card of findings
|
|
5
|
+
* on A alone as *related* instead of absorbing it, so no finding is ever in
|
|
6
|
+
* two cards and one busy element cannot swallow the whole model.
|
|
7
|
+
*
|
|
8
|
+
* A finding with any element that does not resolve to exactly one loaded
|
|
9
|
+
* model (ambiguous, missing, or unresolved by its native source) is never
|
|
10
|
+
* merged: it gets a card of its own marked unvalidated.
|
|
11
|
+
*/
|
|
12
|
+
import { type ElementResolution } from './identity.js';
|
|
13
|
+
import type { FindingElement, FindingSourceKind, ReviewFinding, ReviewModel, ReviewMessage } from './types.js';
|
|
14
|
+
export interface CardElement extends FindingElement {
|
|
15
|
+
/** Durable key when validated; null otherwise. */
|
|
16
|
+
key: string | null;
|
|
17
|
+
resolution: ElementResolution['state'];
|
|
18
|
+
/** Live express id in `resolvedModelId` when validated. */
|
|
19
|
+
expressId: number | null;
|
|
20
|
+
resolvedModelId: string | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `current`: an analysis observes it now. `not-evaluated`: only historical
|
|
24
|
+
* evidence, and no complete compatible run looked again. `resolution-candidate`:
|
|
25
|
+
* only historical evidence, every item re-examined by a complete current run
|
|
26
|
+
* and no longer observed; a human decides. `record`: only coordination records (BCF topics or saved grouping receipts).
|
|
27
|
+
*/
|
|
28
|
+
export type CardState = 'current' | 'not-evaluated' | 'resolution-candidate' | 'record';
|
|
29
|
+
export interface CoordinationCard<Message extends ReviewMessage = ReviewMessage> {
|
|
30
|
+
/** Durable identity: the sorted validated element keys, or the single finding for an unvalidated card. */
|
|
31
|
+
key: string;
|
|
32
|
+
identity: 'validated' | 'unvalidated';
|
|
33
|
+
elements: CardElement[];
|
|
34
|
+
findings: ReviewFinding<Message>[];
|
|
35
|
+
sources: FindingSourceKind[];
|
|
36
|
+
state: CardState;
|
|
37
|
+
/** BCF topic GUIDs among the findings. */
|
|
38
|
+
topics: string[];
|
|
39
|
+
/** Cards sharing at least one validated element with this one. */
|
|
40
|
+
related: string[];
|
|
41
|
+
disciplines: string[];
|
|
42
|
+
storeys: string[];
|
|
43
|
+
models: string[];
|
|
44
|
+
}
|
|
45
|
+
/** Each total counts a different thing; none is derived from another. */
|
|
46
|
+
export interface ReviewTotals {
|
|
47
|
+
uniqueElements: number;
|
|
48
|
+
unverifiedElements: number;
|
|
49
|
+
currentFindings: number;
|
|
50
|
+
historicalFindings: number;
|
|
51
|
+
cards: number;
|
|
52
|
+
topics: number;
|
|
53
|
+
}
|
|
54
|
+
export declare function buildCards<Message extends ReviewMessage>(findings: readonly ReviewFinding<Message>[], models: readonly ReviewModel[]): {
|
|
55
|
+
cards: CoordinationCard<Message>[];
|
|
56
|
+
totals: ReviewTotals;
|
|
57
|
+
};
|
|
58
|
+
/** Totals for the exact cards included in an action, independently of workspace filters. */
|
|
59
|
+
export declare function totalsForCards<Message extends ReviewMessage>(cards: readonly CoordinationCard<Message>[]): ReviewTotals;
|
|
60
|
+
//# sourceMappingURL=cards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../src/review/cards.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/G,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,kDAAkD;IAClD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACvC,2DAA2D;IAC3D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,sBAAsB,GAAG,QAAQ,CAAC;AAExF,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,aAAa,GAAG,aAAa;IAC7E,0GAA0G;IAC1G,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,WAAW,GAAG,aAAa,CAAC;IACtC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IACnC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAgB,UAAU,CAAC,OAAO,SAAS,aAAa,EAAE,QAAQ,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG;IAAE,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CA0CnM;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,OAAO,SAAS,aAAa,EAAE,KAAK,EAAE,SAAS,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,YAAY,CAYvH"}
|