@ifc-lite/mcp 0.16.0 → 0.18.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 +1 -1
- package/dist/authored-attribute-value.d.ts +3 -0
- package/dist/authored-attribute-value.d.ts.map +1 -0
- package/dist/authored-attribute-value.js +34 -0
- package/dist/authored-attribute-value.js.map +1 -0
- package/dist/backend-query-relationships.d.ts +5 -0
- package/dist/backend-query-relationships.d.ts.map +1 -0
- package/dist/backend-query-relationships.js +55 -0
- package/dist/backend-query-relationships.js.map +1 -0
- package/dist/backend-query.d.ts +3 -5
- package/dist/backend-query.d.ts.map +1 -1
- package/dist/backend-query.js +68 -106
- package/dist/backend-query.js.map +1 -1
- package/dist/headless-backend-cost-store.d.ts +14 -0
- package/dist/headless-backend-cost-store.d.ts.map +1 -0
- package/dist/headless-backend-cost-store.js +20 -0
- package/dist/headless-backend-cost-store.js.map +1 -0
- package/dist/headless-backend.d.ts +2 -1
- package/dist/headless-backend.d.ts.map +1 -1
- package/dist/headless-backend.js +10 -2
- package/dist/headless-backend.js.map +1 -1
- package/dist/overlay.d.ts +10 -22
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +44 -77
- package/dist/overlay.js.map +1 -1
- package/dist/tools/cost.d.ts +3 -0
- package/dist/tools/cost.d.ts.map +1 -0
- package/dist/tools/cost.js +59 -0
- package/dist/tools/cost.js.map +1 -0
- package/dist/tools/diff-authored-keys.d.ts +66 -0
- package/dist/tools/diff-authored-keys.d.ts.map +1 -0
- package/dist/tools/diff-authored-keys.js +144 -0
- package/dist/tools/diff-authored-keys.js.map +1 -0
- package/dist/tools/diff-content.d.ts +33 -0
- package/dist/tools/diff-content.d.ts.map +1 -0
- package/dist/tools/diff-content.js +158 -0
- package/dist/tools/diff-content.js.map +1 -0
- package/dist/tools/diff-fingerprints.d.ts +3 -1
- package/dist/tools/diff-fingerprints.d.ts.map +1 -1
- package/dist/tools/diff-fingerprints.js +19 -49
- package/dist/tools/diff-fingerprints.js.map +1 -1
- package/dist/tools/diff.d.ts.map +1 -1
- package/dist/tools/diff.js +33 -109
- package/dist/tools/diff.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/package.json +18 -18
|
@@ -0,0 +1,144 @@
|
|
|
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
|
+
* Attribute reading for the MCP diff adapter, and authored keys (issue #4955): `key_from` keys the
|
|
6
|
+
* comparison on `Tag` or a `Pset.Prop` instead of GlobalId. Read through the
|
|
7
|
+
* session OVERLAY, like every other fingerprinted value, so a queued edit or
|
|
8
|
+
* tombstone is what the comparison sees. Split out of `diff-fingerprints.ts`
|
|
9
|
+
* for size.
|
|
10
|
+
*/
|
|
11
|
+
import { EntityExtractor, authoredKeyValue, extractRootAttributesFromEntity, getAttributeNamesAcrossSchemas, parseAuthoredKeySpec, } from '@ifc-lite/parser';
|
|
12
|
+
/** Prefix on a fingerprint key taken from an authored property rather than a GlobalId. */
|
|
13
|
+
export const AUTHORED_KEY_PREFIX = 'prop:';
|
|
14
|
+
/**
|
|
15
|
+
* A collision found on either revision invalidates that authored value on
|
|
16
|
+
* both. The first side may already have been built when the second reveals the
|
|
17
|
+
* collision, so repair its key back to the entity's GlobalId before diffing.
|
|
18
|
+
*/
|
|
19
|
+
export function fallbackPairDuplicateAuthoredKeys(sides, duplicates) {
|
|
20
|
+
if (duplicates.size === 0)
|
|
21
|
+
return;
|
|
22
|
+
for (const { fingerprints, store } of sides) {
|
|
23
|
+
const extractor = new EntityExtractor(store.source);
|
|
24
|
+
for (const fingerprint of fingerprints) {
|
|
25
|
+
if (!fingerprint.key.startsWith(AUTHORED_KEY_PREFIX))
|
|
26
|
+
continue;
|
|
27
|
+
const value = fingerprint.key.slice(AUTHORED_KEY_PREFIX.length);
|
|
28
|
+
if (!duplicates.has(value))
|
|
29
|
+
continue;
|
|
30
|
+
const tableGlobalId = store.entities.getGlobalId(fingerprint.ref);
|
|
31
|
+
const ref = store.entityIndex.byId.get(fingerprint.ref);
|
|
32
|
+
const entity = ref ? extractor.extractEntity(ref) : undefined;
|
|
33
|
+
const sourceGlobalId = entity ? extractRootAttributesFromEntity(entity).globalId : undefined;
|
|
34
|
+
const globalId = tableGlobalId || sourceGlobalId;
|
|
35
|
+
if (!globalId) {
|
|
36
|
+
throw new Error(`Cannot restore GlobalId for authored-key collision on #${fingerprint.ref}`);
|
|
37
|
+
}
|
|
38
|
+
fingerprint.key = globalId;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build the key resolver for one model: `prop:<value>` where the entity carries
|
|
44
|
+
* a non-empty value nobody else does, GlobalId otherwise. Duplicate values are
|
|
45
|
+
* reported on `options.duplicateAuthoredKeys`. Tombstoned entities are not
|
|
46
|
+
* owners: a deleted twin no longer contests the key. A created entity has no
|
|
47
|
+
* store row to read and keeps its GlobalId.
|
|
48
|
+
*/
|
|
49
|
+
export function authoredKeyResolver(store, overlay, options, extractor, isDependentType) {
|
|
50
|
+
const keySpec = options.keyProperty ? parseAuthoredKeySpec(options.keyProperty) : undefined;
|
|
51
|
+
if (!keySpec)
|
|
52
|
+
return (_expressId, globalId) => globalId;
|
|
53
|
+
const authoredKeyOf = (expressId) => {
|
|
54
|
+
if (keySpec.kind === 'tag') {
|
|
55
|
+
const edited = overlay?.attributes(expressId).get('Tag');
|
|
56
|
+
if (edited !== undefined)
|
|
57
|
+
return edited.trim().length > 0 ? edited.trim() : undefined;
|
|
58
|
+
}
|
|
59
|
+
else if (overlay) {
|
|
60
|
+
const set = overlay.propertySets(expressId).find((pset) => pset.name === keySpec.pset);
|
|
61
|
+
const property = set?.properties.find((p) => p.name === keySpec.property);
|
|
62
|
+
if (set) {
|
|
63
|
+
const raw = property?.value;
|
|
64
|
+
if (raw === null || raw === undefined)
|
|
65
|
+
return undefined;
|
|
66
|
+
const value = typeof raw === 'object' ? JSON.stringify(raw) : String(raw);
|
|
67
|
+
return value.trim().length > 0 ? value.trim() : undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return authoredKeyValue(store, expressId, keySpec, extractor);
|
|
71
|
+
};
|
|
72
|
+
// A first pass so a value two entities share can be refused for both,
|
|
73
|
+
// instead of the diff's first-wins index quietly keeping one.
|
|
74
|
+
const owners = new Map();
|
|
75
|
+
for (const [typeKey, ids] of store.entityIndex.byType) {
|
|
76
|
+
if (isDependentType(typeKey))
|
|
77
|
+
continue;
|
|
78
|
+
for (const expressId of ids) {
|
|
79
|
+
if (overlay?.deleted.has(expressId))
|
|
80
|
+
continue;
|
|
81
|
+
const value = authoredKeyOf(expressId);
|
|
82
|
+
if (value === undefined)
|
|
83
|
+
continue;
|
|
84
|
+
const list = owners.get(value);
|
|
85
|
+
if (list)
|
|
86
|
+
list.push(expressId);
|
|
87
|
+
else
|
|
88
|
+
owners.set(value, [expressId]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (const [value, ids] of owners) {
|
|
92
|
+
if (ids.length > 1)
|
|
93
|
+
options.duplicateAuthoredKeys?.set(value, ids);
|
|
94
|
+
}
|
|
95
|
+
return (expressId, globalId) => {
|
|
96
|
+
const value = authoredKeyOf(expressId);
|
|
97
|
+
if (value === undefined)
|
|
98
|
+
return globalId;
|
|
99
|
+
return (owners.get(value)?.length ?? 0) === 1 ? `${AUTHORED_KEY_PREFIX}${value}` : globalId;
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* One named attribute, read positionally through the **cross-schema** attribute
|
|
104
|
+
* list (issue #2021). The CLI's twin, and it must stay one.
|
|
105
|
+
*
|
|
106
|
+
* `extractAllEntityAttributes` names attributes through the parser's IFC4
|
|
107
|
+
* codegen pin, which answers an EMPTY list for a class the pin does not carry —
|
|
108
|
+
* so a `.find(name === 'Tag')` over it silently finds nothing on every
|
|
109
|
+
* IFC4X3-only type object (`IfcRailType`, `IfcTrackElementType`,
|
|
110
|
+
* `IfcSignalType`, …) while working perfectly on IFC2X3 and IFC4. That is a
|
|
111
|
+
* no-op nobody would notice: the entity is in scope, its class name is right,
|
|
112
|
+
* `isTypeObject` is right, and only the evidence is missing.
|
|
113
|
+
*
|
|
114
|
+
* This is the same pinned-registry family as the membership defect `#2001`
|
|
115
|
+
* fixed, and it has to be answered from the same place: the inheritance chain
|
|
116
|
+
* decides *whether* to read a `Tag`, so the attribute list that decides *where*
|
|
117
|
+
* it sits must span the same schemas. `getAttributeNamesAcrossSchemas` returns
|
|
118
|
+
* the pinned result unchanged for every class the pin does know, so this is
|
|
119
|
+
* additive — no IFC2X3 or IFC4 entity's hash moves because of it.
|
|
120
|
+
*
|
|
121
|
+
* Reads the raw STEP slot rather than reusing `extractAllEntityAttributes`'
|
|
122
|
+
* display normalization: this value is hashed, not shown, so `$` (absent) is
|
|
123
|
+
* the only case that needs interpreting and it arrives as null.
|
|
124
|
+
*/
|
|
125
|
+
export function attributeAcrossSchemas(store, expressId, ifcType, attributeName) {
|
|
126
|
+
const index = getAttributeNamesAcrossSchemas(ifcType).indexOf(attributeName);
|
|
127
|
+
if (index < 0)
|
|
128
|
+
return undefined;
|
|
129
|
+
const ref = store.entityIndex.byId.get(expressId);
|
|
130
|
+
if (!ref)
|
|
131
|
+
return undefined;
|
|
132
|
+
const raw = new EntityExtractor(store.source).extractEntity(ref)?.attributes?.[index];
|
|
133
|
+
return typeof raw === 'string' || typeof raw === 'number' ? String(raw) : undefined;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* An overlay override wins whenever one exists, including when it is empty —
|
|
137
|
+
* `entity_set_attribute` with `''` clears the attribute, and falling back to
|
|
138
|
+
* the stored value there would hash the edit away.
|
|
139
|
+
*/
|
|
140
|
+
export function override(edited, stored) {
|
|
141
|
+
const value = edited !== undefined ? edited : stored;
|
|
142
|
+
return value ? value : undefined;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=diff-authored-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-authored-keys.js","sourceRoot":"","sources":["../../src/tools/diff-authored-keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type PendingOverlay } from '../overlay.js';
|
|
2
|
+
import type { LoadedModel } from '../context.js';
|
|
3
|
+
/** Default cap on the listed `contentMatches`. Per-kind totals are reported
|
|
4
|
+
* whole, so the cap bounds the payload without hiding anything. */
|
|
5
|
+
export declare const DEFAULT_MAX_MATCHES = 200;
|
|
6
|
+
/**
|
|
7
|
+
* Default cap on the GlobalIds listed per side of one match.
|
|
8
|
+
*
|
|
9
|
+
* `max_matches` bounds how many groups come back, not how big one is, and a
|
|
10
|
+
* `duplicated` / `deduplicated` / `ambiguous` group is a set of candidates that
|
|
11
|
+
* in a repetitive model can run to thousands of entities on each side. Without
|
|
12
|
+
* this, `max_matches: 1` could still return a model-sized payload and overflow
|
|
13
|
+
* the context window the cap exists to protect.
|
|
14
|
+
*
|
|
15
|
+
* 20 is chosen against what the list is *for*. A group is the engine declining
|
|
16
|
+
* to guess, so its members are a hand-off to the caller; twenty candidates on a
|
|
17
|
+
* side is already past what anyone resolves by reading a list rather than by
|
|
18
|
+
* querying the two models. The overwhelmingly common match is a 1:1 `renamed`
|
|
19
|
+
* pair, which this never touches. Every group still reports `baseCount` and
|
|
20
|
+
* `headCount` whole, computed before the cap for the same reason
|
|
21
|
+
* `contentMatchCounts` is: truncation must never be what makes a model look
|
|
22
|
+
* cleanly matched.
|
|
23
|
+
*/
|
|
24
|
+
export declare const DEFAULT_MAX_GROUP_MEMBERS = 20;
|
|
25
|
+
/** Run the real `@ifc-lite/diff` engine over two loaded models. See the
|
|
26
|
+
* module doc for the scope and abstention contract. */
|
|
27
|
+
export declare function contentDiff(left: LoadedModel, right: LoadedModel, overlays: {
|
|
28
|
+
left: PendingOverlay | null;
|
|
29
|
+
right: PendingOverlay | null;
|
|
30
|
+
}, maxMatches: number, maxGroupMembers: number, keyProperty?: string, splitMerge?: boolean, successors?: boolean): Record<string, unknown>;
|
|
31
|
+
/** One-line human summary of the engine result, for the text block. */
|
|
32
|
+
export declare function describeCounts(content: Record<string, unknown>): string;
|
|
33
|
+
//# sourceMappingURL=diff-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-content.d.ts","sourceRoot":"","sources":["../../src/tools/diff-content.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;oEACoE;AACpE,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAiB5C;wDACwD;AACxD,wBAAgB,WAAW,CACzB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE;IAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,EACvE,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,OAAO,EACpB,UAAU,CAAC,EAAE,OAAO,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwFzB;AAgBD,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAOvE"}
|
|
@@ -0,0 +1,158 @@
|
|
|
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
|
+
* `model_diff`'s `by_content` half: the real `@ifc-lite/diff` engine run over
|
|
6
|
+
* two loaded models (issue #1891), plus `split_merge` / `successors`
|
|
7
|
+
* (issue #4956). Split out of `diff.ts` for size.
|
|
8
|
+
*
|
|
9
|
+
* **Data scope only.** This server has no geometry pipeline, so there is no
|
|
10
|
+
* world geometry hash and no bounding box; `scope: 'data'` is the honest
|
|
11
|
+
* description of what it can see, and every unambiguous 1:1 content match is
|
|
12
|
+
* therefore reported as `renamed` rather than `moved`/`reshaped`. `split_merge`
|
|
13
|
+
* and `successors` are geometry-only stages: they are threaded through to
|
|
14
|
+
* `diffModels` so the params exist and cost nothing today, but on this server
|
|
15
|
+
* they currently produce no claims either way (`diff.splitMerges` /
|
|
16
|
+
* `diff.successors` stay `undefined`, the engine's abstention) — they start
|
|
17
|
+
* producing claims the moment this server gains a geometry pass, with no
|
|
18
|
+
* further plumbing change. See `diff-fingerprints.ts`.
|
|
19
|
+
*/
|
|
20
|
+
import { diffModels } from '@ifc-lite/diff';
|
|
21
|
+
import { buildModelFingerprints } from './diff-fingerprints.js';
|
|
22
|
+
import { fallbackPairDuplicateAuthoredKeys } from './diff-authored-keys.js';
|
|
23
|
+
import { pendingMutationsField } from '../overlay.js';
|
|
24
|
+
/** Default cap on the listed `contentMatches`. Per-kind totals are reported
|
|
25
|
+
* whole, so the cap bounds the payload without hiding anything. */
|
|
26
|
+
export const DEFAULT_MAX_MATCHES = 200;
|
|
27
|
+
/**
|
|
28
|
+
* Default cap on the GlobalIds listed per side of one match.
|
|
29
|
+
*
|
|
30
|
+
* `max_matches` bounds how many groups come back, not how big one is, and a
|
|
31
|
+
* `duplicated` / `deduplicated` / `ambiguous` group is a set of candidates that
|
|
32
|
+
* in a repetitive model can run to thousands of entities on each side. Without
|
|
33
|
+
* this, `max_matches: 1` could still return a model-sized payload and overflow
|
|
34
|
+
* the context window the cap exists to protect.
|
|
35
|
+
*
|
|
36
|
+
* 20 is chosen against what the list is *for*. A group is the engine declining
|
|
37
|
+
* to guess, so its members are a hand-off to the caller; twenty candidates on a
|
|
38
|
+
* side is already past what anyone resolves by reading a list rather than by
|
|
39
|
+
* querying the two models. The overwhelmingly common match is a 1:1 `renamed`
|
|
40
|
+
* pair, which this never touches. Every group still reports `baseCount` and
|
|
41
|
+
* `headCount` whole, computed before the cap for the same reason
|
|
42
|
+
* `contentMatchCounts` is: truncation must never be what makes a model look
|
|
43
|
+
* cleanly matched.
|
|
44
|
+
*/
|
|
45
|
+
export const DEFAULT_MAX_GROUP_MEMBERS = 20;
|
|
46
|
+
/**
|
|
47
|
+
* Kinds an agent has to resolve itself, listed before the ones the engine
|
|
48
|
+
* already retired. Truncating the list must never be what drops the
|
|
49
|
+
* "we could not tell" groups.
|
|
50
|
+
*/
|
|
51
|
+
const UNRESOLVED_FIRST = [
|
|
52
|
+
'ambiguous',
|
|
53
|
+
'duplicated',
|
|
54
|
+
'deduplicated',
|
|
55
|
+
'moved',
|
|
56
|
+
'reshaped',
|
|
57
|
+
'respecified',
|
|
58
|
+
'renamed',
|
|
59
|
+
];
|
|
60
|
+
/** Run the real `@ifc-lite/diff` engine over two loaded models. See the
|
|
61
|
+
* module doc for the scope and abstention contract. */
|
|
62
|
+
export function contentDiff(left, right, overlays, maxMatches, maxGroupMembers, keyProperty, splitMerge, successors) {
|
|
63
|
+
// Authored keys (issue #4955): `prop:<value>` where the model maintains one,
|
|
64
|
+
// GlobalId otherwise; a value two entities share is refused for both and
|
|
65
|
+
// reported so the agent sees why those two fell back.
|
|
66
|
+
const duplicateAuthoredKeys = new Map();
|
|
67
|
+
const adapter = { keyProperty, duplicateAuthoredKeys };
|
|
68
|
+
const baseFingerprints = buildModelFingerprints(left.store, overlays.left, adapter);
|
|
69
|
+
const headFingerprints = buildModelFingerprints(right.store, overlays.right, adapter);
|
|
70
|
+
fallbackPairDuplicateAuthoredKeys([
|
|
71
|
+
{ fingerprints: baseFingerprints, store: left.store },
|
|
72
|
+
{ fingerprints: headFingerprints, store: right.store },
|
|
73
|
+
], duplicateAuthoredKeys);
|
|
74
|
+
const diff = diffModels(baseFingerprints, headFingerprints, {
|
|
75
|
+
scope: 'data',
|
|
76
|
+
matchUnpairedByContent: true,
|
|
77
|
+
detectSplitMerge: splitMerge,
|
|
78
|
+
detectSuccessors: successors,
|
|
79
|
+
});
|
|
80
|
+
const matches = [...(diff.contentMatches ?? [])].sort((a, b) => UNRESOLVED_FIRST.indexOf(a.kind) - UNRESOLVED_FIRST.indexOf(b.kind));
|
|
81
|
+
const byKind = {};
|
|
82
|
+
for (const match of matches)
|
|
83
|
+
byKind[match.kind] = (byKind[match.kind] ?? 0) + 1;
|
|
84
|
+
return {
|
|
85
|
+
scope: diff.scope,
|
|
86
|
+
keyProperty: keyProperty ?? null,
|
|
87
|
+
duplicateAuthoredKeys: [...duplicateAuthoredKeys.keys()].sort(),
|
|
88
|
+
counts: diff.counts,
|
|
89
|
+
// Whole totals, computed before the cap: an agent reading `contentMatches`
|
|
90
|
+
// can always tell whether the list it got is the whole story.
|
|
91
|
+
contentMatchCounts: byKind,
|
|
92
|
+
contentMatches: matches.slice(0, maxMatches).map((match) => ({
|
|
93
|
+
kind: match.kind,
|
|
94
|
+
ifcType: match.base[0]?.ifcType ?? match.head[0]?.ifcType,
|
|
95
|
+
// Groups are reported as groups. Collapsing a `duplicated` or
|
|
96
|
+
// `ambiguous` set to a single pair would be the engine guessing, which
|
|
97
|
+
// is exactly what it refuses to do (#1923). Long groups are cut to
|
|
98
|
+
// `maxGroupMembers` per side and say so, whole size included, so a cut
|
|
99
|
+
// group still reads as a group of that size.
|
|
100
|
+
...listSide('base', match.base, maxGroupMembers),
|
|
101
|
+
...listSide('head', match.head, maxGroupMembers),
|
|
102
|
+
...(match.distance !== undefined ? { distance: match.distance } : {}),
|
|
103
|
+
})),
|
|
104
|
+
truncatedMatches: Math.max(0, matches.length - maxMatches),
|
|
105
|
+
// Absent (not `[]`) exactly when the stage did not run, or ran and the
|
|
106
|
+
// geometry abstention fired — this server's current state, always, until
|
|
107
|
+
// it has a geometry pipeline. The engine's "absent means not proved"
|
|
108
|
+
// contract, preserved rather than flattened.
|
|
109
|
+
splitMerges: diff.splitMerges?.map((claim) => ({
|
|
110
|
+
kind: claim.kind,
|
|
111
|
+
confidence: claim.confidence,
|
|
112
|
+
whole: claim.whole.key,
|
|
113
|
+
pieces: claim.pieces.map((piece) => piece.key),
|
|
114
|
+
})),
|
|
115
|
+
successors: diff.successors?.map((claim) => ({
|
|
116
|
+
confidence: claim.confidence,
|
|
117
|
+
base: claim.base.key,
|
|
118
|
+
head: claim.head.key,
|
|
119
|
+
overlap: claim.overlap,
|
|
120
|
+
distance: claim.distance,
|
|
121
|
+
})),
|
|
122
|
+
// Uncommitted edits are folded into the comparison; saying how many there
|
|
123
|
+
// are is what separates "the two files differ" from "this session has
|
|
124
|
+
// edits it has not written yet". Absent when neither model has any.
|
|
125
|
+
//
|
|
126
|
+
// `pendingMutations` is the scalar every other payload carries; the split a
|
|
127
|
+
// two-model comparison can additionally give lives under its own name rather
|
|
128
|
+
// than overloading that one.
|
|
129
|
+
...pendingMutationsField(overlays.left, overlays.right),
|
|
130
|
+
...(overlays.left || overlays.right
|
|
131
|
+
? {
|
|
132
|
+
pendingMutationsBySide: {
|
|
133
|
+
base: overlays.left?.pendingMutations ?? 0,
|
|
134
|
+
head: overlays.right?.pendingMutations ?? 0,
|
|
135
|
+
},
|
|
136
|
+
}
|
|
137
|
+
: {}),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** One side of a match: the (capped) keys, the whole count, and whether the
|
|
141
|
+
* list was cut. Emits `base`/`baseCount`/`baseTruncated` (or `head…`). */
|
|
142
|
+
function listSide(side, entities, maxGroupMembers) {
|
|
143
|
+
return {
|
|
144
|
+
[side]: entities.slice(0, maxGroupMembers).map((entity) => entity.key),
|
|
145
|
+
[`${side}Count`]: entities.length,
|
|
146
|
+
[`${side}Truncated`]: entities.length > maxGroupMembers,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** One-line human summary of the engine result, for the text block. */
|
|
150
|
+
export function describeCounts(content) {
|
|
151
|
+
const counts = content.counts;
|
|
152
|
+
const byKind = content.contentMatchCounts;
|
|
153
|
+
const kinds = Object.entries(byKind).map(([kind, n]) => `${n} ${kind}`).join(', ');
|
|
154
|
+
return `${counts.added} added, ${counts.modified} modified, ${counts.deleted} deleted, `
|
|
155
|
+
+ `${counts.unchanged} unchanged`
|
|
156
|
+
+ (kinds ? `; content matches: ${kinds}` : '; no content matches');
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=diff-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-content.js","sourceRoot":"","sources":["../../src/tools/diff-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -84,6 +84,8 @@
|
|
|
84
84
|
*/
|
|
85
85
|
import { type EntityFingerprint } from '@ifc-lite/diff';
|
|
86
86
|
import { type IfcDataStore } from '@ifc-lite/parser';
|
|
87
|
+
import { type FingerprintAdapterOptions } from './diff-authored-keys.js';
|
|
88
|
+
export { AUTHORED_KEY_PREFIX, type FingerprintAdapterOptions } from './diff-authored-keys.js';
|
|
87
89
|
import type { PendingOverlay } from '../overlay.js';
|
|
88
90
|
/** Adapter handle threaded through the diff: the entity's express id. */
|
|
89
91
|
export type DiffRef = number;
|
|
@@ -102,5 +104,5 @@ export type DiffRef = number;
|
|
|
102
104
|
* values. Omitting it (the CLI twin has no session to overlay) is the original
|
|
103
105
|
* store-only behaviour exactly.
|
|
104
106
|
*/
|
|
105
|
-
export declare function buildModelFingerprints(store: IfcDataStore, overlay?: PendingOverlay | null): EntityFingerprint<DiffRef>[];
|
|
107
|
+
export declare function buildModelFingerprints(store: IfcDataStore, overlay?: PendingOverlay | null, options?: FingerprintAdapterOptions): EntityFingerprint<DiffRef>[];
|
|
106
108
|
//# sourceMappingURL=diff-fingerprints.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-fingerprints.d.ts","sourceRoot":"","sources":["../../src/tools/diff-fingerprints.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AAEH,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAaL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"diff-fingerprints.d.ts","sourceRoot":"","sources":["../../src/tools/diff-fingerprints.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AAEH,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAaL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAyD,KAAK,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEhI,OAAO,EAAE,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAC9F,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnE,yEAAyE;AACzE,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAwE7B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,EAC/B,OAAO,GAAE,yBAA8B,GACtC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CA4D9B"}
|
|
@@ -86,9 +86,11 @@
|
|
|
86
86
|
* fingerprints, which the paired tests check.
|
|
87
87
|
*/
|
|
88
88
|
import { buildComponentFingerprints, buildDataFingerprint, } from '@ifc-lite/diff';
|
|
89
|
-
import { RelationshipType } from '@ifc-lite/data';
|
|
90
|
-
import { EntityExtractor, extractAllEntityAttributes, extractClassificationsOnDemand, extractProjectUnits, extractPropertiesOnDemand, extractQuantitiesOnDemand, extractRootAttributesFromEntity,
|
|
89
|
+
import { RelationshipType, resolvedTypeName } from '@ifc-lite/data';
|
|
90
|
+
import { EntityExtractor, extractAllEntityAttributes, extractClassificationsOnDemand, extractProjectUnits, extractPropertiesOnDemand, extractQuantitiesOnDemand, extractRootAttributesFromEntity, spatialContainerPath, getInheritanceChainAcrossSchemas, quantitySiScale, roundToScale, scaledPropertyValue, } from '@ifc-lite/parser';
|
|
91
|
+
import { attributeAcrossSchemas, authoredKeyResolver, override } from './diff-authored-keys.js';
|
|
91
92
|
import { classificationLabel } from './diff-classification-label.js';
|
|
93
|
+
export { AUTHORED_KEY_PREFIX } from './diff-authored-keys.js';
|
|
92
94
|
/**
|
|
93
95
|
* Classify one STEP type against the three `IfcRoot` branches.
|
|
94
96
|
*
|
|
@@ -157,13 +159,14 @@ function classifyType(typeKey) {
|
|
|
157
159
|
* values. Omitting it (the CLI twin has no session to overlay) is the original
|
|
158
160
|
* store-only behaviour exactly.
|
|
159
161
|
*/
|
|
160
|
-
export function buildModelFingerprints(store, overlay) {
|
|
162
|
+
export function buildModelFingerprints(store, overlay, options = {}) {
|
|
161
163
|
const fingerprints = [];
|
|
162
164
|
const seen = new Set();
|
|
163
165
|
// One extractor for the whole model: the source read below only fires for
|
|
164
166
|
// the (small) set of object types the EntityTable declines to hold.
|
|
165
167
|
const extractor = new EntityExtractor(store.source);
|
|
166
168
|
const units = extractProjectUnits(store.source, store.entityIndex); // for quantitySiScale/scaledPropertyValue
|
|
169
|
+
const keyOf = authoredKeyResolver(store, overlay, options, extractor, (typeKey) => classifyType(typeKey).role === 'dependent');
|
|
167
170
|
for (const [typeKey, ids] of store.entityIndex.byType) {
|
|
168
171
|
// Classified once per type rather than once per entity — the geometry
|
|
169
172
|
// buckets (IfcCartesianPoint, IfcPolyLoop, …) are the bulk of a real model
|
|
@@ -198,13 +201,17 @@ export function buildModelFingerprints(store, overlay) {
|
|
|
198
201
|
// on every content match, so 'Unknown' would pair a task with an actor.
|
|
199
202
|
const ifcType = source && (!tableType || tableType === 'Unknown') ? type.name : tableType;
|
|
200
203
|
const input = buildDataInput(store, expressId, ifcType, source, type.typeObject, overlay, units);
|
|
201
|
-
|
|
202
|
-
key: globalId,
|
|
204
|
+
const fingerprint = {
|
|
205
|
+
key: keyOf(expressId, globalId),
|
|
203
206
|
ifcType,
|
|
204
207
|
dataHash: buildDataFingerprint(input),
|
|
205
208
|
components: buildComponentFingerprints(input),
|
|
206
209
|
ref: expressId,
|
|
207
|
-
}
|
|
210
|
+
};
|
|
211
|
+
const container = spatialContainerPath(store, expressId);
|
|
212
|
+
if (container !== undefined)
|
|
213
|
+
fingerprint.container = container;
|
|
214
|
+
fingerprints.push(fingerprint);
|
|
208
215
|
}
|
|
209
216
|
}
|
|
210
217
|
for (const entity of overlay?.created ?? []) {
|
|
@@ -238,6 +245,11 @@ export function buildModelFingerprints(store, overlay) {
|
|
|
238
245
|
* path exactly. Property sets and quantities never had the asymmetry — both
|
|
239
246
|
* were already read through the overlay.
|
|
240
247
|
*
|
|
248
|
+
* An authored key (`key_from`) is not resolved for a created entity either: it
|
|
249
|
+
* has no store row for `authoredKeyValue` to read, so it is keyed on the
|
|
250
|
+
* GlobalId the caller gave it. A created entity that duplicates a stored
|
|
251
|
+
* entity's authored value therefore reads as added rather than as a collision.
|
|
252
|
+
*
|
|
241
253
|
* `predefinedType` and `typeAssignments` are necessarily absent: both are read
|
|
242
254
|
* through the store, which has no row for an entity that exists only in the
|
|
243
255
|
* overlay, and neither is reachable through `entity_set_attribute`. A created
|
|
@@ -333,7 +345,7 @@ overlay, units) {
|
|
|
333
345
|
.map((typeId) => ({
|
|
334
346
|
globalId: store.entities.getGlobalId(typeId) || undefined,
|
|
335
347
|
name: store.entities.getName(typeId) || undefined,
|
|
336
|
-
type: store.entities
|
|
348
|
+
type: resolvedTypeName(store.entities, typeId),
|
|
337
349
|
}));
|
|
338
350
|
const classifications = extractClassificationsOnDemand(store, expressId).map(classificationLabel);
|
|
339
351
|
return {
|
|
@@ -357,46 +369,4 @@ overlay, units) {
|
|
|
357
369
|
typeAssignments,
|
|
358
370
|
};
|
|
359
371
|
}
|
|
360
|
-
/**
|
|
361
|
-
* One named attribute, read positionally through the **cross-schema** attribute
|
|
362
|
-
* list (issue #2021). The CLI's twin, and it must stay one.
|
|
363
|
-
*
|
|
364
|
-
* `extractAllEntityAttributes` names attributes through the parser's IFC4
|
|
365
|
-
* codegen pin, which answers an EMPTY list for a class the pin does not carry —
|
|
366
|
-
* so a `.find(name === 'Tag')` over it silently finds nothing on every
|
|
367
|
-
* IFC4X3-only type object (`IfcRailType`, `IfcTrackElementType`,
|
|
368
|
-
* `IfcSignalType`, …) while working perfectly on IFC2X3 and IFC4. That is a
|
|
369
|
-
* no-op nobody would notice: the entity is in scope, its class name is right,
|
|
370
|
-
* `isTypeObject` is right, and only the evidence is missing.
|
|
371
|
-
*
|
|
372
|
-
* This is the same pinned-registry family as the membership defect `#2001`
|
|
373
|
-
* fixed, and it has to be answered from the same place: the inheritance chain
|
|
374
|
-
* decides *whether* to read a `Tag`, so the attribute list that decides *where*
|
|
375
|
-
* it sits must span the same schemas. `getAttributeNamesAcrossSchemas` returns
|
|
376
|
-
* the pinned result unchanged for every class the pin does know, so this is
|
|
377
|
-
* additive — no IFC2X3 or IFC4 entity's hash moves because of it.
|
|
378
|
-
*
|
|
379
|
-
* Reads the raw STEP slot rather than reusing `extractAllEntityAttributes`'
|
|
380
|
-
* display normalization: this value is hashed, not shown, so `$` (absent) is
|
|
381
|
-
* the only case that needs interpreting and it arrives as null.
|
|
382
|
-
*/
|
|
383
|
-
function attributeAcrossSchemas(store, expressId, ifcType, attributeName) {
|
|
384
|
-
const index = getAttributeNamesAcrossSchemas(ifcType).indexOf(attributeName);
|
|
385
|
-
if (index < 0)
|
|
386
|
-
return undefined;
|
|
387
|
-
const ref = store.entityIndex.byId.get(expressId);
|
|
388
|
-
if (!ref)
|
|
389
|
-
return undefined;
|
|
390
|
-
const raw = new EntityExtractor(store.source).extractEntity(ref)?.attributes?.[index];
|
|
391
|
-
return typeof raw === 'string' || typeof raw === 'number' ? String(raw) : undefined;
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* An overlay override wins whenever one exists, including when it is empty —
|
|
395
|
-
* `entity_set_attribute` with `''` clears the attribute, and falling back to
|
|
396
|
-
* the stored value there would hash the edit away.
|
|
397
|
-
*/
|
|
398
|
-
function override(edited, stored) {
|
|
399
|
-
const value = edited !== undefined ? edited : stored;
|
|
400
|
-
return value ? value : undefined;
|
|
401
|
-
}
|
|
402
372
|
//# sourceMappingURL=diff-fingerprints.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-fingerprints.js","sourceRoot":"","sources":["../../src/tools/diff-fingerprints.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AAEH,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"diff-fingerprints.js","sourceRoot":"","sources":["../../src/tools/diff-fingerprints.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/diff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/tools/diff.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/tools/diff.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAwQvC,eAAO,MAAM,SAAS,EAAE,IAAI,EAA8B,CAAC"}
|