@ifc-lite/mcp 0.22.1 → 0.24.1
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 +82 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +5 -0
- package/dist/context.js.map +1 -1
- package/dist/errors.d.ts +2 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -1
- package/dist/headless-backend-align.d.ts +6 -0
- package/dist/headless-backend-align.d.ts.map +1 -0
- package/dist/headless-backend-align.js +35 -0
- package/dist/headless-backend-align.js.map +1 -0
- package/dist/headless-backend-modelling.d.ts +50 -0
- package/dist/headless-backend-modelling.d.ts.map +1 -0
- package/dist/headless-backend-modelling.js +128 -0
- package/dist/headless-backend-modelling.js.map +1 -0
- package/dist/headless-backend-room.d.ts +8 -0
- package/dist/headless-backend-room.d.ts.map +1 -0
- package/dist/headless-backend-room.js +24 -0
- package/dist/headless-backend-room.js.map +1 -0
- package/dist/headless-backend-store-stubs.d.ts +5 -4
- package/dist/headless-backend-store-stubs.d.ts.map +1 -1
- package/dist/headless-backend-store-stubs.js +1 -17
- package/dist/headless-backend-store-stubs.js.map +1 -1
- package/dist/headless-backend-store.d.ts +8 -0
- package/dist/headless-backend-store.d.ts.map +1 -0
- package/dist/headless-backend-store.js +38 -0
- package/dist/headless-backend-store.js.map +1 -0
- package/dist/headless-backend.d.ts +4 -1
- package/dist/headless-backend.d.ts.map +1 -1
- package/dist/headless-backend.js +8 -33
- package/dist/headless-backend.js.map +1 -1
- package/dist/headless-native-geometry.d.ts +6 -0
- package/dist/headless-native-geometry.d.ts.map +1 -0
- package/dist/headless-native-geometry.js +31 -0
- package/dist/headless-native-geometry.js.map +1 -0
- package/dist/headless-room-geometry.d.ts +9 -0
- package/dist/headless-room-geometry.d.ts.map +1 -0
- package/dist/headless-room-geometry.js +66 -0
- package/dist/headless-room-geometry.js.map +1 -0
- package/dist/protocol/types.d.ts +1 -0
- package/dist/protocol/types.d.ts.map +1 -1
- package/dist/resources/providers.d.ts.map +1 -1
- package/dist/resources/providers.js +10 -1
- package/dist/resources/providers.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +5 -17
- package/dist/server.js.map +1 -1
- package/dist/session-cleanup.d.ts +5 -0
- package/dist/session-cleanup.d.ts.map +1 -0
- package/dist/session-cleanup.js +36 -0
- package/dist/session-cleanup.js.map +1 -0
- package/dist/test/live-tool-session.d.ts +9 -0
- package/dist/test/live-tool-session.d.ts.map +1 -0
- package/dist/test/live-tool-session.js +30 -0
- package/dist/test/live-tool-session.js.map +1 -0
- package/dist/tools/bcf.js +2 -2
- package/dist/tools/bcf.js.map +1 -1
- package/dist/tools/copy-elements.d.ts +4 -0
- package/dist/tools/copy-elements.d.ts.map +1 -0
- package/dist/tools/copy-elements.js +76 -0
- package/dist/tools/copy-elements.js.map +1 -0
- package/dist/tools/design-place.d.ts +3 -0
- package/dist/tools/design-place.d.ts.map +1 -0
- package/dist/tools/design-place.js +79 -0
- package/dist/tools/design-place.js.map +1 -0
- package/dist/tools/discovery.js +3 -3
- package/dist/tools/discovery.js.map +1 -1
- package/dist/tools/export.js +7 -7
- package/dist/tools/export.js.map +1 -1
- package/dist/tools/flow-ai.d.ts +6 -0
- package/dist/tools/flow-ai.d.ts.map +1 -0
- package/dist/tools/flow-ai.js +23 -0
- package/dist/tools/flow-ai.js.map +1 -0
- package/dist/tools/flow-host.d.ts +1 -1
- package/dist/tools/flow-host.d.ts.map +1 -1
- package/dist/tools/flow-host.js +5 -1
- package/dist/tools/flow-host.js.map +1 -1
- package/dist/tools/flow-review-host.d.ts +28 -0
- package/dist/tools/flow-review-host.d.ts.map +1 -0
- package/dist/tools/flow-review-host.js +142 -0
- package/dist/tools/flow-review-host.js.map +1 -0
- package/dist/tools/flow.d.ts.map +1 -1
- package/dist/tools/flow.js +147 -93
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/hosted-edit.d.ts +4 -0
- package/dist/tools/hosted-edit.d.ts.map +1 -0
- package/dist/tools/hosted-edit.js +37 -0
- package/dist/tools/hosted-edit.js.map +1 -0
- package/dist/tools/hosted-place.d.ts +3 -0
- package/dist/tools/hosted-place.d.ts.map +1 -0
- package/dist/tools/hosted-place.js +63 -0
- package/dist/tools/hosted-place.js.map +1 -0
- package/dist/tools/ids-accessor.d.ts +2 -1
- package/dist/tools/ids-accessor.d.ts.map +1 -1
- package/dist/tools/ids-accessor.js.map +1 -1
- package/dist/tools/ids-authoring-model.d.ts +3 -0
- package/dist/tools/ids-authoring-model.d.ts.map +1 -0
- package/dist/tools/ids-authoring-model.js +112 -0
- package/dist/tools/ids-authoring-model.js.map +1 -0
- package/dist/tools/ids-authoring.d.ts +3 -0
- package/dist/tools/ids-authoring.d.ts.map +1 -0
- package/dist/tools/ids-authoring.js +202 -0
- package/dist/tools/ids-authoring.js.map +1 -0
- package/dist/tools/ids-schema.d.ts +3 -0
- package/dist/tools/ids-schema.d.ts.map +1 -0
- package/dist/tools/ids-schema.js +91 -0
- package/dist/tools/ids-schema.js.map +1 -0
- package/dist/tools/index.d.ts +5 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/layer-store.d.ts +2 -0
- package/dist/tools/layer-store.d.ts.map +1 -1
- package/dist/tools/layer-store.js +4 -0
- package/dist/tools/layer-store.js.map +1 -1
- package/dist/tools/mutate.d.ts.map +1 -1
- package/dist/tools/mutate.js +20 -64
- package/dist/tools/mutate.js.map +1 -1
- package/dist/tools/mutation-undo.d.ts +6 -0
- package/dist/tools/mutation-undo.d.ts.map +1 -0
- package/dist/tools/mutation-undo.js +63 -0
- package/dist/tools/mutation-undo.js.map +1 -0
- package/dist/tools/physical-edit.d.ts +4 -0
- package/dist/tools/physical-edit.d.ts.map +1 -0
- package/dist/tools/physical-edit.js +77 -0
- package/dist/tools/physical-edit.js.map +1 -0
- package/dist/tools/query-tools.d.ts +3 -0
- package/dist/tools/query-tools.d.ts.map +1 -0
- package/dist/tools/query-tools.js +8 -0
- package/dist/tools/query-tools.js.map +1 -0
- package/dist/tools/query.d.ts +1 -1
- package/dist/tools/query.d.ts.map +1 -1
- package/dist/tools/query.js +4 -4
- package/dist/tools/query.js.map +1 -1
- package/dist/tools/room-command.d.ts +6 -0
- package/dist/tools/room-command.d.ts.map +1 -0
- package/dist/tools/room-command.js +75 -0
- package/dist/tools/room-command.js.map +1 -0
- package/dist/tools/util.d.ts +10 -0
- package/dist/tools/util.d.ts.map +1 -1
- package/dist/tools/util.js +13 -1
- package/dist/tools/util.js.map +1 -1
- package/dist/tools/validation.d.ts +9 -0
- package/dist/tools/validation.d.ts.map +1 -1
- package/dist/tools/validation.js +3 -3
- package/dist/tools/validation.js.map +1 -1
- package/dist/tools/wall-join.d.ts +3 -0
- package/dist/tools/wall-join.d.ts.map +1 -0
- package/dist/tools/wall-join.js +39 -0
- package/dist/tools/wall-join.js.map +1 -0
- package/dist/transport/http-helpers.d.ts +85 -0
- package/dist/transport/http-helpers.d.ts.map +1 -0
- package/dist/transport/http-helpers.js +149 -0
- package/dist/transport/http-helpers.js.map +1 -0
- package/dist/transport/http.d.ts +14 -1
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +80 -90
- package/dist/transport/http.js.map +1 -1
- package/dist/validate.d.ts +1 -1
- package/dist/validate.js +3 -0
- package/dist/validate.js.map +1 -1
- package/package.json +24 -21
|
@@ -0,0 +1,37 @@
|
|
|
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 { ToolErrorCode, ToolExecutionError } from '../errors.js';
|
|
5
|
+
import { okResult, resolveModel } from './util.js';
|
|
6
|
+
/** #6232 D5: hosted.slide and inspector dimensions share their physical edit core. */
|
|
7
|
+
export const hostedEditTool = {
|
|
8
|
+
name: 'edit_hosted_element',
|
|
9
|
+
description: 'Move or resize a live wall-hosted opening, door or window together with its actual cut. '
|
|
10
|
+
+ 'Offset and Sill are metres in the host frame; OverallWidth/OverallHeight are metres. '
|
|
11
|
+
+ 'Identity and relationships are retained. Overlap, out-of-host and unsupported geometry edits are refused atomically. '
|
|
12
|
+
+ 'One mutation_undo restores the preceding graph.',
|
|
13
|
+
scope: 'mutate',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object', properties: {
|
|
16
|
+
model_id: { type: 'string', description: 'Required when multiple models are loaded.' },
|
|
17
|
+
express_id: { type: 'integer', minimum: 1 },
|
|
18
|
+
patch: {
|
|
19
|
+
type: 'object', properties: {
|
|
20
|
+
OverallWidth: { type: 'number', minimum: 0 }, OverallHeight: { type: 'number', minimum: 0 },
|
|
21
|
+
Offset: { type: 'number' }, Sill: { type: 'number' },
|
|
22
|
+
}, additionalProperties: false, anyOf: ['OverallWidth', 'OverallHeight', 'Offset', 'Sill'].map(name => ({ required: [name] })),
|
|
23
|
+
},
|
|
24
|
+
}, required: ['express_id', 'patch'], additionalProperties: false,
|
|
25
|
+
},
|
|
26
|
+
handler(input, ctx) {
|
|
27
|
+
const model = resolveModel(ctx, input.model_id);
|
|
28
|
+
try {
|
|
29
|
+
const ref = model.bim.store.editHostedElement({ modelId: model.id, expressId: input.express_id }, input.patch);
|
|
30
|
+
return okResult(`Edited hosted element #${ref.expressId}.`, { ...ref });
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
throw new ToolExecutionError({ code: ToolErrorCode.INVALID_INPUT, message: error instanceof Error ? error.message : String(error) });
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=hosted-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-edit.js","sourceRoot":"","sources":["../../src/tools/hosted-edit.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAG/D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEnD,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,0FAA0F;UACnG,uFAAuF;UACvF,uHAAuH;UACvH,iDAAiD;IACrD,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE;YAC1B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;YACtF,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;YAC3C,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE;oBAC1B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;oBAC3F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBACrD,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC/H;SACF,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,oBAAoB,EAAE,KAAK;KAClE;IACD,OAAO,CAAC,KAAK,EAAE,GAAG;QAChB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,QAA8B,CAAC,CAAC;QACtE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,UAAoB,EAAE,EAAE,KAAK,CAAC,KAA0B,CAAC,CAAC;YAC9I,OAAO,QAAQ,CAAC,0BAA0B,GAAG,CAAC,SAAS,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,kBAAkB,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvI,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-place.d.ts","sourceRoot":"","sources":["../../src/tools/hosted-place.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAwDvC,eAAO,MAAM,gBAAgB,EAAE,IAAI,EAA6D,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
/** MCP gesture-free counterparts of the viewer's hosted commands (#6232 D5).
|
|
5
|
+
* All IFC writing and fit/overlap refusal is in @ifc-lite/create via bim.store. */
|
|
6
|
+
import { readHostedFill } from '@ifc-lite/create';
|
|
7
|
+
import { ToolErrorCode, ToolExecutionError } from '../errors.js';
|
|
8
|
+
import { okResult, resolveModel } from './util.js';
|
|
9
|
+
const common = {
|
|
10
|
+
Offset: { type: 'number', description: 'Opening centre along the host local X, in metres.' },
|
|
11
|
+
Sill: { type: 'number', description: 'Bottom above the host local origin, in metres; defaults to zero for a door or opening.' },
|
|
12
|
+
Width: { type: 'number', minimum: 0 }, Height: { type: 'number', minimum: 0 },
|
|
13
|
+
CutDepth: { type: 'number', minimum: 0 },
|
|
14
|
+
Name: { type: 'string' }, Description: { type: 'string' }, ObjectType: { type: 'string' }, Tag: { type: 'string' },
|
|
15
|
+
GlobalId: { type: 'string', minLength: 22, maxLength: 22 },
|
|
16
|
+
};
|
|
17
|
+
function hostedTool(kind) {
|
|
18
|
+
const type = kind === 'opening' ? 'IfcOpeningElement' : kind === 'door' ? 'IfcDoor' : 'IfcWindow';
|
|
19
|
+
const fill = kind === 'opening' ? {} : {
|
|
20
|
+
FrameThickness: { type: 'number', minimum: 0 },
|
|
21
|
+
PredefinedType: { type: 'string', enum: kind === 'door'
|
|
22
|
+
? ['DOOR', 'GATE', 'TRAPDOOR', 'USERDEFINED', 'NOTDEFINED']
|
|
23
|
+
: ['WINDOW', 'SKYLIGHT', 'LIGHTDOME', 'USERDEFINED', 'NOTDEFINED'] },
|
|
24
|
+
...(kind === 'door'
|
|
25
|
+
? { OperationType: { type: 'string' }, UserDefinedOperationType: { type: 'string' } }
|
|
26
|
+
: { PartitioningType: { type: 'string' }, UserDefinedPartitioningType: { type: 'string' } }),
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
name: `place_${kind}`,
|
|
30
|
+
description: `Place ${type} in a loaded wall through the same creation core as the Model workspace and SDK. `
|
|
31
|
+
+ 'Dimensions are metres in the host frame. Refuses cuts outside the wall, overlapping cuts, and unreadable opening geometry. '
|
|
32
|
+
+ 'Writes the complete void/fill graph atomically; one mutation_undo removes the placement.',
|
|
33
|
+
scope: 'mutate',
|
|
34
|
+
inputSchema: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
model_id: { type: 'string', description: 'Required when multiple models are loaded.' },
|
|
38
|
+
host_express_id: { type: 'integer', minimum: 1, description: 'IfcWall express id within the chosen model, including a wall created this session.' },
|
|
39
|
+
params: { type: 'object', properties: { ...common, ...fill }, required: ['Offset', 'Width', 'Height', ...(kind === 'window' ? ['Sill'] : [])], additionalProperties: false },
|
|
40
|
+
},
|
|
41
|
+
required: ['host_express_id', 'params'], additionalProperties: false,
|
|
42
|
+
},
|
|
43
|
+
handler(input, ctx) {
|
|
44
|
+
const model = resolveModel(ctx, input.model_id);
|
|
45
|
+
const hostId = input.host_express_id;
|
|
46
|
+
const params = input.params;
|
|
47
|
+
try {
|
|
48
|
+
const placed = kind === 'opening' ? model.bim.store.addOpening(model.id, hostId, params)
|
|
49
|
+
: kind === 'door' ? model.bim.store.addHostedDoor(model.id, hostId, params)
|
|
50
|
+
: model.bim.store.addHostedWindow(model.id, hostId, params);
|
|
51
|
+
const hosted = readHostedFill(model.store, placed.expressId, model.backend.getMutationView());
|
|
52
|
+
return okResult(`Placed ${type} as #${placed.expressId} in wall #${hostId}.`, {
|
|
53
|
+
...placed, type, openingId: hosted?.openingId ?? placed.expressId, hostExpressId: hostId,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new ToolExecutionError({ code: ToolErrorCode.INVALID_INPUT, message: error instanceof Error ? error.message : String(error) });
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export const hostedPlaceTools = ['opening', 'door', 'window'].map(hostedTool);
|
|
63
|
+
//# sourceMappingURL=hosted-place.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-place.js","sourceRoot":"","sources":["../../src/tools/hosted-place.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
9
9
|
import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
10
|
+
import type { IFCDataAccessor } from '@ifc-lite/ids';
|
|
10
11
|
/**
|
|
11
12
|
* `mutationView`, when supplied, is consulted for entity membership only.
|
|
12
13
|
* Enumeration excludes tombstones and includes overlay-created entities, and
|
|
@@ -14,5 +15,5 @@ import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
|
14
15
|
* `EntityVisibilityView` structurally, so no adapter is needed. Omitting it
|
|
15
16
|
* leaves the accessor answering for the file as parsed.
|
|
16
17
|
*/
|
|
17
|
-
export declare function buildIdsAccessor(store: IfcDataStore, mutationView?: MutablePropertyView | null):
|
|
18
|
+
export declare function buildIdsAccessor(store: IfcDataStore, mutationView?: MutablePropertyView | null): IFCDataAccessor;
|
|
18
19
|
//# sourceMappingURL=ids-accessor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ids-accessor.d.ts","sourceRoot":"","sources":["../../src/tools/ids-accessor.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ids-accessor.d.ts","sourceRoot":"","sources":["../../src/tools/ids-accessor.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,YAAY,CAAC,EAAE,mBAAmB,GAAG,IAAI,GACxC,eAAe,CAEjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ids-accessor.js","sourceRoot":"","sources":["../../src/tools/ids-accessor.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"ids-accessor.js","sourceRoot":"","sources":["../../src/tools/ids-accessor.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAa/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAmB,EACnB,YAAyC;IAEzC,OAAO,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,IAAI,SAAS,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids-authoring-model.d.ts","sourceRoot":"","sources":["../../src/tools/ids-authoring-model.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAgGvC,eAAO,MAAM,sBAAsB,EAAE,IAAI,EAA0D,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
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
|
+
* IDS authoring tools, batch 2 (IDS-119): `ids_diff`, plus the model-loop
|
|
6
|
+
* and test-suite tools `ids_preview`, `ids_infer`, `ids_coverage` and
|
|
7
|
+
* `ids_test`.
|
|
8
|
+
*
|
|
9
|
+
* `ids_diff` works today (re-identification matcher, `diffIds`). The other
|
|
10
|
+
* four are declared with their final input schemas and answer
|
|
11
|
+
* UNSUPPORTED_OPERATION, the same convention as `gherkin_check`: the
|
|
12
|
+
* funnel, inference and coverage engines (IDS model loop) and the
|
|
13
|
+
* test-suite runner (IDS-110) are not in this release. Each replaces its
|
|
14
|
+
* stub handler when its engine lands; the names and inputs do not change.
|
|
15
|
+
*/
|
|
16
|
+
import { readFile } from 'node:fs/promises';
|
|
17
|
+
import { IDSParseError, parseIDS } from '@ifc-lite/ids';
|
|
18
|
+
import { diffIds } from '@ifc-lite/ids-authoring';
|
|
19
|
+
import { ToolErrorCode, ToolExecutionError } from '../errors.js';
|
|
20
|
+
import { resolveSafePath } from '../safe-path.js';
|
|
21
|
+
import { okResult } from './util.js';
|
|
22
|
+
async function loadSide(input, side, ctx) {
|
|
23
|
+
const inline = input[`${side}_xml`];
|
|
24
|
+
const path = input[`${side}_path`];
|
|
25
|
+
let xml;
|
|
26
|
+
if (typeof inline === 'string')
|
|
27
|
+
xml = inline;
|
|
28
|
+
else if (typeof path === 'string')
|
|
29
|
+
xml = await readFile(await resolveSafePath(path, ctx, 'read'), 'utf-8');
|
|
30
|
+
else
|
|
31
|
+
throw new ToolExecutionError({ code: ToolErrorCode.INVALID_INPUT, message: `Provide ${side}_xml or ${side}_path.` });
|
|
32
|
+
try {
|
|
33
|
+
return parseIDS(xml);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (!(err instanceof IDSParseError))
|
|
37
|
+
throw err;
|
|
38
|
+
throw new ToolExecutionError({ code: ToolErrorCode.PARSE_FAILED, message: `The ${side} IDS does not parse: ${err.message}` });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const idsDiff = {
|
|
42
|
+
name: 'ids_diff',
|
|
43
|
+
description: 'Semantic diff of two IDS revisions. Specifications and facets are paired by identifier, then name and applicability, then similarity, so a rename or an edited requirement is one change. Returns added / removed / changed entries with XML paths and a plain-language line each.',
|
|
44
|
+
scope: 'read',
|
|
45
|
+
inputSchema: {
|
|
46
|
+
type: 'object',
|
|
47
|
+
properties: {
|
|
48
|
+
before_xml: { type: 'string' },
|
|
49
|
+
before_path: { type: 'string', description: 'Subject to allowedPaths.' },
|
|
50
|
+
after_xml: { type: 'string' },
|
|
51
|
+
after_path: { type: 'string', description: 'Subject to allowedPaths.' },
|
|
52
|
+
},
|
|
53
|
+
additionalProperties: false,
|
|
54
|
+
},
|
|
55
|
+
async handler(input, ctx) {
|
|
56
|
+
const diff = diffIds(await loadSide(input, 'before', ctx), await loadSide(input, 'after', ctx));
|
|
57
|
+
const head = diff.identical ? 'No changes.' : `${diff.entries.length} change(s):`;
|
|
58
|
+
const lines = diff.entries.slice(0, 20).map((e) => `- ${e.text}`);
|
|
59
|
+
return okResult([head, ...lines].join('\n'), { identical: diff.identical, entries: diff.entries });
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
function notInThisRelease(name, engine) {
|
|
63
|
+
return () => {
|
|
64
|
+
throw new ToolExecutionError({
|
|
65
|
+
code: ToolErrorCode.UNSUPPORTED_OPERATION,
|
|
66
|
+
message: `${name} is not available in this release: it needs ${engine}, which has not shipped yet.`,
|
|
67
|
+
hint: 'Use ids_validate to check a model against an IDS, and ids_lint for static checks.',
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const MODEL_ID = { type: 'string', description: 'Loaded model to evaluate against (default: the only one).' };
|
|
72
|
+
const IDS_SOURCE = {
|
|
73
|
+
ids_xml: { type: 'string' },
|
|
74
|
+
ids_path: { type: 'string' },
|
|
75
|
+
doc: { type: 'object', description: 'A Studio document from ids_read / ids_apply_ops.' },
|
|
76
|
+
};
|
|
77
|
+
const MODEL_LOOP = 'the IDS model loop (funnel, inference and coverage engines)';
|
|
78
|
+
const idsPreview = {
|
|
79
|
+
name: 'ids_preview',
|
|
80
|
+
description: 'Funnel counts per specification against a loaded model: how many elements each applicability facet keeps, and how many pass each requirement. Not available yet.',
|
|
81
|
+
scope: 'validate',
|
|
82
|
+
inputSchema: { type: 'object', properties: { model_id: MODEL_ID, ...IDS_SOURCE, spec_id: { type: 'string' } }, additionalProperties: false },
|
|
83
|
+
handler: notInThisRelease('ids_preview', MODEL_LOOP),
|
|
84
|
+
};
|
|
85
|
+
const idsInfer = {
|
|
86
|
+
name: 'ids_infer',
|
|
87
|
+
description: 'Infer specifications from the elements a selector picks in a loaded model (IfcOpenShell selector syntax). Returns ops for ids_apply_ops. Not available yet.',
|
|
88
|
+
scope: 'validate',
|
|
89
|
+
inputSchema: {
|
|
90
|
+
type: 'object',
|
|
91
|
+
properties: { model_id: MODEL_ID, select: { type: 'string' }, threshold: { type: 'number', minimum: 0, maximum: 1 } },
|
|
92
|
+
required: ['select'],
|
|
93
|
+
additionalProperties: false,
|
|
94
|
+
},
|
|
95
|
+
handler: notInThisRelease('ids_infer', MODEL_LOOP),
|
|
96
|
+
};
|
|
97
|
+
const idsCoverage = {
|
|
98
|
+
name: 'ids_coverage',
|
|
99
|
+
description: 'Element classes in a loaded model that no specification of the IDS governs. Not available yet.',
|
|
100
|
+
scope: 'validate',
|
|
101
|
+
inputSchema: { type: 'object', properties: { model_id: MODEL_ID, ...IDS_SOURCE }, additionalProperties: false },
|
|
102
|
+
handler: notInThisRelease('ids_coverage', MODEL_LOOP),
|
|
103
|
+
};
|
|
104
|
+
const idsTest = {
|
|
105
|
+
name: 'ids_test',
|
|
106
|
+
description: 'Run the test suites stored in an .idsz bundle (fixtures that must pass or fail each specification). Not available yet.',
|
|
107
|
+
scope: 'validate',
|
|
108
|
+
inputSchema: { type: 'object', properties: { idsz_path: { type: 'string' } }, required: ['idsz_path'], additionalProperties: false },
|
|
109
|
+
handler: notInThisRelease('ids_test', 'the IDS test-suite runner'),
|
|
110
|
+
};
|
|
111
|
+
export const idsAuthoringModelTools = [idsDiff, idsPreview, idsInfer, idsCoverage, idsTest];
|
|
112
|
+
//# sourceMappingURL=ids-authoring-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids-authoring-model.js","sourceRoot":"","sources":["../../src/tools/ids-authoring-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids-authoring.d.ts","sourceRoot":"","sources":["../../src/tools/ids-authoring.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAiMvC,eAAO,MAAM,iBAAiB,EAAE,IAAI,EAAwD,CAAC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
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
|
+
* IDS authoring tools, batch 1 (IDS-118): `ids_audit`, `ids_lint`,
|
|
6
|
+
* `ids_read`, `ids_apply_ops`, `ids_write`. The `ids_schema_*` lookups
|
|
7
|
+
* live in `ids-schema.ts`.
|
|
8
|
+
*
|
|
9
|
+
* Stateless by design: a document travels as Studio JSON (`ids_read`
|
|
10
|
+
* output) between calls, and node ids are derived from the content, so
|
|
11
|
+
* reading the same XML twice gives the same ids.
|
|
12
|
+
*
|
|
13
|
+
* External agents get the grounding gate. `ids_apply_ops` is the only tool
|
|
14
|
+
* that changes a document, and it goes through `applyOpsGated`: every op is
|
|
15
|
+
* validated against the op JSON Schema and the batch is checked against the
|
|
16
|
+
* IFC schema tables; a refused batch changes nothing and the refusal (code,
|
|
17
|
+
* path, message, candidates) goes back to the caller. Because Studio JSON
|
|
18
|
+
* can be edited by hand between calls, `ids_write` audits what it
|
|
19
|
+
* serialises and refuses a document with audit errors.
|
|
20
|
+
*/
|
|
21
|
+
import { auditIDSDocument, IDSParseError } from '@ifc-lite/ids';
|
|
22
|
+
import { applyOpsGated, createGateContext, createLintContext, createSidecar, createStudioDocument, getOpJsonSchema, lintDocument, nodePath, parseStudioDocument, readStudioDocument, serializeSidecar, writeStudioDocument, } from '@ifc-lite/ids-authoring';
|
|
23
|
+
import { writeIdsXml } from '@ifc-lite/ids';
|
|
24
|
+
import { ToolErrorCode, ToolExecutionError } from '../errors.js';
|
|
25
|
+
import { okResult } from './util.js';
|
|
26
|
+
import { loadIdsXml } from './validation.js';
|
|
27
|
+
const XML_INPUT = {
|
|
28
|
+
ids_xml: { type: 'string', description: 'Inline IDS XML.' },
|
|
29
|
+
ids_path: { type: 'string', description: 'Path to an .ids file (subject to allowedPaths).' },
|
|
30
|
+
};
|
|
31
|
+
const DOC_INPUT = {
|
|
32
|
+
type: 'object',
|
|
33
|
+
description: 'A Studio document as returned by ids_read or ids_apply_ops (`doc`).',
|
|
34
|
+
};
|
|
35
|
+
function parseError(err) {
|
|
36
|
+
if (err instanceof IDSParseError) {
|
|
37
|
+
throw new ToolExecutionError({ code: ToolErrorCode.PARSE_FAILED, message: `IDS does not parse: ${err.message}`, hint: 'Run ids_audit for details.' });
|
|
38
|
+
}
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
/** `doc` when given, else the IDS in `ids_xml` / `ids_path`, else `fallback` (or an error). */
|
|
42
|
+
async function loadDocument(input, ctx, fallback) {
|
|
43
|
+
if (input.doc !== undefined) {
|
|
44
|
+
try {
|
|
45
|
+
return parseStudioDocument(input.doc);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
throw new ToolExecutionError({ code: ToolErrorCode.INVALID_INPUT, message: `doc is not a Studio document: ${err instanceof Error ? err.message : String(err)}` });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (fallback && input.ids_xml === undefined && input.ids_path === undefined)
|
|
52
|
+
return fallback();
|
|
53
|
+
const xml = await loadIdsXml(input, ctx);
|
|
54
|
+
try {
|
|
55
|
+
return readStudioDocument(xml);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
return parseError(err);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function lintSummary(doc, options = {}) {
|
|
62
|
+
const result = lintDocument(doc, await createLintContext(), options);
|
|
63
|
+
const diagnostics = result.diagnostics.map((d) => ({ ...d, path: nodePath(doc, d.nodeId) }));
|
|
64
|
+
const counts = { error: 0, warning: 0, info: 0 };
|
|
65
|
+
for (const d of diagnostics)
|
|
66
|
+
counts[d.severity]++;
|
|
67
|
+
return { counts, diagnostics, suppressed: result.suppressed.length };
|
|
68
|
+
}
|
|
69
|
+
function outline(doc) {
|
|
70
|
+
return doc.ids.specifications.map((spec, i) => ({
|
|
71
|
+
id: doc.nodes.specs[i].id,
|
|
72
|
+
name: spec.name,
|
|
73
|
+
applicability: doc.nodes.specs[i].applicability.map((n, j) => ({ id: n.id, type: spec.applicability.facets[j].type })),
|
|
74
|
+
requirements: doc.nodes.specs[i].requirements.map((n, j) => ({ id: n.id, type: spec.requirements[j].facet.type })),
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
const idsAudit = {
|
|
78
|
+
name: 'ids_audit',
|
|
79
|
+
description: 'Conformance audit of an IDS file: XML and XSD shape, IFC entity/property names, restriction coherence. Answers "is this a valid IDS 1.0 file?". No model needed.',
|
|
80
|
+
scope: 'validate',
|
|
81
|
+
inputSchema: { type: 'object', properties: { ...XML_INPUT }, additionalProperties: false },
|
|
82
|
+
async handler(input, ctx) {
|
|
83
|
+
const report = await auditIDSDocument(await loadIdsXml(input, ctx));
|
|
84
|
+
const counts = { error: 0, warning: 0, info: 0 };
|
|
85
|
+
for (const issue of report.issues)
|
|
86
|
+
counts[issue.severity]++;
|
|
87
|
+
return okResult(`IDS audit: ${report.status} (${counts.error} errors, ${counts.warning} warnings, ${counts.info} info).`, {
|
|
88
|
+
status: report.status,
|
|
89
|
+
counts,
|
|
90
|
+
issues: report.issues,
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
const idsLint = {
|
|
95
|
+
name: 'ids_lint',
|
|
96
|
+
description: 'Lint an IDS document with the IDSL rule catalogue: does it mean what the author intends? Each diagnostic names its node (`nodeId`, `path`) and may carry quick fixes: op batches you can pass to ids_apply_ops unchanged. Pass `doc` (from ids_read / ids_apply_ops) or the XML.',
|
|
97
|
+
scope: 'validate',
|
|
98
|
+
inputSchema: {
|
|
99
|
+
type: 'object',
|
|
100
|
+
properties: {
|
|
101
|
+
doc: DOC_INPUT,
|
|
102
|
+
...XML_INPUT,
|
|
103
|
+
rules: { type: 'array', items: { type: 'string' }, description: 'Only these rule codes, e.g. ["IDSL-PROP-001"].' },
|
|
104
|
+
severity: { type: 'object', description: 'Per-rule severity override: {"IDSL-SPEC-008": "off"}. Values: error, warning, info, off.' },
|
|
105
|
+
},
|
|
106
|
+
additionalProperties: false,
|
|
107
|
+
},
|
|
108
|
+
async handler(input, ctx) {
|
|
109
|
+
const doc = await loadDocument(input, ctx);
|
|
110
|
+
const severity = input.severity;
|
|
111
|
+
const summary = await lintSummary(doc, { rules: input.rules, severity });
|
|
112
|
+
const { counts } = summary;
|
|
113
|
+
return okResult(`IDS lint: ${counts.error} errors, ${counts.warning} warnings, ${counts.info} info.`, { docId: doc.docId, ...summary });
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
const idsRead = {
|
|
117
|
+
name: 'ids_read',
|
|
118
|
+
description: 'Read IDS XML into a Studio document (JSON with a stable UUID for every specification, facet and constraint). Pass the returned `doc` to ids_apply_ops, ids_lint and ids_write. Reading the same XML twice gives the same ids.',
|
|
119
|
+
scope: 'read',
|
|
120
|
+
inputSchema: { type: 'object', properties: { ...XML_INPUT }, additionalProperties: false },
|
|
121
|
+
async handler(input, ctx) {
|
|
122
|
+
const doc = await loadDocument(input, ctx);
|
|
123
|
+
return okResult(`Read "${doc.ids.info.title}": ${doc.ids.specifications.length} specification(s).`, { doc, outline: outline(doc) });
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
function opsInputSchema() {
|
|
127
|
+
const ops = getOpJsonSchema();
|
|
128
|
+
return {
|
|
129
|
+
type: 'object',
|
|
130
|
+
properties: {
|
|
131
|
+
doc: DOC_INPUT,
|
|
132
|
+
...XML_INPUT,
|
|
133
|
+
title: { type: 'string', description: 'Title of a new, empty document (when neither doc nor XML is given).' },
|
|
134
|
+
ops: { type: 'array', minItems: 1, items: { oneOf: ops.oneOf }, description: 'Operations of IDS ops vocabulary v1, applied in order as one batch.' },
|
|
135
|
+
},
|
|
136
|
+
required: ['ops'],
|
|
137
|
+
additionalProperties: false,
|
|
138
|
+
$defs: ops.$defs,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function refusalText(issues) {
|
|
142
|
+
const lines = issues.slice(0, 5).map((i) => {
|
|
143
|
+
const near = i.candidates.slice(0, 3).map((c) => c.value);
|
|
144
|
+
return `- ${i.code} at ${i.path}: ${i.message}${near.length ? ` Did you mean: ${near.join(', ')}?` : ''}`;
|
|
145
|
+
});
|
|
146
|
+
const more = issues.length > 5 ? `\n- … ${issues.length - 5} more in structuredContent.details.issues` : '';
|
|
147
|
+
return `The grounding gate refused the batch; nothing was applied.\n${lines.join('\n')}${more}`;
|
|
148
|
+
}
|
|
149
|
+
const idsApplyOps = {
|
|
150
|
+
name: 'ids_apply_ops',
|
|
151
|
+
description: 'Change an IDS document by applying typed operations. Every op is validated and the batch is checked by the grounding gate against the IFC schema tables (entities, predefined types, attributes, property sets, properties, enumerations, data types). A refused batch changes nothing and returns each problem with a path and ranked candidates; fix the names and resend the whole batch. Starts from `doc`, from the XML, or from an empty document. Returns the new `doc` and its lint diagnostics.',
|
|
152
|
+
scope: 'read',
|
|
153
|
+
inputSchema: opsInputSchema(),
|
|
154
|
+
async handler(input, ctx) {
|
|
155
|
+
const doc = await loadDocument(input, ctx, () => createStudioDocument({ title: typeof input.title === 'string' ? input.title : '' }));
|
|
156
|
+
const result = applyOpsGated(doc, input.ops, await createGateContext());
|
|
157
|
+
if (!result.ok) {
|
|
158
|
+
throw new ToolExecutionError({
|
|
159
|
+
code: ToolErrorCode.INVALID_INPUT,
|
|
160
|
+
message: refusalText(result.issues),
|
|
161
|
+
details: { refused: true, issues: result.issues },
|
|
162
|
+
hint: 'Use ids_schema_search / ids_schema_entity / ids_schema_pset to look names up.',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
const lint = await lintSummary(result.doc);
|
|
166
|
+
return okResult(`Applied ${result.applied.length} op(s). Lint: ${lint.counts.error} errors, ${lint.counts.warning} warnings, ${lint.counts.info} info.`, { doc: result.doc, applied: result.applied.length, touched: result.touched, lint });
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
const idsWrite = {
|
|
170
|
+
name: 'ids_write',
|
|
171
|
+
description: 'Serialise a Studio document to IDS 1.0 XML. The XML is read back to prove nothing was lost and audited; a document with audit errors is refused. Also returns the studio.json sidecar that keeps node ids next to the XML.',
|
|
172
|
+
scope: 'read',
|
|
173
|
+
inputSchema: { type: 'object', properties: { doc: DOC_INPUT }, required: ['doc'], additionalProperties: false },
|
|
174
|
+
async handler(input, ctx) {
|
|
175
|
+
const doc = await loadDocument(input, ctx);
|
|
176
|
+
const out = writeStudioDocument(doc, writeIdsXml);
|
|
177
|
+
if (!out.ok) {
|
|
178
|
+
throw new ToolExecutionError({
|
|
179
|
+
code: ToolErrorCode.UNSUPPORTED_OPERATION,
|
|
180
|
+
message: `Cannot write this document: ${out.message}`,
|
|
181
|
+
details: { reason: out.reason, lost: out.lost ?? [] },
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const audit = await auditIDSDocument(out.xml);
|
|
185
|
+
const errors = audit.issues.filter((i) => i.severity === 'error');
|
|
186
|
+
if (errors.length > 0) {
|
|
187
|
+
throw new ToolExecutionError({
|
|
188
|
+
code: ToolErrorCode.INVALID_INPUT,
|
|
189
|
+
message: `The document fails the IDS audit (${errors.length} error(s)); it was not written. First: ${errors[0].message}`,
|
|
190
|
+
details: { issues: errors },
|
|
191
|
+
hint: 'Change documents through ids_apply_ops, which grounds names before they enter the document.',
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return okResult(`Wrote "${doc.ids.info.title}" (${out.xml.length} characters).`, {
|
|
195
|
+
xml: out.xml,
|
|
196
|
+
sidecar: serializeSidecar(createSidecar(doc, out.xml)),
|
|
197
|
+
audit: { status: audit.status, issues: audit.issues },
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
export const idsAuthoringTools = [idsAudit, idsLint, idsRead, idsApplyOps, idsWrite];
|
|
202
|
+
//# sourceMappingURL=ids-authoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids-authoring.js","sourceRoot":"","sources":["../../src/tools/ids-authoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids-schema.d.ts","sourceRoot":"","sources":["../../src/tools/ids-schema.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA0FvC,eAAO,MAAM,cAAc,EAAE,IAAI,EAAsD,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
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 { createGateContext, describeEntity, describePset, searchSchema } from '@ifc-lite/ids-authoring';
|
|
5
|
+
import { ToolErrorCode, ToolExecutionError } from '../errors.js';
|
|
6
|
+
import { okResult } from './util.js';
|
|
7
|
+
const VERSION = {
|
|
8
|
+
type: 'string',
|
|
9
|
+
enum: ['IFC2X3', 'IFC4', 'IFC4X3', 'IFC4X3_ADD2'],
|
|
10
|
+
default: 'IFC4',
|
|
11
|
+
description: 'IFC schema version of the specification.',
|
|
12
|
+
};
|
|
13
|
+
const idsSchemaSearch = {
|
|
14
|
+
name: 'ids_schema_search',
|
|
15
|
+
description: 'Find IFC entity, property set, property or data type names close to a query (typo-tolerant). Use before writing a name into an IDS facet.',
|
|
16
|
+
scope: 'read',
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
query: { type: 'string', minLength: 1 },
|
|
21
|
+
kind: { type: 'string', enum: ['entity', 'pset', 'property', 'dataType'], description: 'Restrict to one kind.' },
|
|
22
|
+
ifc_version: VERSION,
|
|
23
|
+
limit: { type: 'integer', minimum: 1, maximum: 50, default: 10 },
|
|
24
|
+
},
|
|
25
|
+
required: ['query'],
|
|
26
|
+
additionalProperties: false,
|
|
27
|
+
},
|
|
28
|
+
async handler(input) {
|
|
29
|
+
const hits = searchSchema(await createGateContext(), input.query, {
|
|
30
|
+
kind: input.kind,
|
|
31
|
+
version: input.ifc_version,
|
|
32
|
+
limit: input.limit,
|
|
33
|
+
});
|
|
34
|
+
const top = hits.slice(0, 5).map((h) => `${h.value} (${h.kind})`).join(', ');
|
|
35
|
+
return okResult(hits.length ? `Closest: ${top}.` : 'No close names.', { hits });
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const idsSchemaEntity = {
|
|
39
|
+
name: 'ids_schema_entity',
|
|
40
|
+
description: 'Describe an IFC entity for IDS authoring: supertypes, abstract flag, predefined types, attributes and the standard property sets that apply to it.',
|
|
41
|
+
scope: 'read',
|
|
42
|
+
inputSchema: {
|
|
43
|
+
type: 'object',
|
|
44
|
+
properties: { name: { type: 'string', minLength: 1, description: 'Entity name, any case (IfcDoor or IFCDOOR).' }, ifc_version: VERSION },
|
|
45
|
+
required: ['name'],
|
|
46
|
+
additionalProperties: false,
|
|
47
|
+
},
|
|
48
|
+
async handler(input) {
|
|
49
|
+
const ctx = await createGateContext();
|
|
50
|
+
const version = input.ifc_version;
|
|
51
|
+
const name = input.name;
|
|
52
|
+
const entity = describeEntity(ctx, name, version);
|
|
53
|
+
if (!entity) {
|
|
54
|
+
const candidates = searchSchema(ctx, name, { kind: 'entity', version, limit: 5 });
|
|
55
|
+
throw new ToolExecutionError({
|
|
56
|
+
code: ToolErrorCode.INVALID_INPUT,
|
|
57
|
+
message: `"${name}" is not an entity of ${version}.${candidates.length ? ` Did you mean: ${candidates.map((c) => c.value).join(', ')}?` : ''}`,
|
|
58
|
+
details: { candidates },
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return okResult(`${entity.name} (${version}): ${entity.propertySets.length} applicable property set(s).`, { entity });
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
const idsSchemaPset = {
|
|
65
|
+
name: 'ids_schema_pset',
|
|
66
|
+
description: 'Describe a standard property or quantity set: the entities it applies to and its properties with data types and enumerations.',
|
|
67
|
+
scope: 'read',
|
|
68
|
+
inputSchema: {
|
|
69
|
+
type: 'object',
|
|
70
|
+
properties: { name: { type: 'string', minLength: 1, description: 'Exact set name, e.g. Pset_DoorCommon.' }, ifc_version: VERSION },
|
|
71
|
+
required: ['name'],
|
|
72
|
+
additionalProperties: false,
|
|
73
|
+
},
|
|
74
|
+
async handler(input) {
|
|
75
|
+
const ctx = await createGateContext();
|
|
76
|
+
const version = input.ifc_version;
|
|
77
|
+
const name = input.name;
|
|
78
|
+
const pset = describePset(ctx, name, version);
|
|
79
|
+
if (!pset) {
|
|
80
|
+
const candidates = searchSchema(ctx, name, { kind: 'pset', version, limit: 5 });
|
|
81
|
+
throw new ToolExecutionError({
|
|
82
|
+
code: ToolErrorCode.INVALID_INPUT,
|
|
83
|
+
message: `"${name}" is not a standard property set of ${version}.${candidates.length ? ` Did you mean: ${candidates.map((c) => c.value).join(', ')}?` : ''}`,
|
|
84
|
+
details: { candidates },
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return okResult(`${pset.name} (${version}): ${pset.properties.length} propert${pset.properties.length === 1 ? 'y' : 'ies'}.`, { pset });
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
export const idsSchemaTools = [idsSchemaSearch, idsSchemaEntity, idsSchemaPset];
|
|
91
|
+
//# sourceMappingURL=ids-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids-schema.js","sourceRoot":"","sources":["../../src/tools/ids-schema.ts"],"names":[],"mappings":"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"}
|