@ifc-lite/mcp 0.2.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.
Files changed (155) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +186 -0
  3. package/dist/auth/index.d.ts +3 -0
  4. package/dist/auth/index.d.ts.map +1 -0
  5. package/dist/auth/index.js +5 -0
  6. package/dist/auth/index.js.map +1 -0
  7. package/dist/auth/scope.d.ts +24 -0
  8. package/dist/auth/scope.d.ts.map +1 -0
  9. package/dist/auth/scope.js +26 -0
  10. package/dist/auth/scope.js.map +1 -0
  11. package/dist/browser.d.ts +37 -0
  12. package/dist/browser.d.ts.map +1 -0
  13. package/dist/browser.js +37 -0
  14. package/dist/browser.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +233 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/context.d.ts +87 -0
  20. package/dist/context.d.ts.map +1 -0
  21. package/dist/context.js +41 -0
  22. package/dist/context.js.map +1 -0
  23. package/dist/errors.d.ts +37 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +49 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/headless-backend.d.ts +61 -0
  28. package/dist/headless-backend.d.ts.map +1 -0
  29. package/dist/headless-backend.js +472 -0
  30. package/dist/headless-backend.js.map +1 -0
  31. package/dist/index.d.ts +39 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +49 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/loader.d.ts +9 -0
  36. package/dist/loader.d.ts.map +1 -0
  37. package/dist/loader.js +76 -0
  38. package/dist/loader.js.map +1 -0
  39. package/dist/prompts/index.d.ts +6 -0
  40. package/dist/prompts/index.d.ts.map +1 -0
  41. package/dist/prompts/index.js +13 -0
  42. package/dist/prompts/index.js.map +1 -0
  43. package/dist/prompts/templates.d.ts +21 -0
  44. package/dist/prompts/templates.d.ts.map +1 -0
  45. package/dist/prompts/templates.js +238 -0
  46. package/dist/prompts/templates.js.map +1 -0
  47. package/dist/prompts/types.d.ts +17 -0
  48. package/dist/prompts/types.d.ts.map +1 -0
  49. package/dist/prompts/types.js +27 -0
  50. package/dist/prompts/types.js.map +1 -0
  51. package/dist/protocol/index.d.ts +3 -0
  52. package/dist/protocol/index.d.ts.map +1 -0
  53. package/dist/protocol/index.js +6 -0
  54. package/dist/protocol/index.js.map +1 -0
  55. package/dist/protocol/jsonrpc.d.ts +12 -0
  56. package/dist/protocol/jsonrpc.d.ts.map +1 -0
  57. package/dist/protocol/jsonrpc.js +62 -0
  58. package/dist/protocol/jsonrpc.js.map +1 -0
  59. package/dist/protocol/types.d.ts +223 -0
  60. package/dist/protocol/types.d.ts.map +1 -0
  61. package/dist/protocol/types.js +37 -0
  62. package/dist/protocol/types.js.map +1 -0
  63. package/dist/resources/index.d.ts +6 -0
  64. package/dist/resources/index.d.ts.map +1 -0
  65. package/dist/resources/index.js +13 -0
  66. package/dist/resources/index.js.map +1 -0
  67. package/dist/resources/providers.d.ts +3 -0
  68. package/dist/resources/providers.d.ts.map +1 -0
  69. package/dist/resources/providers.js +270 -0
  70. package/dist/resources/providers.js.map +1 -0
  71. package/dist/resources/types.d.ts +29 -0
  72. package/dist/resources/types.d.ts.map +1 -0
  73. package/dist/resources/types.js +30 -0
  74. package/dist/resources/types.js.map +1 -0
  75. package/dist/server.d.ts +93 -0
  76. package/dist/server.d.ts.map +1 -0
  77. package/dist/server.js +396 -0
  78. package/dist/server.js.map +1 -0
  79. package/dist/tools/bcf.d.ts +3 -0
  80. package/dist/tools/bcf.d.ts.map +1 -0
  81. package/dist/tools/bcf.js +208 -0
  82. package/dist/tools/bcf.js.map +1 -0
  83. package/dist/tools/bsdd.d.ts +3 -0
  84. package/dist/tools/bsdd.d.ts.map +1 -0
  85. package/dist/tools/bsdd.js +267 -0
  86. package/dist/tools/bsdd.js.map +1 -0
  87. package/dist/tools/diff.d.ts +3 -0
  88. package/dist/tools/diff.d.ts.map +1 -0
  89. package/dist/tools/diff.js +149 -0
  90. package/dist/tools/diff.js.map +1 -0
  91. package/dist/tools/discovery.d.ts +8 -0
  92. package/dist/tools/discovery.d.ts.map +1 -0
  93. package/dist/tools/discovery.js +181 -0
  94. package/dist/tools/discovery.js.map +1 -0
  95. package/dist/tools/export.d.ts +3 -0
  96. package/dist/tools/export.d.ts.map +1 -0
  97. package/dist/tools/export.js +157 -0
  98. package/dist/tools/export.js.map +1 -0
  99. package/dist/tools/geometry.d.ts +3 -0
  100. package/dist/tools/geometry.d.ts.map +1 -0
  101. package/dist/tools/geometry.js +252 -0
  102. package/dist/tools/geometry.js.map +1 -0
  103. package/dist/tools/ids-accessor.d.ts +9 -0
  104. package/dist/tools/ids-accessor.d.ts.map +1 -0
  105. package/dist/tools/ids-accessor.js +131 -0
  106. package/dist/tools/ids-accessor.js.map +1 -0
  107. package/dist/tools/index.d.ts +21 -0
  108. package/dist/tools/index.d.ts.map +1 -0
  109. package/dist/tools/index.js +36 -0
  110. package/dist/tools/index.js.map +1 -0
  111. package/dist/tools/mutate.d.ts +3 -0
  112. package/dist/tools/mutate.d.ts.map +1 -0
  113. package/dist/tools/mutate.js +350 -0
  114. package/dist/tools/mutate.js.map +1 -0
  115. package/dist/tools/query.d.ts +3 -0
  116. package/dist/tools/query.d.ts.map +1 -0
  117. package/dist/tools/query.js +549 -0
  118. package/dist/tools/query.js.map +1 -0
  119. package/dist/tools/types.d.ts +18 -0
  120. package/dist/tools/types.d.ts.map +1 -0
  121. package/dist/tools/types.js +26 -0
  122. package/dist/tools/types.js.map +1 -0
  123. package/dist/tools/util.d.ts +19 -0
  124. package/dist/tools/util.d.ts.map +1 -0
  125. package/dist/tools/util.js +53 -0
  126. package/dist/tools/util.js.map +1 -0
  127. package/dist/tools/validation.d.ts +3 -0
  128. package/dist/tools/validation.d.ts.map +1 -0
  129. package/dist/tools/validation.js +244 -0
  130. package/dist/tools/validation.js.map +1 -0
  131. package/dist/tools/viewer.d.ts +3 -0
  132. package/dist/tools/viewer.d.ts.map +1 -0
  133. package/dist/tools/viewer.js +651 -0
  134. package/dist/tools/viewer.js.map +1 -0
  135. package/dist/transport/http.d.ts +64 -0
  136. package/dist/transport/http.d.ts.map +1 -0
  137. package/dist/transport/http.js +268 -0
  138. package/dist/transport/http.js.map +1 -0
  139. package/dist/transport/in-process.d.ts +25 -0
  140. package/dist/transport/in-process.d.ts.map +1 -0
  141. package/dist/transport/in-process.js +48 -0
  142. package/dist/transport/in-process.js.map +1 -0
  143. package/dist/transport/stdio.d.ts +33 -0
  144. package/dist/transport/stdio.d.ts.map +1 -0
  145. package/dist/transport/stdio.js +86 -0
  146. package/dist/transport/stdio.js.map +1 -0
  147. package/dist/validate.d.ts +23 -0
  148. package/dist/validate.d.ts.map +1 -0
  149. package/dist/validate.js +88 -0
  150. package/dist/validate.js.map +1 -0
  151. package/dist/viewer-manager.d.ts +51 -0
  152. package/dist/viewer-manager.d.ts.map +1 -0
  153. package/dist/viewer-manager.js +183 -0
  154. package/dist/viewer-manager.js.map +1 -0
  155. package/package.json +86 -0
@@ -0,0 +1,149 @@
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
+ * Diff & comparison tools (spec §7.8).
6
+ *
7
+ * Both inputs reference loaded models by id; if you want to diff against an
8
+ * on-disk file, call `model_load` first.
9
+ */
10
+ import { EntityNode } from '@ifc-lite/query';
11
+ import { IFC_ENTITY_NAMES } from '@ifc-lite/data';
12
+ import { okResult } from './util.js';
13
+ import { ToolErrorCode, ToolExecutionError } from '../errors.js';
14
+ function resolveTwo(ctx, a, b) {
15
+ const left = ctx.registry.get(a);
16
+ const right = ctx.registry.get(b);
17
+ if (!left || !right) {
18
+ throw new ToolExecutionError({
19
+ code: ToolErrorCode.MODEL_NOT_FOUND,
20
+ message: `Both models must be loaded; missing: ${[!left && a, !right && b].filter(Boolean).join(', ')}`,
21
+ });
22
+ }
23
+ return { left, right };
24
+ }
25
+ const modelDiff = {
26
+ name: 'model_diff',
27
+ description: 'Compare two loaded models. Reports added/removed entities by GlobalId and per-type count deltas.',
28
+ scope: 'read',
29
+ inputSchema: {
30
+ type: 'object',
31
+ properties: {
32
+ a: { type: 'string', description: 'model_id of base.' },
33
+ b: { type: 'string', description: 'model_id of head.' },
34
+ by_entity: { type: 'boolean', default: true, description: 'Include per-entity GlobalId additions/removals.' },
35
+ },
36
+ required: ['a', 'b'],
37
+ additionalProperties: false,
38
+ },
39
+ handler(input, ctx) {
40
+ const { left, right } = resolveTwo(ctx, input.a, input.b);
41
+ // Type-level diff
42
+ const types1 = new Map();
43
+ const types2 = new Map();
44
+ for (const [type, ids] of left.store.entityIndex.byType)
45
+ types1.set(type, ids.length);
46
+ for (const [type, ids] of right.store.entityIndex.byType)
47
+ types2.set(type, ids.length);
48
+ const allTypes = new Set([...types1.keys(), ...types2.keys()]);
49
+ const typeDiffs = [];
50
+ for (const t of allTypes) {
51
+ const c1 = types1.get(t) ?? 0;
52
+ const c2 = types2.get(t) ?? 0;
53
+ if (c1 !== c2)
54
+ typeDiffs.push({ type: IFC_ENTITY_NAMES[t] ?? t, left: c1, right: c2, delta: c2 - c1 });
55
+ }
56
+ typeDiffs.sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta));
57
+ let entityDiff = null;
58
+ if (input.by_entity ?? true) {
59
+ const gids1 = new Set();
60
+ const gids2 = new Set();
61
+ for (const [, ids] of left.store.entityIndex.byType) {
62
+ for (const id of ids) {
63
+ const node = new EntityNode(left.store, id);
64
+ if (node.globalId)
65
+ gids1.add(node.globalId);
66
+ }
67
+ }
68
+ for (const [, ids] of right.store.entityIndex.byType) {
69
+ for (const id of ids) {
70
+ const node = new EntityNode(right.store, id);
71
+ if (node.globalId)
72
+ gids2.add(node.globalId);
73
+ }
74
+ }
75
+ const added = [];
76
+ const removed = [];
77
+ let common = 0;
78
+ for (const g of gids1)
79
+ (gids2.has(g) ? common++ : removed.push(g));
80
+ for (const g of gids2)
81
+ if (!gids1.has(g))
82
+ added.push(g);
83
+ entityDiff = { added, removed, common };
84
+ }
85
+ return okResult(`Diff ${input.a}→${input.b}: ${typeDiffs.length} type changes${entityDiff ? `, +${entityDiff.added.length}/-${entityDiff.removed.length} entities` : ''}.`, { typeDiffs, entityDiff });
86
+ },
87
+ };
88
+ const quantityDiff = {
89
+ name: 'quantity_diff',
90
+ description: 'Per-entity-type quantity comparison between two models, optionally grouped by storey.',
91
+ scope: 'read',
92
+ inputSchema: {
93
+ type: 'object',
94
+ properties: {
95
+ a: { type: 'string' },
96
+ b: { type: 'string' },
97
+ type: { type: 'string', default: 'IfcWall' },
98
+ quantity: { type: 'string', default: 'Volume' },
99
+ group_by: { type: 'string', enum: ['storey', 'type'], default: 'type' },
100
+ },
101
+ required: ['a', 'b'],
102
+ additionalProperties: false,
103
+ },
104
+ handler(input, ctx) {
105
+ const { left, right } = resolveTwo(ctx, input.a, input.b);
106
+ const type = input.type ?? 'IfcWall';
107
+ const qName = input.quantity ?? 'Volume';
108
+ const aggregate = (model) => {
109
+ const out = new Map();
110
+ for (const e of model.bim.query().byType(type).toArray()) {
111
+ const key = input.group_by === 'storey'
112
+ ? (new EntityNode(model.store, e.ref.expressId).storey()?.name ?? '(none)')
113
+ : e.type;
114
+ let value = null;
115
+ for (const qset of model.bim.quantities(e.ref)) {
116
+ for (const q of qset.quantities) {
117
+ if (q.name.endsWith(qName)) {
118
+ value = q.value;
119
+ break;
120
+ }
121
+ }
122
+ if (value !== null)
123
+ break;
124
+ }
125
+ const slot = out.get(key) ?? { count: 0, total: 0 };
126
+ slot.count++;
127
+ if (value != null)
128
+ slot.total += value;
129
+ out.set(key, slot);
130
+ }
131
+ return out;
132
+ };
133
+ const left1 = aggregate(left);
134
+ const right1 = aggregate(right);
135
+ const groups = new Set([...left1.keys(), ...right1.keys()]);
136
+ const rows = [];
137
+ for (const k of groups) {
138
+ const l = left1.get(k)?.total ?? 0;
139
+ const r = right1.get(k)?.total ?? 0;
140
+ const delta = r - l;
141
+ const pct = l === 0 ? null : (delta / l) * 100;
142
+ rows.push({ key: k, left: l, right: r, delta, deltaPct: pct });
143
+ }
144
+ rows.sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta));
145
+ return okResult(`${rows.length} group(s) compared (${type}.${qName}).`, { type, quantity: qName, groupBy: input.group_by ?? 'type', rows });
146
+ },
147
+ };
148
+ export const diffTools = [modelDiff, quantityDiff];
149
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/tools/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const modelInfo: Tool;
3
+ export declare const modelList: Tool;
4
+ export declare const modelLoad: Tool;
5
+ export declare const modelUnload: Tool;
6
+ export declare const schemaDescribe: Tool;
7
+ export declare const discoveryTools: Tool[];
8
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAKvC,eAAO,MAAM,SAAS,EAAE,IAyCvB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,IAyBvB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,IAiCvB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,IAuBzB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,IA2C5B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,IAAI,EAMhC,CAAC"}
@@ -0,0 +1,181 @@
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
+ * Discovery & metadata tools (spec §7.1).
6
+ *
7
+ * These are the always-on, read-only tools an agent calls first to figure
8
+ * out what models are loaded and what's in them.
9
+ */
10
+ import { extractGeoreferencingOnDemand, extractLengthUnitScale, getAllAttributesForEntity, getEntityMetadata, getInheritanceChainForEntity, isKnownEntity, } from '@ifc-lite/parser';
11
+ import { resolveModel, okResult } from './util.js';
12
+ import { loadIfcModel } from '../loader.js';
13
+ import { ToolErrorCode, ToolExecutionError } from '../errors.js';
14
+ export const modelInfo = {
15
+ name: 'model_info',
16
+ description: 'Return schema, entity counts, file metadata, georeferencing, and units for the active (or named) model.',
17
+ scope: 'read',
18
+ inputSchema: {
19
+ type: 'object',
20
+ properties: {
21
+ model_id: { type: 'string', description: 'Model identifier. Optional when only one model is loaded.' },
22
+ },
23
+ additionalProperties: false,
24
+ },
25
+ handler(input, ctx) {
26
+ const m = resolveModel(ctx, input.model_id);
27
+ const georef = extractGeoreferencingOnDemand(m.store);
28
+ const lengthScale = m.store.source && m.store.entityIndex
29
+ ? extractLengthUnitScale(m.store.source, m.store.entityIndex)
30
+ : 1.0;
31
+ const typeCounts = {};
32
+ for (const [type, ids] of m.store.entityIndex.byType) {
33
+ typeCounts[type] = ids.length;
34
+ }
35
+ const summary = `Model '${m.name}' (${m.store.schemaVersion}): ${m.store.entityCount.toLocaleString()} entities, ${(m.store.fileSize / 1024).toFixed(1)} KB`;
36
+ return okResult(summary, {
37
+ id: m.id,
38
+ name: m.name,
39
+ schema: m.store.schemaVersion,
40
+ entityCount: m.store.entityCount,
41
+ fileSize: m.store.fileSize,
42
+ filePath: m.filePath,
43
+ loadedAt: m.loadedAt,
44
+ lengthUnitScale: lengthScale,
45
+ georeferencing: georef ?? null,
46
+ typeCountsTop20: Object.entries(typeCounts)
47
+ .sort((a, b) => b[1] - a[1])
48
+ .slice(0, 20)
49
+ .map(([type, count]) => ({ type, count })),
50
+ typeCountsTotal: Object.keys(typeCounts).length,
51
+ });
52
+ },
53
+ };
54
+ export const modelList = {
55
+ name: 'model_list',
56
+ description: 'List all currently loaded models with metadata.',
57
+ scope: 'read',
58
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
59
+ handler(_input, ctx) {
60
+ const list = ctx.registry.list();
61
+ return okResult(list.length === 0
62
+ ? 'No models currently loaded.'
63
+ : `${list.length} model${list.length === 1 ? '' : 's'} loaded.`, {
64
+ count: list.length,
65
+ models: list.map((m) => ({
66
+ id: m.id,
67
+ name: m.name,
68
+ schema: m.store.schemaVersion,
69
+ entityCount: m.store.entityCount,
70
+ fileSize: m.store.fileSize,
71
+ filePath: m.filePath,
72
+ loadedAt: m.loadedAt,
73
+ })),
74
+ });
75
+ },
76
+ };
77
+ export const modelLoad = {
78
+ name: 'model_load',
79
+ description: 'Load an IFC file from disk into the session. Requires `mutate` scope. The path must be inside the configured allowedPaths roots (when set).',
80
+ scope: 'mutate',
81
+ inputSchema: {
82
+ type: 'object',
83
+ properties: {
84
+ file_path: { type: 'string', description: 'Absolute path to the .ifc file.' },
85
+ model_id: { type: 'string', description: 'Optional explicit ID. Defaults to a slug of the file name.' },
86
+ },
87
+ required: ['file_path'],
88
+ additionalProperties: false,
89
+ },
90
+ async handler(input, ctx) {
91
+ const filePath = input.file_path;
92
+ try {
93
+ const loaded = await loadIfcModel(filePath, {
94
+ modelId: input.model_id,
95
+ allowedPaths: ctx.config.allowedPaths,
96
+ });
97
+ ctx.registry.add(loaded);
98
+ ctx.log.log('info', 'model_load', { id: loaded.id, file: filePath, entities: loaded.store.entityCount });
99
+ return okResult(`Loaded '${loaded.name}' as model '${loaded.id}' (${loaded.store.entityCount.toLocaleString()} entities).`, { id: loaded.id, name: loaded.name, schema: loaded.store.schemaVersion, entityCount: loaded.store.entityCount });
100
+ }
101
+ catch (err) {
102
+ throw new ToolExecutionError({
103
+ code: ToolErrorCode.PARSE_FAILED,
104
+ message: `Failed to load '${filePath}': ${err.message}`,
105
+ });
106
+ }
107
+ },
108
+ };
109
+ export const modelUnload = {
110
+ name: 'model_unload',
111
+ description: 'Drop a model from session memory.',
112
+ scope: 'mutate',
113
+ inputSchema: {
114
+ type: 'object',
115
+ properties: {
116
+ model_id: { type: 'string', description: 'Model identifier.' },
117
+ },
118
+ required: ['model_id'],
119
+ additionalProperties: false,
120
+ },
121
+ handler(input, ctx) {
122
+ const id = input.model_id;
123
+ if (!ctx.registry.get(id)) {
124
+ throw new ToolExecutionError({
125
+ code: ToolErrorCode.MODEL_NOT_FOUND,
126
+ message: `Model '${id}' is not loaded.`,
127
+ });
128
+ }
129
+ ctx.registry.remove(id);
130
+ return okResult(`Unloaded model '${id}'.`, { id });
131
+ },
132
+ };
133
+ export const schemaDescribe = {
134
+ name: 'schema_describe',
135
+ description: 'Describe an IFC entity type: attributes, parents, inheritance chain. Useful for an agent to know the legal shape before mutating.',
136
+ scope: 'read',
137
+ inputSchema: {
138
+ type: 'object',
139
+ properties: {
140
+ type: { type: 'string', description: 'IFC entity name, e.g. IfcWall.' },
141
+ include_inherited: { type: 'boolean', default: true, description: 'Include attributes inherited from parent entities.' },
142
+ },
143
+ required: ['type'],
144
+ additionalProperties: false,
145
+ },
146
+ handler(input) {
147
+ const type = input.type;
148
+ if (!isKnownEntity(type)) {
149
+ throw new ToolExecutionError({
150
+ code: ToolErrorCode.INVALID_INPUT,
151
+ message: `Unknown IFC entity type: '${type}'`,
152
+ hint: 'Use canonical PascalCase names like IfcWall, IfcDoor.',
153
+ });
154
+ }
155
+ const meta = getEntityMetadata(type);
156
+ if (!meta) {
157
+ throw new ToolExecutionError({
158
+ code: ToolErrorCode.INVALID_INPUT,
159
+ message: `No schema metadata for '${type}'`,
160
+ });
161
+ }
162
+ const inheritance = getInheritanceChainForEntity(type);
163
+ const includeInherited = input.include_inherited ?? true;
164
+ const attrs = includeInherited ? getAllAttributesForEntity(type) : meta.attributes;
165
+ return okResult(`${type}: ${attrs.length} attributes, parent ${meta.parent ?? '(root)'}, abstract=${meta.isAbstract}.`, {
166
+ type: meta.name,
167
+ parent: meta.parent ?? null,
168
+ isAbstract: meta.isAbstract,
169
+ inheritanceChain: inheritance,
170
+ attributes: attrs,
171
+ });
172
+ },
173
+ };
174
+ export const discoveryTools = [
175
+ modelInfo,
176
+ modelList,
177
+ modelLoad,
178
+ modelUnload,
179
+ schemaDescribe,
180
+ ];
181
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const exportTools: Tool[];
3
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/tools/export.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAwJvC,eAAO,MAAM,WAAW,EAAE,IAAI,EAA+E,CAAC"}
@@ -0,0 +1,157 @@
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
+ * Export tools (spec §7.9).
6
+ *
7
+ * `export_ifc` writes a STEP file (with any pending mutations applied),
8
+ * `export_csv` and `export_json` produce tabular dumps, `export_glb` and
9
+ * `export_pdf_report` are stubbed pending the WASM geometry & PDF stack.
10
+ */
11
+ import { writeFile } from 'node:fs/promises';
12
+ import { resolve } from 'node:path';
13
+ import { okResult, resolveModel } from './util.js';
14
+ import { ToolErrorCode, ToolExecutionError } from '../errors.js';
15
+ function checkPath(filePath, allowed) {
16
+ if (!allowed || allowed.length === 0)
17
+ return;
18
+ const ok = allowed.some((p) => filePath === p || filePath.startsWith(p + '/'));
19
+ if (!ok) {
20
+ throw new ToolExecutionError({
21
+ code: ToolErrorCode.PERMISSION_DENIED,
22
+ message: `Path '${filePath}' outside allowed roots`,
23
+ });
24
+ }
25
+ }
26
+ const exportIfc = {
27
+ name: 'export_ifc',
28
+ description: 'Write the model (with pending mutations) to .ifc/.ifczip on disk.',
29
+ scope: 'export',
30
+ inputSchema: {
31
+ type: 'object',
32
+ properties: {
33
+ model_id: { type: 'string' },
34
+ file_path: { type: 'string' },
35
+ schema: { type: 'string', enum: ['IFC2X3', 'IFC4', 'IFC4X3'] },
36
+ global_ids: { type: 'array', items: { type: 'string' }, description: 'Optional GlobalId allowlist; defaults to the whole model.' },
37
+ },
38
+ required: ['file_path'],
39
+ additionalProperties: false,
40
+ },
41
+ async handler(input, ctx) {
42
+ const m = resolveModel(ctx, input.model_id);
43
+ const filePath = resolve(input.file_path);
44
+ checkPath(filePath, ctx.config.allowedPaths);
45
+ const schema = input.schema ?? m.store.schemaVersion;
46
+ let refs = [];
47
+ if (Array.isArray(input.global_ids)) {
48
+ const wanted = new Set(input.global_ids);
49
+ for (const e of m.bim.query().toArray())
50
+ if (wanted.has(e.globalId))
51
+ refs.push(e.ref);
52
+ }
53
+ const content = m.bim.export.ifc(refs, { schema: schema });
54
+ const text = typeof content === 'string' ? content : new TextDecoder().decode(content);
55
+ await writeFile(filePath, text, 'utf-8');
56
+ return okResult(`Wrote ${text.length.toLocaleString()} bytes to ${filePath}.`, { filePath, bytes: text.length, schema, exportedCount: refs.length || m.store.entityCount });
57
+ },
58
+ };
59
+ const exportCsv = {
60
+ name: 'export_csv',
61
+ description: 'Tabular property/quantity export. Columns may be plain attributes (Name, Type, GlobalId) or `Pset_X.Property` / `Qto_X.Quantity` paths.',
62
+ scope: 'export',
63
+ inputSchema: {
64
+ type: 'object',
65
+ properties: {
66
+ model_id: { type: 'string' },
67
+ file_path: { type: 'string' },
68
+ type: { type: 'string', description: 'Filter by IFC type (default: all products).' },
69
+ columns: { type: 'array', items: { type: 'string' }, default: ['GlobalId', 'Type', 'Name'] },
70
+ separator: { type: 'string', default: ',' },
71
+ },
72
+ additionalProperties: false,
73
+ },
74
+ async handler(input, ctx) {
75
+ const m = resolveModel(ctx, input.model_id);
76
+ const cols = input.columns ?? ['GlobalId', 'Type', 'Name'];
77
+ const sep = input.separator ?? ',';
78
+ const filterType = input.type;
79
+ const refs = (filterType ? m.bim.query().byType(filterType).toArray() : m.bim.query().toArray()).map((e) => e.ref);
80
+ const csv = m.bim.export.csv(refs, { columns: cols, separator: sep });
81
+ if (typeof input.file_path === 'string') {
82
+ const filePath = resolve(input.file_path);
83
+ checkPath(filePath, ctx.config.allowedPaths);
84
+ await writeFile(filePath, csv, 'utf-8');
85
+ return okResult(`Wrote ${csv.length.toLocaleString()} bytes to ${filePath}.`, { filePath, rows: refs.length });
86
+ }
87
+ return okResult(`${refs.length} rows.`, { csv, rows: refs.length });
88
+ },
89
+ };
90
+ const exportJson = {
91
+ name: 'export_json',
92
+ description: 'Structured JSON dump of attributes/properties/quantities for a type set.',
93
+ scope: 'export',
94
+ inputSchema: {
95
+ type: 'object',
96
+ properties: {
97
+ model_id: { type: 'string' },
98
+ file_path: { type: 'string' },
99
+ type: { type: 'string' },
100
+ columns: { type: 'array', items: { type: 'string' }, default: ['GlobalId', 'Type', 'Name'] },
101
+ },
102
+ additionalProperties: false,
103
+ },
104
+ async handler(input, ctx) {
105
+ const m = resolveModel(ctx, input.model_id);
106
+ const cols = input.columns ?? ['GlobalId', 'Type', 'Name'];
107
+ const filterType = input.type;
108
+ const refs = (filterType ? m.bim.query().byType(filterType).toArray() : m.bim.query().toArray()).map((e) => e.ref);
109
+ const rows = m.bim.export.json(refs, cols);
110
+ if (typeof input.file_path === 'string') {
111
+ const filePath = resolve(input.file_path);
112
+ checkPath(filePath, ctx.config.allowedPaths);
113
+ const text = JSON.stringify(rows, null, 2);
114
+ await writeFile(filePath, text, 'utf-8');
115
+ return okResult(`Wrote ${rows.length} rows to ${filePath}.`, { filePath, rows: rows.length });
116
+ }
117
+ return okResult(`${rows.length} rows.`, { rows });
118
+ },
119
+ };
120
+ const exportGlb = {
121
+ name: 'export_glb',
122
+ description: 'Geometry-only glTF binary export. Requires the WASM geometry pipeline.',
123
+ scope: 'export',
124
+ inputSchema: { type: 'object', properties: { model_id: { type: 'string' }, file_path: { type: 'string' } }, additionalProperties: false },
125
+ handler() {
126
+ throw new ToolExecutionError({
127
+ code: ToolErrorCode.UNSUPPORTED_OPERATION,
128
+ message: 'export_glb requires the WASM geometry pipeline (planned for v0.2).',
129
+ });
130
+ },
131
+ };
132
+ const exportIfcx = {
133
+ name: 'export_ifcx',
134
+ description: 'Save to .ifcx (IFC5). Planned for v0.2.',
135
+ scope: 'export',
136
+ inputSchema: { type: 'object', properties: { model_id: { type: 'string' }, file_path: { type: 'string' } }, additionalProperties: false },
137
+ handler() {
138
+ throw new ToolExecutionError({
139
+ code: ToolErrorCode.UNSUPPORTED_OPERATION,
140
+ message: 'export_ifcx is planned for v0.2.',
141
+ });
142
+ },
143
+ };
144
+ const exportPdfReport = {
145
+ name: 'export_pdf_report',
146
+ description: 'Audit/IDS report as PDF. Planned for v0.5.',
147
+ scope: 'export',
148
+ inputSchema: { type: 'object', properties: { model_id: { type: 'string' }, file_path: { type: 'string' } }, additionalProperties: false },
149
+ handler() {
150
+ throw new ToolExecutionError({
151
+ code: ToolErrorCode.UNSUPPORTED_OPERATION,
152
+ message: 'export_pdf_report is planned for v0.5.',
153
+ });
154
+ },
155
+ };
156
+ export const exportTools = [exportIfc, exportCsv, exportJson, exportGlb, exportIfcx, exportPdfReport];
157
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/tools/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const geometryTools: Tool[];
3
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/tools/geometry.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA2OvC,eAAO,MAAM,aAAa,EAAE,IAAI,EAO/B,CAAC"}