@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,19 @@
1
+ /**
2
+ * Shared helpers used by tool handlers. Most importantly:
3
+ * - resolveModel(): pick the right LoadedModel given an optional model_id,
4
+ * erroring if none is loaded or the caller didn't pick when several are.
5
+ * - okResult(): build a standard CallToolResult with both human text and
6
+ * structuredContent.
7
+ */
8
+ import type { CallToolResult } from '../protocol/index.js';
9
+ import type { LoadedModel, ToolContext } from '../context.js';
10
+ export declare function resolveModel(ctx: ToolContext, modelId?: string): LoadedModel;
11
+ export declare function okResult(text: string, structured?: Record<string, unknown>): CallToolResult;
12
+ export declare function fmtCount(n: number, singular: string, plural?: string): string;
13
+ /** Slice a large array down to `limit` and return `{ items, truncated }`. */
14
+ export declare function paginate<T>(items: T[], limit: number, offset?: number): {
15
+ items: T[];
16
+ truncated: boolean;
17
+ total: number;
18
+ };
19
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/tools/util.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CA4B5E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAM3F;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7E;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAIpH"}
@@ -0,0 +1,53 @@
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
+ export function resolveModel(ctx, modelId) {
6
+ if (ctx.registry.count() === 0) {
7
+ throw new ToolExecutionError({
8
+ code: ToolErrorCode.MODEL_NOT_FOUND,
9
+ message: 'No models loaded. Call `model_load` first or start the server with a file path.',
10
+ });
11
+ }
12
+ if (modelId) {
13
+ const found = ctx.registry.get(modelId);
14
+ if (!found) {
15
+ throw new ToolExecutionError({
16
+ code: ToolErrorCode.MODEL_NOT_FOUND,
17
+ message: `Model '${modelId}' not loaded.`,
18
+ details: { available: ctx.registry.list().map((m) => m.id) },
19
+ });
20
+ }
21
+ return found;
22
+ }
23
+ if (ctx.registry.count() > 1) {
24
+ throw new ToolExecutionError({
25
+ code: ToolErrorCode.MODEL_REQUIRED,
26
+ message: 'Multiple models loaded; pass `model_id` to pick one.',
27
+ details: { available: ctx.registry.list().map((m) => m.id) },
28
+ });
29
+ }
30
+ const only = ctx.registry.resolve();
31
+ if (!only)
32
+ throw new ToolExecutionError({ code: ToolErrorCode.MODEL_NOT_FOUND, message: 'No model available.' });
33
+ return only;
34
+ }
35
+ export function okResult(text, structured) {
36
+ const content = [{ type: 'text', text }];
37
+ if (structured) {
38
+ return { content, structuredContent: structured };
39
+ }
40
+ return { content };
41
+ }
42
+ export function fmtCount(n, singular, plural) {
43
+ if (n === 1)
44
+ return `1 ${singular}`;
45
+ return `${n.toLocaleString()} ${plural ?? singular + 's'}`;
46
+ }
47
+ /** Slice a large array down to `limit` and return `{ items, truncated }`. */
48
+ export function paginate(items, limit, offset = 0) {
49
+ const total = items.length;
50
+ const slice = items.slice(offset, offset + limit);
51
+ return { items: slice, truncated: offset + limit < total, total };
52
+ }
53
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/tools/util.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAY/D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,OAAgB;IAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,kBAAkB,CAAC;YAC3B,IAAI,EAAE,aAAa,CAAC,eAAe;YACnC,OAAO,EAAE,iFAAiF;SAC3F,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,kBAAkB,CAAC;gBAC3B,IAAI,EAAE,aAAa,CAAC,eAAe;gBACnC,OAAO,EAAE,UAAU,OAAO,eAAe;gBACzC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;aAC7D,CAAC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,kBAAkB,CAAC;YAC3B,IAAI,EAAE,aAAa,CAAC,cAAc;YAClC,OAAO,EAAE,sDAAsD;YAC/D,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;SAC7D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,kBAAkB,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,eAAe,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACjH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,UAAoC;IACzE,MAAM,OAAO,GAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,QAAgB,EAAE,MAAe;IACnE,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,QAAQ,EAAE,CAAC;IACpC,OAAO,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,MAAM,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;AAC7D,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,QAAQ,CAAI,KAAU,EAAE,KAAa,EAAE,MAAM,GAAG,CAAC;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const validationTools: Tool[];
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA4PvC,eAAO,MAAM,eAAe,EAAE,IAAI,EAAwD,CAAC"}
@@ -0,0 +1,244 @@
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
+ * Validation tools (spec §7.4): IDS, audit, gherkin.
6
+ *
7
+ * IDS validation pulls in the buildingSMART rule engine via @ifc-lite/ids.
8
+ * model_audit produces a Lighthouse-style health score per category.
9
+ * gherkin_check is stubbed (UNSUPPORTED_OPERATION) until the bSI Gherkin
10
+ * engine ships into the workspace.
11
+ */
12
+ import { readFile } from 'node:fs/promises';
13
+ import { resolve } from 'node:path';
14
+ import { parseIDS, validateIDS } from '@ifc-lite/ids';
15
+ import { getInheritanceChainForEntity } from '@ifc-lite/parser';
16
+ import { EntityNode } from '@ifc-lite/query';
17
+ import { okResult, resolveModel } from './util.js';
18
+ import { ToolErrorCode, ToolExecutionError } from '../errors.js';
19
+ import { buildIdsAccessor } from './ids-accessor.js';
20
+ const idsValidate = {
21
+ name: 'ids_validate',
22
+ description: 'Run an IDS rule set against the model. Either pass `ids_xml` inline or `ids_path` to read from disk.',
23
+ scope: 'validate',
24
+ inputSchema: {
25
+ type: 'object',
26
+ properties: {
27
+ model_id: { type: 'string' },
28
+ ids_xml: { type: 'string', description: 'Inline IDS XML content.' },
29
+ ids_path: { type: 'string', description: 'Path to .ids file (subject to allowedPaths).' },
30
+ locale: { type: 'string', enum: ['en', 'de', 'fr'], default: 'en' },
31
+ },
32
+ additionalProperties: false,
33
+ },
34
+ async handler(input, ctx) {
35
+ const m = resolveModel(ctx, input.model_id);
36
+ const xml = await loadIdsXml(input, ctx.config.allowedPaths);
37
+ const idsDoc = parseIDS(xml);
38
+ const accessor = buildIdsAccessor(m.store);
39
+ const report = await validateIDS(idsDoc, accessor, { modelId: m.id, schemaVersion: m.store.schemaVersion, entityCount: m.store.entityCount }, {
40
+ onProgress: (p) => {
41
+ ctx.progress.report(p.percentage / 100, `Validating ${p.phase} (${p.specificationIndex + 1}/${p.totalSpecifications})`, 100);
42
+ },
43
+ });
44
+ void input.locale;
45
+ const summary = summarizeIdsReport(report);
46
+ return okResult(`IDS: ${summary.passedSpecifications}/${summary.totalSpecifications} specs passed; ${summary.failedEntities} entity failures.`, { summary, report });
47
+ },
48
+ };
49
+ /**
50
+ * Resolve IDS source from `ids_xml` (inline) or `ids_path` (disk),
51
+ * enforcing the optional `allowedPaths` allowlist on disk reads. Shared by
52
+ * `ids_validate` and `ids_explain` so both tools apply identical guards;
53
+ * the previous arrangement let `ids_explain` read arbitrary paths in
54
+ * restricted stdio deployments.
55
+ */
56
+ async function loadIdsXml(input, allowedPaths) {
57
+ if (typeof input.ids_xml === 'string')
58
+ return input.ids_xml;
59
+ if (typeof input.ids_path === 'string') {
60
+ const abs = resolve(input.ids_path);
61
+ if (allowedPaths && allowedPaths.length > 0) {
62
+ const ok = allowedPaths.some((p) => abs === p || abs.startsWith(p + '/'));
63
+ if (!ok) {
64
+ throw new ToolExecutionError({
65
+ code: ToolErrorCode.PERMISSION_DENIED,
66
+ message: `Path '${abs}' outside allowed roots`,
67
+ });
68
+ }
69
+ }
70
+ return readFile(abs, 'utf-8');
71
+ }
72
+ throw new ToolExecutionError({
73
+ code: ToolErrorCode.INVALID_INPUT,
74
+ message: 'Provide ids_xml or ids_path.',
75
+ });
76
+ }
77
+ function summarizeIdsReport(report) {
78
+ const r = report;
79
+ const specs = r.specificationResults ?? [];
80
+ let totalEntities = 0;
81
+ let passedEntities = 0;
82
+ let passedSpecifications = 0;
83
+ for (const spec of specs) {
84
+ const ents = spec.entityResults ?? [];
85
+ let specPassed = ents.length > 0;
86
+ for (const e of ents) {
87
+ totalEntities++;
88
+ if (e.passed)
89
+ passedEntities++;
90
+ else
91
+ specPassed = false;
92
+ }
93
+ if (specPassed)
94
+ passedSpecifications++;
95
+ }
96
+ return {
97
+ totalSpecifications: specs.length,
98
+ passedSpecifications,
99
+ failedSpecifications: specs.length - passedSpecifications,
100
+ totalEntities,
101
+ passedEntities,
102
+ failedEntities: totalEntities - passedEntities,
103
+ };
104
+ }
105
+ const idsExplain = {
106
+ name: 'ids_explain',
107
+ description: 'Produce a natural-language explanation of a single IDS specification (applicability + requirements).',
108
+ scope: 'read',
109
+ inputSchema: {
110
+ type: 'object',
111
+ properties: {
112
+ ids_xml: { type: 'string' },
113
+ ids_path: { type: 'string' },
114
+ spec_name: { type: 'string', description: 'Name of the specification to explain.' },
115
+ },
116
+ additionalProperties: false,
117
+ },
118
+ async handler(input, ctx) {
119
+ const xml = await loadIdsXml(input, ctx.config.allowedPaths);
120
+ const doc = parseIDS(xml);
121
+ const target = input.spec_name;
122
+ const specs = target ? (doc.specifications ?? []).filter((s) => s.name === target) : (doc.specifications ?? []);
123
+ if (specs.length === 0) {
124
+ throw new ToolExecutionError({
125
+ code: ToolErrorCode.INVALID_INPUT,
126
+ message: `Specification '${target}' not found in IDS document.`,
127
+ });
128
+ }
129
+ const explanations = specs.map((s) => ({
130
+ name: s.name,
131
+ applicability: s.applicability,
132
+ requirements: s.requirements,
133
+ }));
134
+ ctx.log.log('debug', 'ids_explain', { count: explanations.length });
135
+ return okResult(`Loaded ${explanations.length} specification(s).`, { specifications: explanations });
136
+ },
137
+ };
138
+ const modelAudit = {
139
+ name: 'model_audit',
140
+ description: 'Comprehensive model health check: required entities, GlobalId uniqueness, orphan detection, naming conventions, broken relationships. Returns Lighthouse-style scores per category.',
141
+ scope: 'validate',
142
+ inputSchema: {
143
+ type: 'object',
144
+ properties: { model_id: { type: 'string' } },
145
+ additionalProperties: false,
146
+ },
147
+ handler(input, ctx) {
148
+ const m = resolveModel(ctx, input.model_id);
149
+ const issues = [];
150
+ // 1. Required spatial entities
151
+ for (const t of ['IFCPROJECT', 'IFCSITE', 'IFCBUILDING']) {
152
+ const ids = m.store.entityIndex.byType.get(t) ?? [];
153
+ if (ids.length === 0) {
154
+ issues.push({ severity: 'error', category: 'structure', rule: 'required-entity', message: `Missing required entity ${t}` });
155
+ }
156
+ else if (t === 'IFCPROJECT' && ids.length > 1) {
157
+ issues.push({ severity: 'error', category: 'structure', rule: 'single-project', message: `Multiple IfcProject entities (${ids.length})` });
158
+ }
159
+ }
160
+ const storeyIds = m.store.entityIndex.byType.get('IFCBUILDINGSTOREY') ?? [];
161
+ if (storeyIds.length === 0)
162
+ issues.push({ severity: 'warning', category: 'structure', rule: 'has-storeys', message: 'No IfcBuildingStorey entities' });
163
+ // 2. GlobalId uniqueness (only IfcRoot subtypes)
164
+ const seen = new Map();
165
+ for (const [type, ids] of m.store.entityIndex.byType) {
166
+ const chain = getInheritanceChainForEntity(type);
167
+ if (!chain.includes('IfcRoot'))
168
+ continue;
169
+ for (const id of ids) {
170
+ const node = new EntityNode(m.store, id);
171
+ const gid = node.globalId;
172
+ if (!gid)
173
+ continue;
174
+ const list = seen.get(gid) ?? [];
175
+ list.push(id);
176
+ seen.set(gid, list);
177
+ }
178
+ }
179
+ let duplicates = 0;
180
+ for (const [gid, ids] of seen) {
181
+ if (ids.length > 1) {
182
+ duplicates++;
183
+ issues.push({ severity: 'error', category: 'identity', rule: 'duplicate-globalid', message: `Duplicate GlobalId ${gid} on ${ids.length} entities` });
184
+ }
185
+ }
186
+ // 3. Naming
187
+ let unnamed = 0;
188
+ let totalProducts = 0;
189
+ for (const [type, ids] of m.store.entityIndex.byType) {
190
+ if (!type.startsWith('IFC'))
191
+ continue;
192
+ if (type.startsWith('IFCREL'))
193
+ continue;
194
+ if (type.startsWith('IFCPROPERTY'))
195
+ continue;
196
+ for (const id of ids) {
197
+ totalProducts++;
198
+ const node = new EntityNode(m.store, id);
199
+ if (!node.name || node.name.trim() === '')
200
+ unnamed++;
201
+ }
202
+ }
203
+ if (unnamed > 0) {
204
+ issues.push({
205
+ severity: 'warning', category: 'data-quality', rule: 'has-name', entityCount: unnamed,
206
+ message: `${unnamed.toLocaleString()} of ${totalProducts.toLocaleString()} entities have no Name attribute.`,
207
+ });
208
+ }
209
+ // Lighthouse-style category scores: % of entities that pass each category check.
210
+ const scores = {
211
+ structure: scoreFromIssues(issues, 'structure'),
212
+ identity: 100 - clamp(duplicates * 10),
213
+ dataQuality: totalProducts === 0 ? 100 : Math.round(((totalProducts - unnamed) / totalProducts) * 100),
214
+ };
215
+ const overall = Math.round((scores.structure + scores.identity + scores.dataQuality) / 3);
216
+ return okResult(`Audit score: ${overall}/100 (${issues.length} issue${issues.length === 1 ? '' : 's'}).`, { overall, scores, issues, totals: { products: totalProducts, unnamed, duplicateGlobalIds: duplicates } });
217
+ },
218
+ };
219
+ function scoreFromIssues(issues, cat) {
220
+ const errs = issues.filter((i) => i.category === cat && i.severity === 'error').length;
221
+ const warns = issues.filter((i) => i.category === cat && i.severity === 'warning').length;
222
+ return clamp(100 - errs * 25 - warns * 10);
223
+ }
224
+ function clamp(v) {
225
+ return Math.max(0, Math.min(100, v));
226
+ }
227
+ const gherkinCheck = {
228
+ name: 'gherkin_check',
229
+ description: 'Run buildingSMART Gherkin validation rules. Not implemented in v0.1.',
230
+ scope: 'validate',
231
+ inputSchema: {
232
+ type: 'object',
233
+ properties: { model_id: { type: 'string' } },
234
+ additionalProperties: false,
235
+ },
236
+ handler() {
237
+ throw new ToolExecutionError({
238
+ code: ToolErrorCode.UNSUPPORTED_OPERATION,
239
+ message: 'gherkin_check is planned for v0.2; use ids_validate or model_audit.',
240
+ });
241
+ },
242
+ };
243
+ export const validationTools = [idsValidate, idsExplain, modelAudit, gherkinCheck];
244
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const viewerTools: Tool[];
3
+ //# sourceMappingURL=viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../src/tools/viewer.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA+oBvC,eAAO,MAAM,WAAW,EAAE,IAAI,EAkB7B,CAAC"}