@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.
- package/LICENSE +373 -0
- package/README.md +186 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/scope.d.ts +24 -0
- package/dist/auth/scope.d.ts.map +1 -0
- package/dist/auth/scope.js +26 -0
- package/dist/auth/scope.js.map +1 -0
- package/dist/browser.d.ts +37 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +37 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +233 -0
- package/dist/cli.js.map +1 -0
- package/dist/context.d.ts +87 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +41 -0
- package/dist/context.js.map +1 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +49 -0
- package/dist/errors.js.map +1 -0
- package/dist/headless-backend.d.ts +61 -0
- package/dist/headless-backend.d.ts.map +1 -0
- package/dist/headless-backend.js +472 -0
- package/dist/headless-backend.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +9 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +76 -0
- package/dist/loader.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +13 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/templates.d.ts +21 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +238 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/prompts/types.d.ts +17 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +27 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/protocol/index.d.ts +3 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +6 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/jsonrpc.d.ts +12 -0
- package/dist/protocol/jsonrpc.d.ts.map +1 -0
- package/dist/protocol/jsonrpc.js +62 -0
- package/dist/protocol/jsonrpc.js.map +1 -0
- package/dist/protocol/types.d.ts +223 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +37 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/resources/index.d.ts +6 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +13 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/providers.d.ts +3 -0
- package/dist/resources/providers.d.ts.map +1 -0
- package/dist/resources/providers.js +270 -0
- package/dist/resources/providers.js.map +1 -0
- package/dist/resources/types.d.ts +29 -0
- package/dist/resources/types.d.ts.map +1 -0
- package/dist/resources/types.js +30 -0
- package/dist/resources/types.js.map +1 -0
- package/dist/server.d.ts +93 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +396 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/bcf.d.ts +3 -0
- package/dist/tools/bcf.d.ts.map +1 -0
- package/dist/tools/bcf.js +208 -0
- package/dist/tools/bcf.js.map +1 -0
- package/dist/tools/bsdd.d.ts +3 -0
- package/dist/tools/bsdd.d.ts.map +1 -0
- package/dist/tools/bsdd.js +267 -0
- package/dist/tools/bsdd.js.map +1 -0
- package/dist/tools/diff.d.ts +3 -0
- package/dist/tools/diff.d.ts.map +1 -0
- package/dist/tools/diff.js +149 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/discovery.d.ts +8 -0
- package/dist/tools/discovery.d.ts.map +1 -0
- package/dist/tools/discovery.js +181 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/export.d.ts +3 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +157 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/geometry.d.ts +3 -0
- package/dist/tools/geometry.d.ts.map +1 -0
- package/dist/tools/geometry.js +252 -0
- package/dist/tools/geometry.js.map +1 -0
- package/dist/tools/ids-accessor.d.ts +9 -0
- package/dist/tools/ids-accessor.d.ts.map +1 -0
- package/dist/tools/ids-accessor.js +131 -0
- package/dist/tools/ids-accessor.js.map +1 -0
- package/dist/tools/index.d.ts +21 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +36 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/mutate.d.ts +3 -0
- package/dist/tools/mutate.d.ts.map +1 -0
- package/dist/tools/mutate.js +350 -0
- package/dist/tools/mutate.js.map +1 -0
- package/dist/tools/query.d.ts +3 -0
- package/dist/tools/query.d.ts.map +1 -0
- package/dist/tools/query.js +549 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/tools/types.d.ts +18 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +26 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/util.d.ts +19 -0
- package/dist/tools/util.d.ts.map +1 -0
- package/dist/tools/util.js +53 -0
- package/dist/tools/util.js.map +1 -0
- package/dist/tools/validation.d.ts +3 -0
- package/dist/tools/validation.d.ts.map +1 -0
- package/dist/tools/validation.js +244 -0
- package/dist/tools/validation.js.map +1 -0
- package/dist/tools/viewer.d.ts +3 -0
- package/dist/tools/viewer.d.ts.map +1 -0
- package/dist/tools/viewer.js +651 -0
- package/dist/tools/viewer.js.map +1 -0
- package/dist/transport/http.d.ts +64 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +268 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/in-process.d.ts +25 -0
- package/dist/transport/in-process.d.ts.map +1 -0
- package/dist/transport/in-process.js +48 -0
- package/dist/transport/in-process.js.map +1 -0
- package/dist/transport/stdio.d.ts +33 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +86 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/validate.d.ts +23 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +88 -0
- package/dist/validate.js.map +1 -0
- package/dist/viewer-manager.d.ts +51 -0
- package/dist/viewer-manager.d.ts.map +1 -0
- package/dist/viewer-manager.js +183 -0
- package/dist/viewer-manager.js.map +1 -0
- package/package.json +86 -0
package/dist/browser.js
ADDED
|
@@ -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
|
+
/**
|
|
5
|
+
* Browser-safe entrypoint for `@ifc-lite/mcp`.
|
|
6
|
+
*
|
|
7
|
+
* The web playground imports this file directly so it never pulls in any of
|
|
8
|
+
* the Node-only modules:
|
|
9
|
+
* • loader.ts — uses node:fs to mmap .ifc files
|
|
10
|
+
* • viewer-manager.ts — uses node:child_process to open browsers
|
|
11
|
+
* • transport/{stdio,http}.ts — uses node:net + node:stream
|
|
12
|
+
* • tools/{validation,mutate,
|
|
13
|
+
* export,bcf}.ts — uses node:fs/promises + node:path
|
|
14
|
+
*
|
|
15
|
+
* What we DO surface in the browser is the small kernel an in-page agent
|
|
16
|
+
* needs to drive the same tool surface that the stdio CLI exposes:
|
|
17
|
+
* - `HeadlessLikeBackend` — wraps a parsed `IfcDataStore` so
|
|
18
|
+
* `createBimContext({ backend })` from
|
|
19
|
+
* `@ifc-lite/sdk` returns a fully
|
|
20
|
+
* functional read-side BIM context.
|
|
21
|
+
* - error codes + types — so the playground can mirror the
|
|
22
|
+
* wire-format error envelopes the
|
|
23
|
+
* Node MCP server emits.
|
|
24
|
+
* - protocol types — so message shapes stay in lockstep
|
|
25
|
+
* when the playground later switches
|
|
26
|
+
* from a custom dispatcher to the
|
|
27
|
+
* real MCP server in-process.
|
|
28
|
+
*
|
|
29
|
+
* Anything mutation/export/IDS related can be re-added to this entry once
|
|
30
|
+
* those tools learn to write through a Blob-friendly virtual filesystem
|
|
31
|
+
* (planned for v0.3 alongside the OAuth gateway).
|
|
32
|
+
*/
|
|
33
|
+
export { HeadlessLikeBackend, expandTypes, isProductType } from './headless-backend.js';
|
|
34
|
+
export { InMemoryModelRegistry } from './context.js';
|
|
35
|
+
export { ToolErrorCode, ToolExecutionError, toolError } from './errors.js';
|
|
36
|
+
export { PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS, JSONRPC_VERSION, } from './protocol/types.js';
|
|
37
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAKrD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,eAAe,GAChB,MAAM,qBAAqB,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
5
|
+
/**
|
|
6
|
+
* `ifc-lite-mcp` — start an MCP server over stdio (default) or Streamable HTTP.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ifc-lite-mcp ./model.ifc
|
|
10
|
+
* ifc-lite-mcp ./arch.ifc ./struct.ifc --federate
|
|
11
|
+
* ifc-lite-mcp ./model.ifc --read-only
|
|
12
|
+
* ifc-lite-mcp --transport http --port 8765
|
|
13
|
+
* ifc-lite-mcp --transport http --port 8765 --token abc123
|
|
14
|
+
*/
|
|
15
|
+
import { resolve } from 'node:path';
|
|
16
|
+
import { StdioTransport } from './transport/stdio.js';
|
|
17
|
+
import { HttpTransport, BearerTokenAuth, AllowAllAuth } from './transport/http.js';
|
|
18
|
+
import { createMCPServer, VERSION } from './index.js';
|
|
19
|
+
import { loadIfcModel } from './loader.js';
|
|
20
|
+
import { fullScope, readOnlyScope } from './auth/scope.js';
|
|
21
|
+
import { InMemoryModelRegistry } from './context.js';
|
|
22
|
+
function parseArgs(argv) {
|
|
23
|
+
const opts = {
|
|
24
|
+
files: [],
|
|
25
|
+
readOnly: false,
|
|
26
|
+
federate: false,
|
|
27
|
+
transport: 'stdio',
|
|
28
|
+
port: 8765,
|
|
29
|
+
autoViewer: false,
|
|
30
|
+
viewerPort: 0,
|
|
31
|
+
openBrowser: false,
|
|
32
|
+
insecure: false,
|
|
33
|
+
};
|
|
34
|
+
for (let i = 0; i < argv.length; i++) {
|
|
35
|
+
const arg = argv[i];
|
|
36
|
+
if (arg === '--read-only')
|
|
37
|
+
opts.readOnly = true;
|
|
38
|
+
else if (arg === '--federate')
|
|
39
|
+
opts.federate = true;
|
|
40
|
+
else if (arg === '--insecure')
|
|
41
|
+
opts.insecure = true;
|
|
42
|
+
else if (arg === '--transport')
|
|
43
|
+
opts.transport = argv[++i] ?? 'stdio';
|
|
44
|
+
else if (arg === '--port')
|
|
45
|
+
opts.port = Number(argv[++i] ?? 8765);
|
|
46
|
+
else if (arg === '--host')
|
|
47
|
+
opts.host = argv[++i];
|
|
48
|
+
else if (arg === '--token')
|
|
49
|
+
opts.token = argv[++i];
|
|
50
|
+
else if (arg === '--bsdd')
|
|
51
|
+
opts.bsdd = argv[++i];
|
|
52
|
+
else if (arg === '--viewer')
|
|
53
|
+
opts.autoViewer = true;
|
|
54
|
+
else if (arg === '--viewer-port')
|
|
55
|
+
opts.viewerPort = Number(argv[++i] ?? 0);
|
|
56
|
+
else if (arg === '--open') {
|
|
57
|
+
opts.autoViewer = true;
|
|
58
|
+
opts.openBrowser = true;
|
|
59
|
+
}
|
|
60
|
+
else if (arg === '--allow') {
|
|
61
|
+
const path = argv[++i];
|
|
62
|
+
if (path)
|
|
63
|
+
(opts.allowedPaths ??= []).push(resolve(path));
|
|
64
|
+
}
|
|
65
|
+
else if (arg === '--help' || arg === '-h') {
|
|
66
|
+
printHelp();
|
|
67
|
+
process.exit(0);
|
|
68
|
+
}
|
|
69
|
+
else if (arg === '--version' || arg === '-v') {
|
|
70
|
+
process.stdout.write(`ifc-lite-mcp ${VERSION}\n`);
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
73
|
+
else if (!arg.startsWith('-')) {
|
|
74
|
+
opts.files.push(arg);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return opts;
|
|
78
|
+
}
|
|
79
|
+
function printHelp() {
|
|
80
|
+
process.stdout.write(`
|
|
81
|
+
ifc-lite-mcp v${VERSION} — Model Context Protocol server for ifc-lite
|
|
82
|
+
|
|
83
|
+
Usage: ifc-lite-mcp [files…] [options]
|
|
84
|
+
|
|
85
|
+
Options:
|
|
86
|
+
--read-only Hide all mutation tools regardless of scope.
|
|
87
|
+
--federate Mark explicitly that multiple files form one session.
|
|
88
|
+
--transport <stdio|http> Default: stdio.
|
|
89
|
+
--port <n> HTTP port (default 8765).
|
|
90
|
+
--host <h> HTTP host. Default 127.0.0.1 (loopback). Use
|
|
91
|
+
--insecure to allow non-loopback hosts when no
|
|
92
|
+
token is configured.
|
|
93
|
+
--token <t> Single bearer token for HTTP auth (full scope).
|
|
94
|
+
Can be repeated to register multiple read-only tokens.
|
|
95
|
+
--insecure Allow non-loopback bind without authentication.
|
|
96
|
+
Required when combining a public --host with no
|
|
97
|
+
--token. NEVER use in production.
|
|
98
|
+
--bsdd <url> Override bSDD endpoint.
|
|
99
|
+
--allow <glob> Restrict file-system access for stdio mode.
|
|
100
|
+
--viewer Auto-open the in-process WebGL viewer at startup.
|
|
101
|
+
--viewer-port <n> Preferred viewer port (0 = auto).
|
|
102
|
+
--open Implies --viewer; also tries to open the URL in
|
|
103
|
+
the default browser via the OS opener.
|
|
104
|
+
--version, -v Print version.
|
|
105
|
+
--help, -h This message.
|
|
106
|
+
|
|
107
|
+
Examples:
|
|
108
|
+
ifc-lite-mcp ./model.ifc
|
|
109
|
+
ifc-lite-mcp ./arch.ifc ./struct.ifc --federate
|
|
110
|
+
ifc-lite-mcp ./model.ifc --read-only
|
|
111
|
+
ifc-lite-mcp --transport http --port 8765 --token abc
|
|
112
|
+
|
|
113
|
+
Claude Desktop config (~/.config/Claude/claude_desktop_config.json):
|
|
114
|
+
{
|
|
115
|
+
"mcpServers": {
|
|
116
|
+
"ifc-lite": {
|
|
117
|
+
"command": "npx",
|
|
118
|
+
"args": ["-y", "@ifc-lite/mcp", "/abs/path/to/model.ifc"]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
`);
|
|
123
|
+
}
|
|
124
|
+
async function main() {
|
|
125
|
+
const opts = parseArgs(process.argv.slice(2));
|
|
126
|
+
const scope = opts.readOnly ? readOnlyScope() : fullScope();
|
|
127
|
+
const registry = new InMemoryModelRegistry();
|
|
128
|
+
if (opts.transport === 'stdio') {
|
|
129
|
+
for (const file of opts.files) {
|
|
130
|
+
const m = await loadIfcModel(resolve(file), { allowedPaths: opts.allowedPaths });
|
|
131
|
+
registry.add(m);
|
|
132
|
+
// Use stderr — stdout is sacred for the JSON-RPC channel.
|
|
133
|
+
process.stderr.write(`[ifc-lite-mcp] loaded ${m.name} (${m.id}) — ${m.store.entityCount.toLocaleString()} entities\n`);
|
|
134
|
+
}
|
|
135
|
+
const server = createMCPServer({
|
|
136
|
+
version: VERSION,
|
|
137
|
+
registry,
|
|
138
|
+
scope,
|
|
139
|
+
config: {
|
|
140
|
+
readOnly: opts.readOnly,
|
|
141
|
+
bsddEndpoint: opts.bsdd,
|
|
142
|
+
allowedPaths: opts.allowedPaths,
|
|
143
|
+
samplingEnabled: false,
|
|
144
|
+
autoOpenViewer: opts.autoViewer,
|
|
145
|
+
viewerPort: opts.viewerPort,
|
|
146
|
+
},
|
|
147
|
+
logger: {
|
|
148
|
+
log(level, message, data) {
|
|
149
|
+
if (level === 'debug')
|
|
150
|
+
return;
|
|
151
|
+
process.stderr.write(`[ifc-lite-mcp] ${level} ${message}${data ? ` ${JSON.stringify(data)}` : ''}\n`);
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
const transport = new StdioTransport();
|
|
156
|
+
await transport.connect(server);
|
|
157
|
+
process.stderr.write(`[ifc-lite-mcp] ready on stdio (read-only=${opts.readOnly})\n`);
|
|
158
|
+
if (opts.autoViewer && registry.count() > 0) {
|
|
159
|
+
const first = registry.list()[0];
|
|
160
|
+
try {
|
|
161
|
+
const state = await server.viewer.open(first, opts.viewerPort);
|
|
162
|
+
const adapters = server.viewer.adapters();
|
|
163
|
+
if (adapters)
|
|
164
|
+
first.backend.attachStreamingAdapters(adapters.viewer, adapters.visibility);
|
|
165
|
+
process.stderr.write(`[ifc-lite-mcp] viewer ready at ${state.url}\n`);
|
|
166
|
+
if (opts.openBrowser) {
|
|
167
|
+
const cmd = process.platform === 'darwin' ? 'open'
|
|
168
|
+
: process.platform === 'win32' ? 'start'
|
|
169
|
+
: 'xdg-open';
|
|
170
|
+
try {
|
|
171
|
+
const { spawn } = await import('node:child_process');
|
|
172
|
+
spawn(cmd, [state.url], { detached: true, stdio: 'ignore' }).unref();
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
process.stderr.write(`[ifc-lite-mcp] could not auto-open browser: ${err.message}\n`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
process.stderr.write(`[ifc-lite-mcp] viewer auto-open failed: ${err.message}\n`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else if (registry.count() > 0) {
|
|
184
|
+
process.stderr.write(`[ifc-lite-mcp] viewer is opt-in. Tell the agent to call \`viewer_ask\` and then \`viewer_open\`, or restart with --viewer to auto-open.\n`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (opts.transport === 'http') {
|
|
188
|
+
// Pick a safe default. Loopback unless the operator explicitly opts in
|
|
189
|
+
// to a public bind. Combining a public bind with no token requires
|
|
190
|
+
// --insecure so the security tradeoff is a deliberate keystroke, not
|
|
191
|
+
// an accidental copy-paste from a tutorial.
|
|
192
|
+
const host = opts.host ?? '127.0.0.1';
|
|
193
|
+
const isLoopback = host === '127.0.0.1' || host === 'localhost' || host === '::1';
|
|
194
|
+
if (!isLoopback && !opts.token && !opts.insecure) {
|
|
195
|
+
process.stderr.write(`[ifc-lite-mcp] refusing to bind ${host} without --token. Pass --token <bearer> or --insecure to override.\n`);
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
const sessionFactory = {
|
|
199
|
+
build(scopeForSession) {
|
|
200
|
+
return createMCPServer({
|
|
201
|
+
version: VERSION,
|
|
202
|
+
// Each HTTP session gets a fresh registry so mutations don't leak.
|
|
203
|
+
registry: new InMemoryModelRegistry(),
|
|
204
|
+
scope: scopeForSession,
|
|
205
|
+
config: {
|
|
206
|
+
readOnly: opts.readOnly,
|
|
207
|
+
bsddEndpoint: opts.bsdd,
|
|
208
|
+
samplingEnabled: false,
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
const auth = opts.token
|
|
214
|
+
? new BearerTokenAuth(new Map([[opts.token, scope]]))
|
|
215
|
+
: new AllowAllAuth(scope);
|
|
216
|
+
const transport = new HttpTransport({ port: opts.port, host, authenticator: auth, sessionFactory });
|
|
217
|
+
await transport.listen();
|
|
218
|
+
process.stderr.write(`[ifc-lite-mcp] listening on http://${host}:${opts.port}` +
|
|
219
|
+
(!opts.token ? ' (no auth — loopback only unless --insecure)' : '') +
|
|
220
|
+
'\n');
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
process.stderr.write(`Unknown transport: ${opts.transport}\n`);
|
|
224
|
+
process.exit(1);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
main().catch((err) => {
|
|
228
|
+
process.stderr.write(`[ifc-lite-mcp] fatal: ${err.message}\n`);
|
|
229
|
+
if (process.env.DEBUG)
|
|
230
|
+
process.stderr.write(`${err.stack ?? ''}\n`);
|
|
231
|
+
process.exit(1);
|
|
232
|
+
});
|
|
233
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool/resource execution context.
|
|
3
|
+
*
|
|
4
|
+
* A handler receives `ToolContext` containing:
|
|
5
|
+
* - the federated model registry (one or many `BimContext` + `IfcDataStore`)
|
|
6
|
+
* - the auth scope of the caller
|
|
7
|
+
* - a `ProgressReporter` (no-op when no token is attached)
|
|
8
|
+
* - a `Logger` for structured server logs
|
|
9
|
+
* - a cancellation signal
|
|
10
|
+
*
|
|
11
|
+
* The registry deliberately holds the parsed `IfcDataStore` next to the
|
|
12
|
+
* `BimContext` because several tools (geometry bbox, audit, schema describe)
|
|
13
|
+
* need direct store access that the SDK doesn't yet surface as namespaces.
|
|
14
|
+
*/
|
|
15
|
+
import type { BimContext } from '@ifc-lite/sdk';
|
|
16
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
17
|
+
import type { AuthScope } from './auth/scope.js';
|
|
18
|
+
import type { HeadlessLikeBackend } from './headless-backend.js';
|
|
19
|
+
import type { ViewerManager } from './viewer-manager.js';
|
|
20
|
+
export interface LoadedModel {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
bim: BimContext;
|
|
24
|
+
store: IfcDataStore;
|
|
25
|
+
/** Concrete backend, retained so mutation tools can reach the editor without reflection. */
|
|
26
|
+
backend: HeadlessLikeBackend;
|
|
27
|
+
filePath?: string;
|
|
28
|
+
loadedAt: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ModelRegistry {
|
|
31
|
+
list(): LoadedModel[];
|
|
32
|
+
get(id: string): LoadedModel | null;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the model for a tool call.
|
|
35
|
+
*
|
|
36
|
+
* Returns the named model when `id` is provided, the single loaded model
|
|
37
|
+
* when only one is loaded, or null if the caller needs to pick.
|
|
38
|
+
*/
|
|
39
|
+
resolve(id?: string): LoadedModel | null;
|
|
40
|
+
add(model: LoadedModel): void;
|
|
41
|
+
remove(id: string): boolean;
|
|
42
|
+
count(): number;
|
|
43
|
+
}
|
|
44
|
+
export declare class InMemoryModelRegistry implements ModelRegistry {
|
|
45
|
+
private models;
|
|
46
|
+
list(): LoadedModel[];
|
|
47
|
+
get(id: string): LoadedModel | null;
|
|
48
|
+
resolve(id?: string): LoadedModel | null;
|
|
49
|
+
add(model: LoadedModel): void;
|
|
50
|
+
remove(id: string): boolean;
|
|
51
|
+
count(): number;
|
|
52
|
+
}
|
|
53
|
+
export interface ProgressReporter {
|
|
54
|
+
report(progress: number, message?: string, total?: number): void;
|
|
55
|
+
}
|
|
56
|
+
export declare const NOOP_PROGRESS: ProgressReporter;
|
|
57
|
+
export type LogLevel = 'debug' | 'info' | 'notice' | 'warning' | 'error' | 'critical';
|
|
58
|
+
export interface Logger {
|
|
59
|
+
log(level: LogLevel, message: string, data?: Record<string, unknown>): void;
|
|
60
|
+
}
|
|
61
|
+
export declare const SILENT_LOGGER: Logger;
|
|
62
|
+
export interface ToolContext {
|
|
63
|
+
registry: ModelRegistry;
|
|
64
|
+
scope: AuthScope;
|
|
65
|
+
progress: ProgressReporter;
|
|
66
|
+
log: Logger;
|
|
67
|
+
/** Honoured by long-running tools; aborts when client cancels. */
|
|
68
|
+
signal: AbortSignal;
|
|
69
|
+
/** Server-wide config (read-only flag, bSDD endpoint, allowed paths, …). */
|
|
70
|
+
config: ServerConfig;
|
|
71
|
+
/** Optional: present when the server has a managed in-process viewer. */
|
|
72
|
+
viewer?: ViewerManager;
|
|
73
|
+
}
|
|
74
|
+
export interface ServerConfig {
|
|
75
|
+
readOnly: boolean;
|
|
76
|
+
bsddEndpoint?: string;
|
|
77
|
+
/** Glob patterns the stdio server is allowed to read from. */
|
|
78
|
+
allowedPaths?: string[];
|
|
79
|
+
/** Sampling capability is opt-in per spec §10. */
|
|
80
|
+
samplingEnabled: boolean;
|
|
81
|
+
/** When true, the MCP CLI auto-opens the viewer at startup. */
|
|
82
|
+
autoOpenViewer?: boolean;
|
|
83
|
+
/** Preferred viewer port (0 = auto). */
|
|
84
|
+
viewerPort?: number;
|
|
85
|
+
}
|
|
86
|
+
export declare const DEFAULT_CONFIG: ServerConfig;
|
|
87
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
export class InMemoryModelRegistry {
|
|
5
|
+
models = new Map();
|
|
6
|
+
list() {
|
|
7
|
+
return Array.from(this.models.values());
|
|
8
|
+
}
|
|
9
|
+
get(id) {
|
|
10
|
+
return this.models.get(id) ?? null;
|
|
11
|
+
}
|
|
12
|
+
resolve(id) {
|
|
13
|
+
if (id)
|
|
14
|
+
return this.models.get(id) ?? null;
|
|
15
|
+
if (this.models.size === 1) {
|
|
16
|
+
const only = this.models.values().next().value;
|
|
17
|
+
return only ?? null;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
add(model) {
|
|
22
|
+
this.models.set(model.id, model);
|
|
23
|
+
}
|
|
24
|
+
remove(id) {
|
|
25
|
+
return this.models.delete(id);
|
|
26
|
+
}
|
|
27
|
+
count() {
|
|
28
|
+
return this.models.size;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export const NOOP_PROGRESS = {
|
|
32
|
+
report() { },
|
|
33
|
+
};
|
|
34
|
+
export const SILENT_LOGGER = {
|
|
35
|
+
log() { },
|
|
36
|
+
};
|
|
37
|
+
export const DEFAULT_CONFIG = {
|
|
38
|
+
readOnly: false,
|
|
39
|
+
samplingEnabled: false,
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAiD/D,MAAM,OAAO,qBAAqB;IACxB,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEhD,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,EAAW;QACjB,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAgC,CAAC;YAC1E,OAAO,IAAI,IAAI,IAAI,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAAkB;QACpB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;CACF;AAMD,MAAM,CAAC,MAAM,aAAa,GAAqB;IAC7C,MAAM,KAA4C,CAAC;CACpD,CAAC;AAQF,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,GAAG,KAAyD,CAAC;CAC9D,CAAC;AA4BF,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,QAAQ,EAAE,KAAK;IACf,eAAe,EAAE,KAAK;CACvB,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable error codes for tool results.
|
|
3
|
+
*
|
|
4
|
+
* Critical: these are surfaced as `structuredContent.code` on tool results
|
|
5
|
+
* with `isError: true` — NEVER as JSON-RPC errors. That lets the LLM read
|
|
6
|
+
* and react to the failure inline rather than aborting the chain.
|
|
7
|
+
*/
|
|
8
|
+
import type { CallToolResult } from './protocol/index.js';
|
|
9
|
+
export declare const ToolErrorCode: {
|
|
10
|
+
readonly ENTITY_NOT_FOUND: "ENTITY_NOT_FOUND";
|
|
11
|
+
readonly MODEL_NOT_FOUND: "MODEL_NOT_FOUND";
|
|
12
|
+
readonly MODEL_REQUIRED: "MODEL_REQUIRED";
|
|
13
|
+
readonly INVALID_INPUT: "INVALID_INPUT";
|
|
14
|
+
readonly UNSUPPORTED_OPERATION: "UNSUPPORTED_OPERATION";
|
|
15
|
+
readonly PERMISSION_DENIED: "PERMISSION_DENIED";
|
|
16
|
+
readonly READ_ONLY: "READ_ONLY";
|
|
17
|
+
readonly PARSE_FAILED: "PARSE_FAILED";
|
|
18
|
+
readonly EXTERNAL_SERVICE_FAILED: "EXTERNAL_SERVICE_FAILED";
|
|
19
|
+
readonly RATE_LIMITED: "RATE_LIMITED";
|
|
20
|
+
readonly INTERNAL_ERROR: "INTERNAL_ERROR";
|
|
21
|
+
};
|
|
22
|
+
export type ToolErrorCodeValue = typeof ToolErrorCode[keyof typeof ToolErrorCode];
|
|
23
|
+
export interface ToolErrorOptions {
|
|
24
|
+
code: ToolErrorCodeValue;
|
|
25
|
+
message: string;
|
|
26
|
+
details?: Record<string, unknown>;
|
|
27
|
+
hint?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function toolError(opts: ToolErrorOptions): CallToolResult;
|
|
30
|
+
export declare class ToolExecutionError extends Error {
|
|
31
|
+
readonly code: ToolErrorCodeValue;
|
|
32
|
+
readonly details?: Record<string, unknown>;
|
|
33
|
+
readonly hint?: string;
|
|
34
|
+
constructor(opts: ToolErrorOptions);
|
|
35
|
+
toToolResult(): CallToolResult;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,eAAO,MAAM,aAAa;;;;;;;;;;;;CAYhB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,OAAO,aAAa,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAElF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAWhE;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,IAAI,EAAE,gBAAgB;IAQlC,YAAY,IAAI,cAAc;CAQ/B"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
export const ToolErrorCode = {
|
|
5
|
+
ENTITY_NOT_FOUND: 'ENTITY_NOT_FOUND',
|
|
6
|
+
MODEL_NOT_FOUND: 'MODEL_NOT_FOUND',
|
|
7
|
+
MODEL_REQUIRED: 'MODEL_REQUIRED',
|
|
8
|
+
INVALID_INPUT: 'INVALID_INPUT',
|
|
9
|
+
UNSUPPORTED_OPERATION: 'UNSUPPORTED_OPERATION',
|
|
10
|
+
PERMISSION_DENIED: 'PERMISSION_DENIED',
|
|
11
|
+
READ_ONLY: 'READ_ONLY',
|
|
12
|
+
PARSE_FAILED: 'PARSE_FAILED',
|
|
13
|
+
EXTERNAL_SERVICE_FAILED: 'EXTERNAL_SERVICE_FAILED',
|
|
14
|
+
RATE_LIMITED: 'RATE_LIMITED',
|
|
15
|
+
INTERNAL_ERROR: 'INTERNAL_ERROR',
|
|
16
|
+
};
|
|
17
|
+
export function toolError(opts) {
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: 'text', text: opts.message }],
|
|
20
|
+
structuredContent: {
|
|
21
|
+
code: opts.code,
|
|
22
|
+
message: opts.message,
|
|
23
|
+
details: opts.details ?? {},
|
|
24
|
+
hint: opts.hint,
|
|
25
|
+
},
|
|
26
|
+
isError: true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export class ToolExecutionError extends Error {
|
|
30
|
+
code;
|
|
31
|
+
details;
|
|
32
|
+
hint;
|
|
33
|
+
constructor(opts) {
|
|
34
|
+
super(opts.message);
|
|
35
|
+
this.name = 'ToolExecutionError';
|
|
36
|
+
this.code = opts.code;
|
|
37
|
+
this.details = opts.details;
|
|
38
|
+
this.hint = opts.hint;
|
|
39
|
+
}
|
|
40
|
+
toToolResult() {
|
|
41
|
+
return toolError({
|
|
42
|
+
code: this.code,
|
|
43
|
+
message: this.message,
|
|
44
|
+
details: this.details,
|
|
45
|
+
hint: this.hint,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAY/D,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,iBAAiB;IAClC,cAAc,EAAE,gBAAgB;IAChC,aAAa,EAAE,eAAe;IAC9B,qBAAqB,EAAE,uBAAuB;IAC9C,iBAAiB,EAAE,mBAAmB;IACtC,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,cAAc;IAC5B,uBAAuB,EAAE,yBAAyB;IAClD,YAAY,EAAE,cAAc;IAC5B,cAAc,EAAE,gBAAgB;CACxB,CAAC;AAWX,MAAM,UAAU,SAAS,CAAC,IAAsB;IAC9C,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/C,iBAAiB,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAqB;IACzB,OAAO,CAA2B;IAClC,IAAI,CAAU;IAEvB,YAAY,IAAsB;QAChC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,YAAY;QACV,OAAO,SAAS,CAAC;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeadlessLikeBackend — minimal `BimBackend` for MCP tool execution.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors `@ifc-lite/cli`'s HeadlessBackend but trimmed to the surface MCP
|
|
5
|
+
* tools touch (model + query + selection + spatial + export + mutate +
|
|
6
|
+
* store + visibility + viewer no-ops). Splitting it out of the CLI lets the
|
|
7
|
+
* MCP package avoid the `@ifc-lite/viewer-core` dependency that the CLI
|
|
8
|
+
* pulls in for `ifc-lite view`.
|
|
9
|
+
*
|
|
10
|
+
* Tools that need richer functionality (geometry mesh data, raycast,
|
|
11
|
+
* heatmap evaluation) call the parser directly via the registry's
|
|
12
|
+
* `LoadedModel.store`, not through this backend.
|
|
13
|
+
*/
|
|
14
|
+
import type { BimBackend, BimEventType, ModelBackendMethods, QueryBackendMethods, SelectionBackendMethods, VisibilityBackendMethods, ViewerBackendMethods, MutateBackendMethods, StoreBackendMethods, SpatialBackendMethods, ExportBackendMethods, LensBackendMethods, FilesBackendMethods, ScheduleBackendMethods } from '@ifc-lite/sdk';
|
|
15
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
16
|
+
import { MutablePropertyView, StoreEditor } from '@ifc-lite/mutations';
|
|
17
|
+
export declare function expandTypes(types: string[]): string[];
|
|
18
|
+
export declare function isProductType(type: string): boolean;
|
|
19
|
+
export declare class HeadlessLikeBackend implements BimBackend {
|
|
20
|
+
readonly model: ModelBackendMethods;
|
|
21
|
+
readonly query: QueryBackendMethods;
|
|
22
|
+
readonly selection: SelectionBackendMethods;
|
|
23
|
+
/**
|
|
24
|
+
* Mutable so the MCP server can swap in streaming adapters when the
|
|
25
|
+
* viewer subprocess starts, then revert when it closes. Marked
|
|
26
|
+
* `readonly` on the BimBackend interface but the underlying instance
|
|
27
|
+
* is ours to manage.
|
|
28
|
+
*/
|
|
29
|
+
visibility: VisibilityBackendMethods;
|
|
30
|
+
viewer: ViewerBackendMethods;
|
|
31
|
+
readonly mutate: MutateBackendMethods;
|
|
32
|
+
readonly store: StoreBackendMethods;
|
|
33
|
+
readonly spatial: SpatialBackendMethods;
|
|
34
|
+
readonly export: ExportBackendMethods;
|
|
35
|
+
readonly lens: LensBackendMethods;
|
|
36
|
+
readonly files: FilesBackendMethods;
|
|
37
|
+
readonly schedule: ScheduleBackendMethods;
|
|
38
|
+
private dataStore;
|
|
39
|
+
private modelName;
|
|
40
|
+
private modelId;
|
|
41
|
+
private mutationView;
|
|
42
|
+
private storeEditor;
|
|
43
|
+
constructor(store: IfcDataStore, modelName: string, modelId: string);
|
|
44
|
+
subscribe(_event: BimEventType, _handler: (data: unknown) => void): () => void;
|
|
45
|
+
private createModelAdapter;
|
|
46
|
+
private createQueryAdapter;
|
|
47
|
+
private createSelectionAdapter;
|
|
48
|
+
private getOrCreateStoreEditor;
|
|
49
|
+
/** Expose the mutation view so tools can inspect pending mutations. */
|
|
50
|
+
getMutationView(): MutablePropertyView | null;
|
|
51
|
+
/** Force creation of the editor (used by mutation tools that always need it). */
|
|
52
|
+
ensureEditor(): StoreEditor;
|
|
53
|
+
/** Replace the viewer/visibility adapters at runtime (for ViewerManager). */
|
|
54
|
+
attachStreamingAdapters(viewer: ViewerBackendMethods, visibility: VisibilityBackendMethods): void;
|
|
55
|
+
/** Restore no-op viewer/visibility adapters (for ViewerManager close). */
|
|
56
|
+
detachStreamingAdapters(): void;
|
|
57
|
+
private createStoreAdapter;
|
|
58
|
+
private createExportAdapter;
|
|
59
|
+
private createScheduleAdapter;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=headless-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless-backend.d.ts","sourceRoot":"","sources":["../src/headless-backend.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EAavB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAkCvE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CASrD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUnD;AAQD,qBAAa,mBAAoB,YAAW,UAAU;IACpD,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAC5C;;;;;OAKG;IACH,UAAU,EAAE,wBAAwB,CAAC;IACrC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAE1C,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,WAAW,CAA4B;gBAEnC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAyBnE,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAI9E,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,kBAAkB;IAgJ1B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,sBAAsB;IAO9B,uEAAuE;IACvE,eAAe,IAAI,mBAAmB,GAAG,IAAI;IAI7C,iFAAiF;IACjF,YAAY,IAAI,WAAW;IAI3B,6EAA6E;IAC7E,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,wBAAwB,GAAG,IAAI;IAKjG,0EAA0E;IAC1E,uBAAuB,IAAI,IAAI;IAS/B,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,mBAAmB;IAqG3B,OAAO,CAAC,qBAAqB;CAqB9B"}
|