@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,47 @@
|
|
|
1
|
+
import { type FindingSourceKind } from './types.js';
|
|
2
|
+
import type { NativeReviewModel, NativeReviewResult } from './capture-types.js';
|
|
3
|
+
import type { NativeReviewCaptures } from './native-captures.js';
|
|
4
|
+
/** One bounded read projection used by actual Flow and MCP dispatch. */
|
|
5
|
+
export declare function readNativeReview(captures: NativeReviewCaptures, liveModels: () => readonly NativeReviewModel[], request: {
|
|
6
|
+
sources?: unknown;
|
|
7
|
+
modelIds?: unknown;
|
|
8
|
+
maxFindings?: unknown;
|
|
9
|
+
}, allowed: (id: string) => boolean): Promise<{
|
|
10
|
+
retention: {
|
|
11
|
+
policy: "latest-successful-native-context";
|
|
12
|
+
limit: number;
|
|
13
|
+
inventoryOmitted: boolean;
|
|
14
|
+
omittedHistoricalRuns: null;
|
|
15
|
+
captureRefusal: "capture-bound" | null;
|
|
16
|
+
} | null;
|
|
17
|
+
latestAttempt: {
|
|
18
|
+
state: "pending" | "succeeded" | "failed" | "aborted" | "refused" | "superseded";
|
|
19
|
+
refusal?: NativeReviewResult["refusal"];
|
|
20
|
+
proof: import("./capture-types.js").ReviewRunProvenance | null;
|
|
21
|
+
} | null;
|
|
22
|
+
findings: import("./types.js").ReviewFinding<import("./types.js").ReviewMessage>[];
|
|
23
|
+
runs: import("./types.js").FindingRun<import("./types.js").ReviewMessage>[];
|
|
24
|
+
provenance: import("./capture-types.js").ReviewRunProvenance[];
|
|
25
|
+
coverage: {
|
|
26
|
+
runId: string;
|
|
27
|
+
specifications: import("./capture-types.js").ReviewSpecificationCoverage[];
|
|
28
|
+
}[];
|
|
29
|
+
cards: import("./cards.js").CoordinationCard<import("./types.js").ReviewMessage>[];
|
|
30
|
+
totals: import("./cards.js").ReviewTotals;
|
|
31
|
+
sources: {
|
|
32
|
+
refusal?: "capture-bound" | "aborted" | "source-unavailable" | "work-bound" | "target-changed" | "scope" | "sensitive-input" | "producer-pending" | "producer-failed" | undefined;
|
|
33
|
+
source: FindingSourceKind;
|
|
34
|
+
state: string;
|
|
35
|
+
}[];
|
|
36
|
+
bounds: {
|
|
37
|
+
knownFindings: number | null;
|
|
38
|
+
omittedFindings: number | null;
|
|
39
|
+
rowLimit: number;
|
|
40
|
+
textLimit: number;
|
|
41
|
+
clippedTextFields: number;
|
|
42
|
+
knownFindingsScope: "retained-current-contexts";
|
|
43
|
+
nativeCoverageComplete: boolean;
|
|
44
|
+
presentationComplete: boolean;
|
|
45
|
+
};
|
|
46
|
+
}>;
|
|
47
|
+
//# sourceMappingURL=native-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-snapshot.d.ts","sourceRoot":"","sources":["../../src/review/native-snapshot.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAUjE,wEAAwE;AACxE,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,SAAS,iBAAiB,EAAE,EACnH,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO;;;;;;;;;;;;;;;;;;;;;;;;gBA0C7C,iBAAiB;;;;;;;;;;;;;GAwBhF"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { buildCards } from './cards.js';
|
|
5
|
+
import { FINDING_SOURCE_KINDS } from './types.js';
|
|
6
|
+
function selectors(value, maximum) {
|
|
7
|
+
if (value === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
if (!Array.isArray(value) || value.length > maximum || value.some(x => typeof x !== 'string' || x.length > 1_024)) {
|
|
10
|
+
throw new Error('Review selectors must be bounded string arrays');
|
|
11
|
+
}
|
|
12
|
+
return value.slice();
|
|
13
|
+
}
|
|
14
|
+
/** One bounded read projection used by actual Flow and MCP dispatch. */
|
|
15
|
+
export async function readNativeReview(captures, liveModels, request, allowed) {
|
|
16
|
+
const selected = selectors(request.sources, 5) ?? [...FINDING_SOURCE_KINDS];
|
|
17
|
+
if (selected.some(x => !FINDING_SOURCE_KINDS.some(kind => kind === x)))
|
|
18
|
+
throw new Error('Unknown Review source kind');
|
|
19
|
+
const requested = selectors(request.modelIds, 64);
|
|
20
|
+
if (requested?.some(id => !allowed(id)))
|
|
21
|
+
throw new Error('A requested Review model is outside the caller scope');
|
|
22
|
+
const cap = request.maxFindings ?? 128;
|
|
23
|
+
if (typeof cap !== 'number' || !Number.isSafeInteger(cap) || cap < 0 || cap > 512)
|
|
24
|
+
throw new Error('Review row limit must be an integer from 0 to 512');
|
|
25
|
+
const selectedModel = (id) => !requested || requested.includes(id);
|
|
26
|
+
const admitted = (id) => allowed(id) && selectedModel(id);
|
|
27
|
+
const scopedModels = () => liveModels().filter(model => admitted(model.id));
|
|
28
|
+
let scoped = scopedModels();
|
|
29
|
+
if (scoped.length > 64)
|
|
30
|
+
throw new Error('Review model enumeration exceeds the work bound');
|
|
31
|
+
// Projection runs synchronously inside the final capture revalidation, so
|
|
32
|
+
// no promise continuation can change ownership between proof and envelope.
|
|
33
|
+
const project = (native) => {
|
|
34
|
+
scoped = scopedModels();
|
|
35
|
+
if (native && (native.provenance.some(run => run.sources.some(source => !admitted(source.modelId)))
|
|
36
|
+
|| native.latestAttempt?.proof?.sources.some(source => !admitted(source.modelId)))) {
|
|
37
|
+
native.runs = [];
|
|
38
|
+
native.findings = [];
|
|
39
|
+
native.provenance = [];
|
|
40
|
+
native.coverage = [];
|
|
41
|
+
native.latestAttempt = null;
|
|
42
|
+
native.availability = 'unavailable';
|
|
43
|
+
native.refusal = 'scope';
|
|
44
|
+
}
|
|
45
|
+
const findings = native?.findings.slice(0, cap) ?? [];
|
|
46
|
+
// Presentation text is bounded independently of exact native identity/counts.
|
|
47
|
+
let clippedTextFields = 0;
|
|
48
|
+
const text = (value) => {
|
|
49
|
+
if (value.length <= 512)
|
|
50
|
+
return value;
|
|
51
|
+
clippedTextFields++;
|
|
52
|
+
// Keep the UTF-16 work bound without leaving half of an actual pair.
|
|
53
|
+
const high = value.charCodeAt(511), low = value.charCodeAt(512);
|
|
54
|
+
const end = high >= 0xD800 && high <= 0xDBFF && low >= 0xDC00 && low <= 0xDFFF ? 511 : 512;
|
|
55
|
+
return value.slice(0, end);
|
|
56
|
+
};
|
|
57
|
+
for (const finding of findings) {
|
|
58
|
+
finding.title = text(finding.title);
|
|
59
|
+
finding.detail = finding.detail.map(text);
|
|
60
|
+
finding.storeys = finding.storeys.map(text);
|
|
61
|
+
finding.disciplines = finding.disciplines.map(text);
|
|
62
|
+
for (const element of finding.elements)
|
|
63
|
+
if (element.name !== undefined)
|
|
64
|
+
element.name = text(element.name);
|
|
65
|
+
}
|
|
66
|
+
for (const run of native?.runs ?? []) {
|
|
67
|
+
run.label = text(run.label);
|
|
68
|
+
for (const gap of run.incomplete)
|
|
69
|
+
if (gap.detail !== undefined)
|
|
70
|
+
gap.detail = text(gap.detail);
|
|
71
|
+
}
|
|
72
|
+
const cards = buildCards(findings, scoped);
|
|
73
|
+
const sources = selected.map(source => ({ source: source,
|
|
74
|
+
state: source === 'validation' ? native?.availability ?? 'not-run' : 'unsupported',
|
|
75
|
+
...(source === 'validation' && native?.refusal ? { refusal: native.refusal } : {}) }));
|
|
76
|
+
const known = native && native.availability === 'available' ? native.findings.length : null;
|
|
77
|
+
const response = { retention: native?.retention ?? null, latestAttempt: native?.latestAttempt ?? null, findings, runs: native?.runs ?? [], provenance: native?.provenance ?? [], coverage: native?.coverage ?? [],
|
|
78
|
+
cards: cards.cards, totals: cards.totals, sources,
|
|
79
|
+
bounds: { knownFindings: known, omittedFindings: known === null ? null : known - findings.length,
|
|
80
|
+
rowLimit: cap, textLimit: 512, clippedTextFields, knownFindingsScope: 'retained-current-contexts',
|
|
81
|
+
nativeCoverageComplete: native?.availability === 'available' && !native.retention?.inventoryOmitted && native.runs.length > 0 && native.runs.every(run => run.complete),
|
|
82
|
+
presentationComplete: native?.availability === 'available' && native.findings.length <= cap && !clippedTextFields } };
|
|
83
|
+
// Card projection also reads current display metadata. Check that final
|
|
84
|
+
// envelope, not only the original captured rows, before returning it.
|
|
85
|
+
if (!captures.acceptsEvidence(response)) {
|
|
86
|
+
const empty = buildCards([], []);
|
|
87
|
+
return { retention: null, latestAttempt: null, findings: [], runs: [], provenance: [], coverage: [], cards: empty.cards, totals: empty.totals,
|
|
88
|
+
sources: selected.map(source => ({ source: source,
|
|
89
|
+
state: source === 'validation' ? 'unavailable' : 'unsupported',
|
|
90
|
+
...(source === 'validation' ? { refusal: native?.refusal ?? 'sensitive-input' } : {}) })),
|
|
91
|
+
bounds: { knownFindings: null, omittedFindings: null, rowLimit: cap, textLimit: 512, clippedTextFields: 0, knownFindingsScope: 'retained-current-contexts',
|
|
92
|
+
nativeCoverageComplete: false, presentationComplete: false } };
|
|
93
|
+
}
|
|
94
|
+
return response;
|
|
95
|
+
};
|
|
96
|
+
return selected.includes('validation') ? captures.read(liveModels, allowed, project, selectedModel) : project(null);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=native-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-snapshot.js","sourceRoot":"","sources":["../../src/review/native-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Existing bijective saved source binding shared by native Review and viewer (#7372). */
|
|
2
|
+
import type { SavedAnalysisRun, SavedRunModel } from './portable-analysis.js';
|
|
3
|
+
export interface PortableAnalysisBindingState {
|
|
4
|
+
models: ReadonlyMap<string, {
|
|
5
|
+
name: string;
|
|
6
|
+
sourceFingerprint?: string;
|
|
7
|
+
sourceContentHash?: string;
|
|
8
|
+
}>;
|
|
9
|
+
realignedFrameKey?: string | null;
|
|
10
|
+
hasChanges: (modelId: string) => boolean;
|
|
11
|
+
/** Canonical actual placement evidence, not guessed offsets or model names. */
|
|
12
|
+
placementMatches: (modelId: string, recorded: NonNullable<SavedRunModel['placement']>) => boolean;
|
|
13
|
+
}
|
|
14
|
+
export type BindRefusalCode = 'runEdited' | 'frameChanged' | 'modelSetChanged' | 'modelEdited' | 'sourceUnknown' | 'modelMissing' | 'modelReplaced' | 'modelAmbiguous' | 'modelMoved';
|
|
15
|
+
export interface BindRefusal {
|
|
16
|
+
code: BindRefusalCode;
|
|
17
|
+
model?: string;
|
|
18
|
+
before?: number;
|
|
19
|
+
open?: number;
|
|
20
|
+
}
|
|
21
|
+
/** Resolve each saved model to one open model, or every reason it cannot be. */
|
|
22
|
+
export declare function bindSavedAnalysisModels(saved: Pick<SavedAnalysisRun, 'models' | 'edited' | 'placementRecorded' | 'frame'>, state: PortableAnalysisBindingState): {
|
|
23
|
+
ok: true;
|
|
24
|
+
ids: Map<string, string>;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
refusals: BindRefusal[];
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=portable-analysis-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-analysis-binding.d.ts","sourceRoot":"","sources":["../../src/review/portable-analysis-binding.ts"],"names":[],"mappings":"AAIA,0FAA0F;AAC1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE9E,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtG,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,+EAA+E;IAC/E,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,KAAK,OAAO,CAAC;CACnG;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,cAAc,GAAG,iBAAiB,GAAG,aAAa,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,GAAG,YAAY,CAAC;AACtL,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAQtG,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,GAAG,mBAAmB,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,4BAA4B,GAC7J;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,CAoChF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
function sameSource(saved, open) {
|
|
5
|
+
// The full-content hash decides whenever both sides have it; the sampled fingerprint only when one side lacks it.
|
|
6
|
+
if (saved.sourceContentHash && open.sourceContentHash)
|
|
7
|
+
return saved.sourceContentHash === open.sourceContentHash;
|
|
8
|
+
return !!saved.sourceFingerprint && saved.sourceFingerprint === open.sourceFingerprint;
|
|
9
|
+
}
|
|
10
|
+
/** Resolve each saved model to one open model, or every reason it cannot be. */
|
|
11
|
+
export function bindSavedAnalysisModels(saved, state) {
|
|
12
|
+
const refusals = [];
|
|
13
|
+
if (saved.edited)
|
|
14
|
+
refusals.push({ code: 'runEdited' });
|
|
15
|
+
// In its session a placement-stamped run goes stale when the realignment or the open-model set changes
|
|
16
|
+
// (`isAnalysisStale`); a reopened run gets a fresh stamp, so either difference refuses here instead.
|
|
17
|
+
if (saved.frame) {
|
|
18
|
+
if ((state.realignedFrameKey ?? null) !== saved.frame.realignedFrameKey)
|
|
19
|
+
refusals.push({ code: 'frameChanged' });
|
|
20
|
+
if (state.models.size !== saved.frame.openModels)
|
|
21
|
+
refusals.push({ code: 'modelSetChanged', before: saved.frame.openModels, open: state.models.size });
|
|
22
|
+
}
|
|
23
|
+
const ids = new Map();
|
|
24
|
+
const claimed = new Map();
|
|
25
|
+
// The frame's other models are bound like the examined ones (same file, open once, unedited, unmoved), never used by the run.
|
|
26
|
+
for (const model of [...saved.models, ...saved.frame?.others ?? []]) {
|
|
27
|
+
if (!model.sourceContentHash && !model.sourceFingerprint) {
|
|
28
|
+
refusals.push({ code: 'sourceUnknown', model: model.name });
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const matches = [...state.models].filter(([, open]) => sameSource(model, open)).map(([id]) => id);
|
|
32
|
+
if (matches.length === 0) {
|
|
33
|
+
refusals.push({ code: [...state.models.values()].some(open => open.name === model.name) ? 'modelReplaced' : 'modelMissing', model: model.name });
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
// Two open copies of one file, or two saved models claiming one open model: neither has an identity.
|
|
37
|
+
if (matches.length > 1 || claimed.has(matches[0])) {
|
|
38
|
+
refusals.push({ code: 'modelAmbiguous', model: model.name });
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const id = matches[0];
|
|
42
|
+
claimed.set(id, model.key);
|
|
43
|
+
// Unsaved edits mean the open model no longer is the file its source identity names.
|
|
44
|
+
if (state.hasChanges(id)) {
|
|
45
|
+
refusals.push({ code: 'modelEdited', model: model.name });
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (saved.placementRecorded) {
|
|
49
|
+
// The caller supplies the canonical placement comparison; a missing
|
|
50
|
+
// recorded placement remains unknown rather than an inferred match.
|
|
51
|
+
if (!model.placement || !state.placementMatches(id, model.placement)) {
|
|
52
|
+
refusals.push({ code: 'modelMoved', model: model.name });
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
ids.set(model.key, id);
|
|
57
|
+
}
|
|
58
|
+
return refusals.length ? { ok: false, refusals } : { ok: true, ids };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=portable-analysis-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-analysis-binding.js","sourceRoot":"","sources":["../../src/review/portable-analysis-binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portable contract for a captured clash or validation run kept for
|
|
3
|
+
* cross-revision reconciliation (#7370). No store or runtime imports: the
|
|
4
|
+
* content library, a backup import and recovery all validate through
|
|
5
|
+
* `decodeSavedAnalysisRun`.
|
|
6
|
+
*
|
|
7
|
+
* A session capture (`CapturedRun`) is the native result object, which names
|
|
8
|
+
* the session's model ids and, for clashes, renderer ids. Neither means
|
|
9
|
+
* anything after a reload. A saved run therefore keeps the native result with
|
|
10
|
+
* every model id replaced by a join key (`SavedRunModel.key`), each model by
|
|
11
|
+
* its name and the source identities the viewer had for it, and each clash
|
|
12
|
+
* element by its local express id instead of the renderer id. An element
|
|
13
|
+
* without a GlobalId has a model-scoped key (`expressid:<model>:<id>`); its
|
|
14
|
+
* model part is the join key too. Everything the
|
|
15
|
+
* reconciler compares (rules, settings, coverage, truncation, specifications,
|
|
16
|
+
* rule content, per-entity results) is kept as the native run recorded it, so
|
|
17
|
+
* the same compatibility checks and refusals apply to a reopened run.
|
|
18
|
+
*/
|
|
19
|
+
import type { Clash, ClashElementRef, ClashResult } from '@ifc-lite/clash';
|
|
20
|
+
import type { ValidationReport } from '@ifc-lite/ids';
|
|
21
|
+
export type SavedTranslation = [number, number, number];
|
|
22
|
+
/** One model the run drew from. `key` joins the rows of this payload; it is never a live model id. */
|
|
23
|
+
export interface SavedRunModel {
|
|
24
|
+
key: string;
|
|
25
|
+
name: string;
|
|
26
|
+
/** Sampled source fingerprint (`FederatedModel.sourceFingerprint`), when the viewer had one. */
|
|
27
|
+
sourceFingerprint?: string;
|
|
28
|
+
/** Full-content source hash (`FederatedModel.sourceContentHash`), when the viewer had one. */
|
|
29
|
+
sourceContentHash?: string;
|
|
30
|
+
/** Placement the run was stamped with; absent when the run recorded none. */
|
|
31
|
+
placement?: {
|
|
32
|
+
translation: SavedTranslation;
|
|
33
|
+
angle: number;
|
|
34
|
+
pivot: SavedTranslation;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** A clash element named by its local express id; the renderer id is rebuilt from the bound model. */
|
|
38
|
+
export type SavedClashRef = Omit<ClashElementRef, 'ref'> & {
|
|
39
|
+
expressId: number;
|
|
40
|
+
};
|
|
41
|
+
/** A non-finite distance survives as its name: JSON would turn it into null. */
|
|
42
|
+
export type SavedDistance = number | 'Infinity' | '-Infinity' | 'NaN';
|
|
43
|
+
export type SavedRunClash = Omit<Clash, 'a' | 'b' | 'distance'> & {
|
|
44
|
+
a: SavedClashRef;
|
|
45
|
+
b: SavedClashRef;
|
|
46
|
+
distance: SavedDistance;
|
|
47
|
+
};
|
|
48
|
+
export type SavedRunClashResult = Omit<ClashResult, 'clashes'> & {
|
|
49
|
+
clashes: SavedRunClash[];
|
|
50
|
+
};
|
|
51
|
+
export type SavedRunValidationReport = Omit<ValidationReport, 'timestamp'> & {
|
|
52
|
+
timestamp: string;
|
|
53
|
+
};
|
|
54
|
+
/** The rule content a rules report ran from (`ReportRuleSetContent`), as rule id/text pairs. */
|
|
55
|
+
export interface SavedRuleSetContent {
|
|
56
|
+
file: string;
|
|
57
|
+
rules: Array<[string, string]>;
|
|
58
|
+
}
|
|
59
|
+
interface SavedAnalysisRunBase {
|
|
60
|
+
version: 1;
|
|
61
|
+
/** The session capture id, kept so a reopened run is the same run to reconciliation and Review. */
|
|
62
|
+
id: string;
|
|
63
|
+
capturedAt: string;
|
|
64
|
+
savedAt: string;
|
|
65
|
+
models: SavedRunModel[];
|
|
66
|
+
/** Keys of the models the run examined; null when the run did not record them. */
|
|
67
|
+
examined: string[] | null;
|
|
68
|
+
/** When saved: the run described the open models, they changed after it, or the run carried no freshness stamp. */
|
|
69
|
+
freshness: 'current' | 'stale' | 'unknown';
|
|
70
|
+
/** A model the run examined had unsaved edits when it ran, so the run does not describe its file; null when unknown. */
|
|
71
|
+
edited: boolean | null;
|
|
72
|
+
/** The run's stamp recorded each model's placement (clash runs do). */
|
|
73
|
+
placementRecorded: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* The placement frame of a placement-stamped run, exactly what makes such a run stale in its session:
|
|
76
|
+
* the committed realignment (`realignedFrameKey`), how many models were open, and each open model the run
|
|
77
|
+
* did not examine (`others`, with its source identity and placement). Null without placement.
|
|
78
|
+
*/
|
|
79
|
+
frame: {
|
|
80
|
+
realignedFrameKey: string | null;
|
|
81
|
+
openModels: number;
|
|
82
|
+
others: SavedRunModel[];
|
|
83
|
+
} | null;
|
|
84
|
+
}
|
|
85
|
+
export type SavedAnalysisRun = SavedAnalysisRunBase & {
|
|
86
|
+
kind: 'clash';
|
|
87
|
+
result: SavedRunClashResult;
|
|
88
|
+
} | SavedAnalysisRunBase & {
|
|
89
|
+
kind: 'validation';
|
|
90
|
+
report: SavedRunValidationReport;
|
|
91
|
+
ruleSet: SavedRuleSetContent | null;
|
|
92
|
+
};
|
|
93
|
+
export declare const SAVED_RUN_LIMITS: {
|
|
94
|
+
readonly models: 1000;
|
|
95
|
+
readonly clashes: 200000;
|
|
96
|
+
readonly rules: 2000;
|
|
97
|
+
readonly specifications: 5000;
|
|
98
|
+
readonly text: 2000;
|
|
99
|
+
};
|
|
100
|
+
/** Strict: one invalid row refuses the whole run rather than reconciling a subset of it as if it were the run. */
|
|
101
|
+
export declare function decodeSavedAnalysisRun(v: unknown): SavedAnalysisRun | null;
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=portable-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-analysis.d.ts","sourceRoot":"","sources":["../../src/review/portable-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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 const SAVED_RUN_LIMITS = { models: 1_000, clashes: 200_000, rules: 2_000, specifications: 5_000, text: 2_000 };
|
|
5
|
+
const record = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
6
|
+
const text = (v, allowEmpty = false, max = SAVED_RUN_LIMITS.text) => typeof v === 'string' && v.length <= max && (allowEmpty || v.length > 0);
|
|
7
|
+
const anyText = (v) => typeof v === 'string';
|
|
8
|
+
const finite = (v) => typeof v === 'number' && Number.isFinite(v);
|
|
9
|
+
const count = (v) => typeof v === 'number' && Number.isSafeInteger(v) && v >= 0;
|
|
10
|
+
const optional = (v, check) => v === undefined || check(v);
|
|
11
|
+
const bool = (v) => typeof v === 'boolean';
|
|
12
|
+
const date = (v) => typeof v === 'string' && Number.isFinite(Date.parse(v));
|
|
13
|
+
const list = (v, max, check) => Array.isArray(v) && v.length <= max && v.every(check);
|
|
14
|
+
const oneOf = (v, values) => typeof v === 'string' && values.includes(v);
|
|
15
|
+
const vector = (v) => Array.isArray(v) && v.length === 3 && v.every(finite);
|
|
16
|
+
function isModel(v) {
|
|
17
|
+
return record(v) && text(v.key) && text(v.name) && optional(v.sourceFingerprint, text) && optional(v.sourceContentHash, text)
|
|
18
|
+
&& optional(v.placement, p => record(p) && vector(p.translation) && finite(p.angle) && vector(p.pivot));
|
|
19
|
+
}
|
|
20
|
+
function isClashRef(v, keys) {
|
|
21
|
+
return record(v) && text(v.key) && text(v.model) && keys.has(v.model) && anyText(v.tag) && optional(v.name, anyText) && count(v.expressId);
|
|
22
|
+
}
|
|
23
|
+
const DISTANCE_NAMES = ['Infinity', '-Infinity', 'NaN'];
|
|
24
|
+
function isClash(v, keys) {
|
|
25
|
+
return record(v) && text(v.id) && text(v.rule) && oneOf(v.status, ['hard', 'clearance', 'touch'])
|
|
26
|
+
&& oneOf(v.severity, ['critical', 'major', 'minor', 'info']) && (finite(v.distance) || oneOf(v.distance, DISTANCE_NAMES))
|
|
27
|
+
&& optional(v.distanceKind, k => oneOf(k, ['mesh', 'estimate'])) && optional(v.depthFloor, finite)
|
|
28
|
+
&& vector(v.point) && record(v.bounds) && vector(v.bounds.min) && vector(v.bounds.max)
|
|
29
|
+
&& isClashRef(v.a, keys) && isClashRef(v.b, keys);
|
|
30
|
+
}
|
|
31
|
+
const keyList = (v) => Array.isArray(v) && v.every(anyText);
|
|
32
|
+
function isCoverage(v) {
|
|
33
|
+
return record(v) && text(v.rule) && count(v.matchedA) && (v.matchedB === null || count(v.matchedB))
|
|
34
|
+
&& optional(v.fromMembersA, bool) && optional(v.fromMembersB, bool) && optional(v.matchedKeysA, keyList)
|
|
35
|
+
&& optional(v.matchedKeysB, k => k === null || keyList(k)) && optional(v.candidatesExamined, count);
|
|
36
|
+
}
|
|
37
|
+
function isRule(v) {
|
|
38
|
+
// Member lists name session renderer ids; a saved run never carries them.
|
|
39
|
+
return record(v) && text(v.id) && anyText(v.name) && anyText(v.a) && optional(v.b, anyText) && oneOf(v.mode, ['hard', 'clearance'])
|
|
40
|
+
&& optional(v.tolerance, finite) && optional(v.clearance, finite)
|
|
41
|
+
&& optional(v.severity, s => oneOf(s, ['critical', 'major', 'minor', 'info'])) && optional(v.reportTouch, bool)
|
|
42
|
+
&& v.membersA === undefined && v.membersB === undefined;
|
|
43
|
+
}
|
|
44
|
+
function isClashResult(v, keys) {
|
|
45
|
+
if (!record(v) || !record(v.settings) || !finite(v.settings.tolerance) || !bool(v.settings.excludeVoidsAndHosts))
|
|
46
|
+
return false;
|
|
47
|
+
if (!record(v.summary) || !list(v.rulesRun, SAVED_RUN_LIMITS.rules, isRule))
|
|
48
|
+
return false;
|
|
49
|
+
if (!optional(v.ruleCoverage, c => list(c, SAVED_RUN_LIMITS.rules, isCoverage)))
|
|
50
|
+
return false;
|
|
51
|
+
if (!optional(v.truncated, t => record(t) && anyText(t.reason) && count(t.droppedPairs)))
|
|
52
|
+
return false;
|
|
53
|
+
return list(v.clashes, SAVED_RUN_LIMITS.clashes, clash => isClash(clash, keys));
|
|
54
|
+
}
|
|
55
|
+
function isEntity(v, keys) {
|
|
56
|
+
return record(v) && count(v.expressId) && text(v.modelId) && keys.has(v.modelId) && anyText(v.entityType)
|
|
57
|
+
&& optional(v.entityName, anyText) && optional(v.globalId, anyText) && bool(v.passed)
|
|
58
|
+
&& Array.isArray(v.requirementResults) && v.requirementResults.every(r => record(r) && record(r.requirement)
|
|
59
|
+
&& anyText(r.requirement.id) && oneOf(r.status, ['pass', 'fail', 'not_applicable']) && optional(r.actualValue, anyText));
|
|
60
|
+
}
|
|
61
|
+
function isSetResult(v, keys) {
|
|
62
|
+
return record(v) && Array.isArray(v.members) && v.members.every(m => record(m) && text(m.modelId) && keys.has(m.modelId) && count(m.expressId));
|
|
63
|
+
}
|
|
64
|
+
function isSpecification(v, keys) {
|
|
65
|
+
return record(v) && record(v.specification) && anyText(v.specification.id) && anyText(v.specification.name)
|
|
66
|
+
&& oneOf(v.status, ['pass', 'fail', 'not_applicable']) && count(v.applicableCount) && count(v.passedCount) && count(v.failedCount)
|
|
67
|
+
&& optional(v.error, anyText) && Array.isArray(v.entityResults) && v.entityResults.every(e => isEntity(e, keys))
|
|
68
|
+
&& optional(v.setResults, s => Array.isArray(s) && s.every(r => isSetResult(r, keys)));
|
|
69
|
+
}
|
|
70
|
+
function isModelInfo(v, keys) {
|
|
71
|
+
return record(v) && text(v.modelId) && keys.has(v.modelId) && anyText(v.schemaVersion) && count(v.entityCount);
|
|
72
|
+
}
|
|
73
|
+
function isValidationReport(v, keys) {
|
|
74
|
+
if (!record(v) || !date(v.timestamp) || !record(v.summary) || !record(v.source))
|
|
75
|
+
return false;
|
|
76
|
+
const source = v.source;
|
|
77
|
+
if (!(source.kind === 'ids' && record(source.document) && Array.isArray(source.document.specifications))
|
|
78
|
+
&& !(source.kind === 'rules' && record(source.ruleSet) && anyText(source.ruleSet.name)))
|
|
79
|
+
return false;
|
|
80
|
+
return list(v.modelInfo, SAVED_RUN_LIMITS.models, info => isModelInfo(info, keys))
|
|
81
|
+
&& list(v.specificationResults, SAVED_RUN_LIMITS.specifications, spec => isSpecification(spec, keys));
|
|
82
|
+
}
|
|
83
|
+
function isRuleSet(v) {
|
|
84
|
+
return record(v) && anyText(v.file) && Array.isArray(v.rules)
|
|
85
|
+
&& v.rules.every(entry => Array.isArray(entry) && entry.length === 2 && anyText(entry[0]) && anyText(entry[1]));
|
|
86
|
+
}
|
|
87
|
+
const isFrame = (v) => record(v)
|
|
88
|
+
&& (v.realignedFrameKey === null || text(v.realignedFrameKey)) && count(v.openModels) && v.openModels > 0
|
|
89
|
+
&& list(v.others, SAVED_RUN_LIMITS.models, other => isModel(other) && other.placement !== undefined);
|
|
90
|
+
/** Strict: one invalid row refuses the whole run rather than reconciling a subset of it as if it were the run. */
|
|
91
|
+
export function decodeSavedAnalysisRun(v) {
|
|
92
|
+
if (!record(v) || v.version !== 1 || !text(v.id, false, 200) || !date(v.capturedAt) || !date(v.savedAt))
|
|
93
|
+
return null;
|
|
94
|
+
if (!oneOf(v.freshness, ['current', 'stale', 'unknown']) || !(v.edited === null || bool(v.edited)) || !bool(v.placementRecorded))
|
|
95
|
+
return null;
|
|
96
|
+
if (v.placementRecorded ? !isFrame(v.frame) : v.frame !== null)
|
|
97
|
+
return null;
|
|
98
|
+
if (!list(v.models, SAVED_RUN_LIMITS.models, isModel))
|
|
99
|
+
return null;
|
|
100
|
+
const keys = new Set(v.models.map(model => model.key));
|
|
101
|
+
if (keys.size !== v.models.length)
|
|
102
|
+
return null;
|
|
103
|
+
// A placement-stamped run recorded where every model sat: one without its placement could never be checked for a move.
|
|
104
|
+
if (v.placementRecorded && v.models.some(model => model.placement === undefined))
|
|
105
|
+
return null;
|
|
106
|
+
// A frame model is one the run did not examine: its key never names a run model, and no two share one.
|
|
107
|
+
const others = isFrame(v.frame) ? v.frame.others : [];
|
|
108
|
+
if (new Set([...keys, ...others.map(other => other.key)]).size !== keys.size + others.length)
|
|
109
|
+
return null;
|
|
110
|
+
if (v.examined !== null && !list(v.examined, SAVED_RUN_LIMITS.models, key => typeof key === 'string' && keys.has(key)))
|
|
111
|
+
return null;
|
|
112
|
+
if (v.kind === 'clash')
|
|
113
|
+
return isClashResult(v.result, keys) ? v : null;
|
|
114
|
+
if (v.kind === 'validation') {
|
|
115
|
+
return isValidationReport(v.report, keys) && (v.ruleSet === null || isRuleSet(v.ruleSet)) ? v : null;
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=portable-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-analysis.js","sourceRoot":"","sources":["../../src/review/portable-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Optional, portable execution context beside immutable native evidence (#6612). */
|
|
2
|
+
export interface AutomationReportProvenance {
|
|
3
|
+
origin: 'flow';
|
|
4
|
+
workflowId: string;
|
|
5
|
+
runId: string;
|
|
6
|
+
jobId: string;
|
|
7
|
+
resultId: string;
|
|
8
|
+
resource?: {
|
|
9
|
+
name: string;
|
|
10
|
+
fingerprint?: string;
|
|
11
|
+
};
|
|
12
|
+
effectiveOptions?: Record<string, AutomationJsonValue>;
|
|
13
|
+
models: Array<{
|
|
14
|
+
id?: string;
|
|
15
|
+
name: string;
|
|
16
|
+
sourceFingerprint?: string;
|
|
17
|
+
mutationRevision?: number;
|
|
18
|
+
}>;
|
|
19
|
+
timestamp: string;
|
|
20
|
+
diagnostics?: Array<{
|
|
21
|
+
severity: 'warning' | 'error';
|
|
22
|
+
message: string;
|
|
23
|
+
code?: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export type AutomationJsonValue = null | boolean | number | string | AutomationJsonValue[] | {
|
|
27
|
+
[key: string]: AutomationJsonValue;
|
|
28
|
+
};
|
|
29
|
+
export declare function isAutomationReportProvenance(value: unknown): value is AutomationReportProvenance;
|
|
30
|
+
/** JSON evidence equality ignores object member order; IDs and provenance remain significant. */
|
|
31
|
+
export declare function sameReportEvidence(left: unknown, right: unknown): boolean;
|
|
32
|
+
//# sourceMappingURL=portable-automation-provenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-automation-provenance.d.ts","sourceRoot":"","sources":["../../src/review/portable-automation-provenance.ts"],"names":[],"mappings":"AAIA,qFAAqF;AACrF,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACvD,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF;AACD,MAAM,MAAM,mBAAmB,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,mBAAmB,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAA;CAAE,CAAC;AAgBpI,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,0BAA0B,CAYhG;AAED,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAczE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
const record = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
5
|
+
const identifier = (value) => typeof value === 'string' && value.length > 0 && value.length <= 512;
|
|
6
|
+
const optionalString = (value) => value === undefined || identifier(value);
|
|
7
|
+
/** Bound the metadata traversal independently of the native report's entity rows. */
|
|
8
|
+
function portable(value, depth, budget) {
|
|
9
|
+
if (depth > 12 || --budget.left < 0)
|
|
10
|
+
return false;
|
|
11
|
+
if (value === null || typeof value === 'boolean')
|
|
12
|
+
return true;
|
|
13
|
+
if (typeof value === 'number')
|
|
14
|
+
return Number.isFinite(value);
|
|
15
|
+
if (typeof value === 'string')
|
|
16
|
+
return value.length <= 16384;
|
|
17
|
+
if (Array.isArray(value))
|
|
18
|
+
return value.length <= 2048 && value.every((entry) => portable(entry, depth + 1, budget));
|
|
19
|
+
return record(value) && Object.keys(value).length <= 512
|
|
20
|
+
&& Object.entries(value).every(([key, entry]) => key.length <= 512 && portable(entry, depth + 1, budget));
|
|
21
|
+
}
|
|
22
|
+
export function isAutomationReportProvenance(value) {
|
|
23
|
+
if (!record(value) || value.origin !== 'flow' ||
|
|
24
|
+
!['workflowId', 'runId', 'jobId', 'resultId'].every((key) => identifier(value[key])) ||
|
|
25
|
+
typeof value.timestamp !== 'string' || !Number.isFinite(Date.parse(value.timestamp)))
|
|
26
|
+
return false;
|
|
27
|
+
if (value.resource !== undefined && (!record(value.resource) || !identifier(value.resource.name) || !optionalString(value.resource.fingerprint)))
|
|
28
|
+
return false;
|
|
29
|
+
if (value.effectiveOptions !== undefined && (!record(value.effectiveOptions) || !portable(value.effectiveOptions, 0, { left: 10000 })))
|
|
30
|
+
return false;
|
|
31
|
+
if (!Array.isArray(value.models) || value.models.length > 1000 || !value.models.every((model) => record(model)
|
|
32
|
+
&& identifier(model.name) && optionalString(model.id) && optionalString(model.sourceFingerprint)
|
|
33
|
+
&& (model.mutationRevision === undefined || (typeof model.mutationRevision === 'number' && Number.isSafeInteger(model.mutationRevision) && model.mutationRevision >= 0))))
|
|
34
|
+
return false;
|
|
35
|
+
return value.diagnostics === undefined || (Array.isArray(value.diagnostics) && value.diagnostics.length <= 1000 && value.diagnostics.every((diagnostic) => record(diagnostic)
|
|
36
|
+
&& (diagnostic.severity === 'warning' || diagnostic.severity === 'error') && typeof diagnostic.message === 'string'
|
|
37
|
+
&& diagnostic.message.length > 0 && diagnostic.message.length <= 16384 && optionalString(diagnostic.code)));
|
|
38
|
+
}
|
|
39
|
+
/** JSON evidence equality ignores object member order; IDs and provenance remain significant. */
|
|
40
|
+
export function sameReportEvidence(left, right) {
|
|
41
|
+
const normalize = (value, depth, path) => {
|
|
42
|
+
if (depth > 64)
|
|
43
|
+
throw new Error('Evidence nesting exceeds the supported depth');
|
|
44
|
+
if (typeof value !== 'object' || value === null)
|
|
45
|
+
return value;
|
|
46
|
+
if (path.has(value))
|
|
47
|
+
throw new Error('Evidence must not contain cycles');
|
|
48
|
+
path.add(value);
|
|
49
|
+
try {
|
|
50
|
+
if (Array.isArray(value))
|
|
51
|
+
return value.map((entry) => normalize(entry, depth + 1, path));
|
|
52
|
+
if (record(value))
|
|
53
|
+
return Object.fromEntries(Object.keys(value).sort().map((key) => [key, normalize(value[key], depth + 1, path)]));
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
path.delete(value);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
try {
|
|
61
|
+
return JSON.stringify(normalize(left, 0, new WeakSet())) === JSON.stringify(normalize(right, 0, new WeakSet()));
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.warn('[Reports] Unable to compare evidence', error);
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=portable-automation-provenance.js.map
|