@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,23 @@
1
+ /**
2
+ * Tiny JSON-Schema input validator (Draft 2020-12 subset).
3
+ *
4
+ * We only support the keywords our hand-authored tool schemas use:
5
+ * type, properties, required, items, enum, minimum, maximum,
6
+ * minLength, maxLength, default, oneOf, anyOf, additionalProperties.
7
+ *
8
+ * That's enough to surface clear `INVALID_INPUT` errors back to the LLM
9
+ * without bringing in `ajv` (and its 200+ KB of metaschema) or zod.
10
+ */
11
+ import type { JsonSchema } from './protocol/index.js';
12
+ export interface ValidationIssue {
13
+ path: string;
14
+ message: string;
15
+ }
16
+ export interface ValidationResult {
17
+ valid: boolean;
18
+ errors: ValidationIssue[];
19
+ /** Input with `default` values filled in. */
20
+ value: unknown;
21
+ }
22
+ export declare function validateInput(schema: JsonSchema, input: unknown): ValidationResult;
23
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,6CAA6C;IAC7C,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAIlF"}
@@ -0,0 +1,88 @@
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 function validateInput(schema, input) {
5
+ const errors = [];
6
+ const value = walk(schema, input, '$', errors);
7
+ return { valid: errors.length === 0, errors, value };
8
+ }
9
+ function walk(schema, input, path, errors) {
10
+ if (input === undefined && schema.default !== undefined) {
11
+ input = clone(schema.default);
12
+ }
13
+ if (input === undefined || input === null)
14
+ return input;
15
+ if (schema.enum && !schema.enum.includes(input)) {
16
+ errors.push({ path, message: `Expected one of ${JSON.stringify(schema.enum)}; got ${JSON.stringify(input)}` });
17
+ }
18
+ const types = Array.isArray(schema.type) ? schema.type : (schema.type ? [schema.type] : []);
19
+ if (types.length > 0 && !types.some((t) => matchesType(t, input))) {
20
+ errors.push({ path, message: `Expected type ${types.join('|')}; got ${typeof input}` });
21
+ return input;
22
+ }
23
+ if (matchesType('object', input) && schema.properties) {
24
+ const obj = input;
25
+ const result = { ...obj };
26
+ for (const [key, sub] of Object.entries(schema.properties)) {
27
+ const childPath = `${path}.${key}`;
28
+ const value = walk(sub, obj[key], childPath, errors);
29
+ if (value !== undefined)
30
+ result[key] = value;
31
+ }
32
+ if (schema.required) {
33
+ for (const key of schema.required) {
34
+ if (result[key] === undefined) {
35
+ errors.push({ path: `${path}.${key}`, message: 'Required property missing' });
36
+ }
37
+ }
38
+ }
39
+ if (schema.additionalProperties === false) {
40
+ const allowed = new Set(Object.keys(schema.properties ?? {}));
41
+ for (const key of Object.keys(obj)) {
42
+ if (!allowed.has(key)) {
43
+ errors.push({ path: `${path}.${key}`, message: 'Unexpected property' });
44
+ }
45
+ }
46
+ }
47
+ return result;
48
+ }
49
+ if (matchesType('array', input) && schema.items) {
50
+ const arr = input;
51
+ return arr.map((item, i) => walk(schema.items, item, `${path}[${i}]`, errors));
52
+ }
53
+ if (typeof input === 'number') {
54
+ if (schema.minimum !== undefined && input < schema.minimum) {
55
+ errors.push({ path, message: `Must be >= ${schema.minimum}` });
56
+ }
57
+ if (schema.maximum !== undefined && input > schema.maximum) {
58
+ errors.push({ path, message: `Must be <= ${schema.maximum}` });
59
+ }
60
+ }
61
+ if (typeof input === 'string') {
62
+ if (schema.minLength !== undefined && input.length < schema.minLength) {
63
+ errors.push({ path, message: `String shorter than ${schema.minLength}` });
64
+ }
65
+ if (schema.maxLength !== undefined && input.length > schema.maxLength) {
66
+ errors.push({ path, message: `String longer than ${schema.maxLength}` });
67
+ }
68
+ }
69
+ return input;
70
+ }
71
+ function matchesType(t, v) {
72
+ switch (t) {
73
+ case 'string': return typeof v === 'string';
74
+ case 'number': return typeof v === 'number' && !Number.isNaN(v);
75
+ case 'integer': return typeof v === 'number' && Number.isInteger(v);
76
+ case 'boolean': return typeof v === 'boolean';
77
+ case 'array': return Array.isArray(v);
78
+ case 'object': return v !== null && typeof v === 'object' && !Array.isArray(v);
79
+ case 'null': return v === null;
80
+ default: return true;
81
+ }
82
+ }
83
+ function clone(v) {
84
+ if (v === null || typeof v !== 'object')
85
+ return v;
86
+ return JSON.parse(JSON.stringify(v));
87
+ }
88
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { createStreamingViewerAdapter, createStreamingVisibilityAdapter } from '@ifc-lite/viewer-core';
2
+ import type { LoadedModel } from './context.js';
3
+ export interface SelectionEvent {
4
+ expressId: number;
5
+ ifcType?: string;
6
+ globalId?: string;
7
+ }
8
+ export interface ViewerState {
9
+ port: number;
10
+ url: string;
11
+ modelId: string | null;
12
+ startedAt: number;
13
+ clientCount: number;
14
+ selection: SelectionEvent[];
15
+ }
16
+ export type SelectionListener = (selection: SelectionEvent[], model: LoadedModel | null) => void;
17
+ export declare class ViewerManager {
18
+ private server;
19
+ private port;
20
+ private startedAt;
21
+ private modelId;
22
+ private currentSelection;
23
+ private listeners;
24
+ private sseAbort;
25
+ private resolveModel;
26
+ constructor(resolveModel: (id: string | null) => LoadedModel | null);
27
+ isOpen(): boolean;
28
+ state(): ViewerState | null;
29
+ /**
30
+ * Start the viewer for `model`. If already running for the same model,
31
+ * returns the existing state. If a different model is requested, the
32
+ * caller must `close()` first — we don't auto-swap to avoid surprising
33
+ * mid-session changes.
34
+ */
35
+ open(model: LoadedModel, requestedPort?: number): Promise<ViewerState>;
36
+ close(): void;
37
+ /** Subscribe to selection changes. Returns an unsubscribe handle. */
38
+ onSelection(listener: SelectionListener): () => void;
39
+ /** Build viewer + visibility streaming adapters bound to the running port. */
40
+ adapters(): {
41
+ viewer: ReturnType<typeof createStreamingViewerAdapter>;
42
+ visibility: ReturnType<typeof createStreamingVisibilityAdapter>;
43
+ } | null;
44
+ /** Send a one-off command via the viewer's REST API. */
45
+ sendCommand(action: string, payload?: Record<string, unknown>): Promise<void>;
46
+ private subscribeToEvents;
47
+ private consumeSse;
48
+ private handleSseFrame;
49
+ private handlePicked;
50
+ }
51
+ //# sourceMappingURL=viewer-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer-manager.d.ts","sourceRoot":"","sources":["../src/viewer-manager.ts"],"names":[],"mappings":"AAwBA,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,EAEjC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;AAEjG,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,YAAY,CAA4C;gBAEpD,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,WAAW,GAAG,IAAI;IAInE,MAAM,IAAI,OAAO;IAIjB,KAAK,IAAI,WAAW,GAAG,IAAI;IAY3B;;;;;OAKG;IACG,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,SAAI,GAAG,OAAO,CAAC,WAAW,CAAC;IAgCvE,KAAK,IAAI,IAAI;IAgBb,qEAAqE;IACrE,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAKpD,8EAA8E;IAC9E,QAAQ,IAAI;QAAE,MAAM,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;QAAC,UAAU,EAAE,UAAU,CAAC,OAAO,gCAAgC,CAAC,CAAA;KAAE,GAAG,IAAI;IAQ/I,wDAAwD;IAClD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvF,OAAO,CAAC,iBAAiB;YASX,UAAU;IAsBxB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,YAAY;CAmBrB"}
@@ -0,0 +1,183 @@
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 { createStreamingViewerAdapter, createStreamingVisibilityAdapter, startViewerServer, } from '@ifc-lite/viewer-core';
5
+ import { EntityNode } from '@ifc-lite/query';
6
+ export class ViewerManager {
7
+ server = null;
8
+ port = 0;
9
+ startedAt = 0;
10
+ modelId = null;
11
+ currentSelection = [];
12
+ listeners = new Set();
13
+ sseAbort = null;
14
+ resolveModel;
15
+ constructor(resolveModel) {
16
+ this.resolveModel = resolveModel;
17
+ }
18
+ isOpen() {
19
+ return this.server !== null;
20
+ }
21
+ state() {
22
+ if (!this.server)
23
+ return null;
24
+ return {
25
+ port: this.port,
26
+ url: `http://localhost:${this.port}/`,
27
+ modelId: this.modelId,
28
+ startedAt: this.startedAt,
29
+ clientCount: this.server.clientCount(),
30
+ selection: [...this.currentSelection],
31
+ };
32
+ }
33
+ /**
34
+ * Start the viewer for `model`. If already running for the same model,
35
+ * returns the existing state. If a different model is requested, the
36
+ * caller must `close()` first — we don't auto-swap to avoid surprising
37
+ * mid-session changes.
38
+ */
39
+ async open(model, requestedPort = 0) {
40
+ if (this.server) {
41
+ if (this.modelId === model.id) {
42
+ return this.state();
43
+ }
44
+ throw new Error(`Viewer already open for model '${this.modelId}'. Call viewer_close before switching to '${model.id}'.`);
45
+ }
46
+ if (!model.filePath) {
47
+ throw new Error(`Cannot open viewer: model '${model.id}' has no on-disk file path. The viewer streams the .ifc directly from disk.`);
48
+ }
49
+ let resolvedPort = requestedPort;
50
+ this.server = await startViewerServer({
51
+ filePath: model.filePath,
52
+ fileName: model.name,
53
+ port: requestedPort,
54
+ onReady: (boundPort) => {
55
+ resolvedPort = boundPort;
56
+ },
57
+ });
58
+ this.port = resolvedPort;
59
+ this.modelId = model.id;
60
+ this.startedAt = Date.now();
61
+ this.currentSelection = [];
62
+ this.subscribeToEvents();
63
+ return this.state();
64
+ }
65
+ close() {
66
+ this.sseAbort?.abort();
67
+ this.sseAbort = null;
68
+ if (this.server) {
69
+ try {
70
+ this.server.close();
71
+ }
72
+ catch (err) {
73
+ // Server already disposed — surface for diagnostics, then move on.
74
+ // eslint-disable-next-line no-console
75
+ console.error('[viewer-manager] close error', err);
76
+ }
77
+ }
78
+ this.server = null;
79
+ this.port = 0;
80
+ this.modelId = null;
81
+ this.currentSelection = [];
82
+ }
83
+ /** Subscribe to selection changes. Returns an unsubscribe handle. */
84
+ onSelection(listener) {
85
+ this.listeners.add(listener);
86
+ return () => this.listeners.delete(listener);
87
+ }
88
+ /** Build viewer + visibility streaming adapters bound to the running port. */
89
+ adapters() {
90
+ if (!this.server)
91
+ return null;
92
+ return {
93
+ viewer: createStreamingViewerAdapter(this.port),
94
+ visibility: createStreamingVisibilityAdapter(this.port),
95
+ };
96
+ }
97
+ /** Send a one-off command via the viewer's REST API. */
98
+ async sendCommand(action, payload = {}) {
99
+ if (!this.server)
100
+ throw new Error('Viewer is not open. Call viewer_open first.');
101
+ const res = await fetch(`http://localhost:${this.port}/api/command`, {
102
+ method: 'POST',
103
+ headers: { 'Content-Type': 'application/json' },
104
+ body: JSON.stringify({ action, ...payload }),
105
+ });
106
+ if (!res.ok) {
107
+ throw new Error(`Viewer command '${action}' failed: HTTP ${res.status}`);
108
+ }
109
+ }
110
+ // ── internals ──────────────────────────────────────────────────────────
111
+ subscribeToEvents() {
112
+ this.sseAbort = new AbortController();
113
+ void this.consumeSse(this.sseAbort.signal).catch((err) => {
114
+ if (err.name === 'AbortError')
115
+ return;
116
+ // eslint-disable-next-line no-console
117
+ console.error('[viewer-manager] SSE error', err);
118
+ });
119
+ }
120
+ async consumeSse(signal) {
121
+ const url = `http://localhost:${this.port}/events`;
122
+ const res = await fetch(url, { signal, headers: { Accept: 'text/event-stream' } });
123
+ if (!res.body)
124
+ return;
125
+ const reader = res.body.getReader();
126
+ const decoder = new TextDecoder();
127
+ let buf = '';
128
+ // eslint-disable-next-line no-constant-condition
129
+ while (true) {
130
+ const { value, done } = await reader.read();
131
+ if (done)
132
+ break;
133
+ buf += decoder.decode(value, { stream: true });
134
+ let idx = buf.indexOf('\n\n');
135
+ while (idx !== -1) {
136
+ const frame = buf.slice(0, idx);
137
+ buf = buf.slice(idx + 2);
138
+ this.handleSseFrame(frame);
139
+ idx = buf.indexOf('\n\n');
140
+ }
141
+ }
142
+ }
143
+ handleSseFrame(frame) {
144
+ // Each frame is one or more `data: ...` lines.
145
+ const dataLines = frame.split('\n').filter((l) => l.startsWith('data:')).map((l) => l.slice(5).trim());
146
+ if (dataLines.length === 0)
147
+ return;
148
+ const payload = dataLines.join('\n');
149
+ let parsed;
150
+ try {
151
+ parsed = JSON.parse(payload);
152
+ }
153
+ catch {
154
+ return;
155
+ }
156
+ if (parsed.action === 'picked' && typeof parsed.expressId === 'number') {
157
+ this.handlePicked(parsed.expressId, parsed.ifcType);
158
+ }
159
+ }
160
+ handlePicked(expressId, ifcType) {
161
+ const model = this.resolveModel(this.modelId);
162
+ let globalId;
163
+ if (model && model.store.entityIndex.byId.has(expressId)) {
164
+ try {
165
+ globalId = new EntityNode(model.store, expressId).globalId || undefined;
166
+ }
167
+ catch {
168
+ globalId = undefined;
169
+ }
170
+ }
171
+ this.currentSelection = [{ expressId, ifcType, globalId }];
172
+ for (const listener of this.listeners) {
173
+ try {
174
+ listener(this.currentSelection, model);
175
+ }
176
+ catch (err) {
177
+ // eslint-disable-next-line no-console
178
+ console.error('[viewer-manager] listener error', err);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ //# sourceMappingURL=viewer-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer-manager.js","sourceRoot":"","sources":["../src/viewer-manager.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "@ifc-lite/mcp",
3
+ "version": "0.2.0",
4
+ "description": "Model Context Protocol server for ifc-lite — agent-native BIM via MCP (stdio + Streamable HTTP)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "ifc-lite-mcp": "./dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ },
16
+ "./server": {
17
+ "import": "./dist/server.js",
18
+ "types": "./dist/server.d.ts"
19
+ },
20
+ "./protocol": {
21
+ "import": "./dist/protocol/index.js",
22
+ "types": "./dist/protocol/index.d.ts"
23
+ },
24
+ "./browser": {
25
+ "import": "./dist/browser.js",
26
+ "types": "./dist/browser.d.ts"
27
+ }
28
+ },
29
+ "dependencies": {
30
+ "@types/node": "^20.0.0",
31
+ "@ifc-lite/bcf": "^1.15.3",
32
+ "@ifc-lite/create": "^1.15.0",
33
+ "@ifc-lite/data": "^1.15.2",
34
+ "@ifc-lite/encoding": "^1.14.6",
35
+ "@ifc-lite/export": "^1.18.0",
36
+ "@ifc-lite/ids": "^1.14.11",
37
+ "@ifc-lite/mutations": "^1.15.0",
38
+ "@ifc-lite/parser": "^2.3.0",
39
+ "@ifc-lite/query": "^1.14.7",
40
+ "@ifc-lite/sdk": "^1.15.0",
41
+ "@ifc-lite/viewer-core": "^0.2.3"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^20.0.0",
45
+ "typescript": "^5.3.0",
46
+ "vitest": "^3.2.1"
47
+ },
48
+ "engines": {
49
+ "node": ">=18.0.0"
50
+ },
51
+ "license": "MPL-2.0",
52
+ "author": "Louis True",
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "https://github.com/louistrue/ifc-lite.git",
56
+ "directory": "packages/mcp"
57
+ },
58
+ "homepage": "https://louistrue.github.io/ifc-lite/",
59
+ "bugs": "https://github.com/louistrue/ifc-lite/issues",
60
+ "keywords": [
61
+ "mcp",
62
+ "model-context-protocol",
63
+ "ifc",
64
+ "bim",
65
+ "ai-agent",
66
+ "llm",
67
+ "claude",
68
+ "cursor",
69
+ "json-rpc",
70
+ "ifc-lite",
71
+ "aec"
72
+ ],
73
+ "publishConfig": {
74
+ "access": "public"
75
+ },
76
+ "files": [
77
+ "dist",
78
+ "README.md"
79
+ ],
80
+ "scripts": {
81
+ "build": "pnpm exec tsc",
82
+ "dev": "pnpm exec tsc --watch",
83
+ "start": "node dist/cli.js",
84
+ "test": "vitest run"
85
+ }
86
+ }