cad-mcp-server 0.1.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 (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/THIRD_PARTY_NOTICES.md +20 -0
  4. package/dist/cad/compare.d.ts +31 -0
  5. package/dist/cad/compare.d.ts.map +1 -0
  6. package/dist/cad/compare.js +51 -0
  7. package/dist/cad/compare.js.map +1 -0
  8. package/dist/cad/model-store.d.ts +52 -0
  9. package/dist/cad/model-store.d.ts.map +1 -0
  10. package/dist/cad/model-store.js +227 -0
  11. package/dist/cad/model-store.js.map +1 -0
  12. package/dist/cad/query/edges.d.ts +6 -0
  13. package/dist/cad/query/edges.d.ts.map +1 -0
  14. package/dist/cad/query/edges.js +257 -0
  15. package/dist/cad/query/edges.js.map +1 -0
  16. package/dist/cad/query/entities.d.ts +4 -0
  17. package/dist/cad/query/entities.d.ts.map +1 -0
  18. package/dist/cad/query/entities.js +185 -0
  19. package/dist/cad/query/entities.js.map +1 -0
  20. package/dist/cad/query/faces.d.ts +6 -0
  21. package/dist/cad/query/faces.d.ts.map +1 -0
  22. package/dist/cad/query/faces.js +305 -0
  23. package/dist/cad/query/faces.js.map +1 -0
  24. package/dist/cad/query/pmi.d.ts +3 -0
  25. package/dist/cad/query/pmi.d.ts.map +1 -0
  26. package/dist/cad/query/pmi.js +141 -0
  27. package/dist/cad/query/pmi.js.map +1 -0
  28. package/dist/cad/query/shared.d.ts +74 -0
  29. package/dist/cad/query/shared.d.ts.map +1 -0
  30. package/dist/cad/query/shared.js +181 -0
  31. package/dist/cad/query/shared.js.map +1 -0
  32. package/dist/cad/schema-version.d.ts +2 -0
  33. package/dist/cad/schema-version.d.ts.map +1 -0
  34. package/dist/cad/schema-version.js +2 -0
  35. package/dist/cad/schema-version.js.map +1 -0
  36. package/dist/compare.d.ts +31 -0
  37. package/dist/compare.d.ts.map +1 -0
  38. package/dist/compare.js +51 -0
  39. package/dist/compare.js.map +1 -0
  40. package/dist/index.d.ts +17 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +113 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/kernel/aag-utils.d.ts +7 -0
  45. package/dist/kernel/aag-utils.d.ts.map +1 -0
  46. package/dist/kernel/aag-utils.js +54 -0
  47. package/dist/kernel/aag-utils.js.map +1 -0
  48. package/dist/kernel/import.d.ts +4 -0
  49. package/dist/kernel/import.d.ts.map +1 -0
  50. package/dist/kernel/import.js +25 -0
  51. package/dist/kernel/import.js.map +1 -0
  52. package/dist/kernel/kernel.d.ts +3 -0
  53. package/dist/kernel/kernel.d.ts.map +1 -0
  54. package/dist/kernel/kernel.js +7 -0
  55. package/dist/kernel/kernel.js.map +1 -0
  56. package/dist/kernel/measure.d.ts +6 -0
  57. package/dist/kernel/measure.d.ts.map +1 -0
  58. package/dist/kernel/measure.js +23 -0
  59. package/dist/kernel/measure.js.map +1 -0
  60. package/dist/kernel/query-entities.d.ts +75 -0
  61. package/dist/kernel/query-entities.d.ts.map +1 -0
  62. package/dist/kernel/query-entities.js +190 -0
  63. package/dist/kernel/query-entities.js.map +1 -0
  64. package/dist/kernel/topology.d.ts +4 -0
  65. package/dist/kernel/topology.d.ts.map +1 -0
  66. package/dist/kernel/topology.js +48 -0
  67. package/dist/kernel/topology.js.map +1 -0
  68. package/dist/model-store.d.ts +52 -0
  69. package/dist/model-store.d.ts.map +1 -0
  70. package/dist/model-store.js +227 -0
  71. package/dist/model-store.js.map +1 -0
  72. package/dist/pmi/metadata.d.ts +15 -0
  73. package/dist/pmi/metadata.d.ts.map +1 -0
  74. package/dist/pmi/metadata.js +93 -0
  75. package/dist/pmi/metadata.js.map +1 -0
  76. package/dist/pmi/parser.d.ts +46 -0
  77. package/dist/pmi/parser.d.ts.map +1 -0
  78. package/dist/pmi/parser.js +400 -0
  79. package/dist/pmi/parser.js.map +1 -0
  80. package/dist/pmi/semantic-provider.d.ts +7 -0
  81. package/dist/pmi/semantic-provider.d.ts.map +1 -0
  82. package/dist/pmi/semantic-provider.js +96 -0
  83. package/dist/pmi/semantic-provider.js.map +1 -0
  84. package/dist/providers/brep.d.ts +39 -0
  85. package/dist/providers/brep.d.ts.map +1 -0
  86. package/dist/providers/brep.js +2 -0
  87. package/dist/providers/brep.js.map +1 -0
  88. package/dist/providers/lightweight-step/metadata.d.ts +15 -0
  89. package/dist/providers/lightweight-step/metadata.d.ts.map +1 -0
  90. package/dist/providers/lightweight-step/metadata.js +93 -0
  91. package/dist/providers/lightweight-step/metadata.js.map +1 -0
  92. package/dist/providers/lightweight-step/pmi-parser.d.ts +46 -0
  93. package/dist/providers/lightweight-step/pmi-parser.d.ts.map +1 -0
  94. package/dist/providers/lightweight-step/pmi-parser.js +400 -0
  95. package/dist/providers/lightweight-step/pmi-parser.js.map +1 -0
  96. package/dist/providers/lightweight-step/semantic-provider.d.ts +7 -0
  97. package/dist/providers/lightweight-step/semantic-provider.d.ts.map +1 -0
  98. package/dist/providers/lightweight-step/semantic-provider.js +96 -0
  99. package/dist/providers/lightweight-step/semantic-provider.js.map +1 -0
  100. package/dist/providers/occt-wasm/aag-utils.d.ts +7 -0
  101. package/dist/providers/occt-wasm/aag-utils.d.ts.map +1 -0
  102. package/dist/providers/occt-wasm/aag-utils.js +54 -0
  103. package/dist/providers/occt-wasm/aag-utils.js.map +1 -0
  104. package/dist/providers/occt-wasm/import.d.ts +4 -0
  105. package/dist/providers/occt-wasm/import.d.ts.map +1 -0
  106. package/dist/providers/occt-wasm/import.js +25 -0
  107. package/dist/providers/occt-wasm/import.js.map +1 -0
  108. package/dist/providers/occt-wasm/kernel.d.ts +3 -0
  109. package/dist/providers/occt-wasm/kernel.d.ts.map +1 -0
  110. package/dist/providers/occt-wasm/kernel.js +7 -0
  111. package/dist/providers/occt-wasm/kernel.js.map +1 -0
  112. package/dist/providers/occt-wasm/measure.d.ts +6 -0
  113. package/dist/providers/occt-wasm/measure.d.ts.map +1 -0
  114. package/dist/providers/occt-wasm/measure.js +23 -0
  115. package/dist/providers/occt-wasm/measure.js.map +1 -0
  116. package/dist/providers/occt-wasm/query-entities.d.ts +71 -0
  117. package/dist/providers/occt-wasm/query-entities.d.ts.map +1 -0
  118. package/dist/providers/occt-wasm/query-entities.js +177 -0
  119. package/dist/providers/occt-wasm/query-entities.js.map +1 -0
  120. package/dist/providers/occt-wasm/topology.d.ts +4 -0
  121. package/dist/providers/occt-wasm/topology.d.ts.map +1 -0
  122. package/dist/providers/occt-wasm/topology.js +48 -0
  123. package/dist/providers/occt-wasm/topology.js.map +1 -0
  124. package/dist/providers/schema.d.ts +50 -0
  125. package/dist/providers/schema.d.ts.map +1 -0
  126. package/dist/providers/schema.js +2 -0
  127. package/dist/providers/schema.js.map +1 -0
  128. package/dist/providers/semantic.d.ts +34 -0
  129. package/dist/providers/semantic.d.ts.map +1 -0
  130. package/dist/providers/semantic.js +2 -0
  131. package/dist/providers/semantic.js.map +1 -0
  132. package/dist/query/edges.d.ts +6 -0
  133. package/dist/query/edges.d.ts.map +1 -0
  134. package/dist/query/edges.js +257 -0
  135. package/dist/query/edges.js.map +1 -0
  136. package/dist/query/entities.d.ts +4 -0
  137. package/dist/query/entities.d.ts.map +1 -0
  138. package/dist/query/entities.js +203 -0
  139. package/dist/query/entities.js.map +1 -0
  140. package/dist/query/faces.d.ts +6 -0
  141. package/dist/query/faces.d.ts.map +1 -0
  142. package/dist/query/faces.js +309 -0
  143. package/dist/query/faces.js.map +1 -0
  144. package/dist/query/pmi.d.ts +3 -0
  145. package/dist/query/pmi.d.ts.map +1 -0
  146. package/dist/query/pmi.js +141 -0
  147. package/dist/query/pmi.js.map +1 -0
  148. package/dist/query/shared.d.ts +74 -0
  149. package/dist/query/shared.d.ts.map +1 -0
  150. package/dist/query/shared.js +181 -0
  151. package/dist/query/shared.js.map +1 -0
  152. package/dist/schema-version.d.ts +2 -0
  153. package/dist/schema-version.d.ts.map +1 -0
  154. package/dist/schema-version.js +2 -0
  155. package/dist/schema-version.js.map +1 -0
  156. package/dist/tools/shared.d.ts +11 -0
  157. package/dist/tools/shared.d.ts.map +1 -0
  158. package/dist/tools/shared.js +19 -0
  159. package/dist/tools/shared.js.map +1 -0
  160. package/dist/tools/step-tools.d.ts +758 -0
  161. package/dist/tools/step-tools.d.ts.map +1 -0
  162. package/dist/tools/step-tools.js +836 -0
  163. package/dist/tools/step-tools.js.map +1 -0
  164. package/dist/types/brep.d.ts +39 -0
  165. package/dist/types/brep.d.ts.map +1 -0
  166. package/dist/types/brep.js +2 -0
  167. package/dist/types/brep.js.map +1 -0
  168. package/dist/types/schema.d.ts +50 -0
  169. package/dist/types/schema.d.ts.map +1 -0
  170. package/dist/types/schema.js +2 -0
  171. package/dist/types/schema.js.map +1 -0
  172. package/dist/types/semantic.d.ts +34 -0
  173. package/dist/types/semantic.d.ts.map +1 -0
  174. package/dist/types/semantic.js +2 -0
  175. package/dist/types/semantic.js.map +1 -0
  176. package/dist/utils/errors.d.ts +7 -0
  177. package/dist/utils/errors.d.ts.map +1 -0
  178. package/dist/utils/errors.js +7 -0
  179. package/dist/utils/errors.js.map +1 -0
  180. package/dist/utils/ids.d.ts +2 -0
  181. package/dist/utils/ids.d.ts.map +1 -0
  182. package/dist/utils/ids.js +4 -0
  183. package/dist/utils/ids.js.map +1 -0
  184. package/dist/utils/numbers.d.ts +11 -0
  185. package/dist/utils/numbers.d.ts.map +1 -0
  186. package/dist/utils/numbers.js +15 -0
  187. package/dist/utils/numbers.js.map +1 -0
  188. package/dist/utils/vectors.d.ts +4 -0
  189. package/dist/utils/vectors.d.ts.map +1 -0
  190. package/dist/utils/vectors.js +14 -0
  191. package/dist/utils/vectors.js.map +1 -0
  192. package/docs/EXAMPLE_PROMPTS.md +61 -0
  193. package/node_modules/occt-wasm/dist/index.d.ts +303 -0
  194. package/node_modules/occt-wasm/dist/index.d.ts.map +1 -0
  195. package/node_modules/occt-wasm/dist/index.js +1125 -0
  196. package/node_modules/occt-wasm/dist/index.js.map +1 -0
  197. package/node_modules/occt-wasm/dist/occt-wasm.js +2 -0
  198. package/node_modules/occt-wasm/dist/occt-wasm.wasm +0 -0
  199. package/node_modules/occt-wasm/dist/raw-types.d.ts +229 -0
  200. package/node_modules/occt-wasm/dist/raw-types.d.ts.map +1 -0
  201. package/node_modules/occt-wasm/dist/raw-types.js +8 -0
  202. package/node_modules/occt-wasm/dist/raw-types.js.map +1 -0
  203. package/node_modules/occt-wasm/dist/types.d.ts +223 -0
  204. package/node_modules/occt-wasm/dist/types.d.ts.map +1 -0
  205. package/node_modules/occt-wasm/dist/types.js +129 -0
  206. package/node_modules/occt-wasm/dist/types.js.map +1 -0
  207. package/node_modules/occt-wasm/package.json +44 -0
  208. package/package.json +102 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Matt Mohandiss
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # CAD MCP Server
2
+
3
+ [![npm version](https://img.shields.io/npm/v/cad-mcp-server?logo=npm)](https://npmjs.com/package/cad-mcp-server)
4
+ [![License](https://img.shields.io/npm/l/cad-mcp-server)](LICENSE)
5
+ [![Node version](https://img.shields.io/node/v/cad-mcp-server?logo=node.js)](package.json)
6
+ [![npm downloads](https://img.shields.io/npm/dm/cad-mcp-server)](https://npmjs.com/package/cad-mcp-server)
7
+
8
+ **AI-native CAD inspection, no CAD license required.** CAD MCP Server bundles a WebAssembly Open CASCADE kernel so LLM tools can read, measure, and compare STEP files locally. The server returns measured facts; your AI assistant interprets engineering meaning.
9
+
10
+ ## Quick Start
11
+
12
+ ```bash
13
+ npx -y cad-mcp-server
14
+ ```
15
+
16
+ Add this to your MCP client config (Claude Desktop, OpenCode, Cursor, etc.):
17
+
18
+ ```json
19
+ {
20
+ "mcpServers": {
21
+ "cad": {
22
+ "command": "npx",
23
+ "args": ["-y", "cad-mcp-server"]
24
+ }
25
+ }
26
+ }
27
+ ```
28
+
29
+ Point the AI at any STEP or STP file on your local filesystem.
30
+
31
+ ## Use Cases
32
+
33
+ | Who | What they ask |
34
+ |---|---|
35
+ | **Mechanical lead** | "Review this STEP file like a mechanical lead before release. What are the top design or manufacturing risks?" |
36
+ | **Manufacturing engineer** | "Build a first-pass CNC plan: likely setups, drilling directions, and cost-driving features." |
37
+ | **QC engineer** | "Create an inspection plan from the STEP file. What should we measure? What's missing?" |
38
+ | **Procurement / sourcing** | "Prepare an RFQ summary: part count, envelope, complexity drivers, and questions the supplier will ask." |
39
+ | **Design engineer (revision)** | "Compare Rev A and Rev B as an ECO review. What changed? What should be rechecked?" |
40
+ | **Hobbyist / maker** | "Can these parts fit on a 200 x 200 x 300 mm printer? What needs splitting or reorientation?" |
41
+
42
+ ## MCP Tools
43
+
44
+ | Tool | Purpose |
45
+ |---|---|
46
+ | `inspect_step_file` | Fast first-pass overview: validity, size, bodies, topology counts, metadata. |
47
+ | `find_step_faces` | Search B-rep faces by surface type, area, normal, body, grouping, and sort. |
48
+ | `find_step_edges` | Search B-rep edges by curve type, length, radius, body, grouping, and sort. |
49
+ | `get_step_entities` | Retrieve known face or edge IDs with requested fields. |
50
+ | `query_step_pmi` | Query lightweight PMI/GD&T, dimensions, datums, and annotations. |
51
+ | `compare_step_files` | Compare two STEP files by whole-model geometry, topology, and metadata. |
52
+
53
+ **Recommended workflow:** `inspect` first, drill into groups or summaries, ask for specific entity IDs, then request adjacency or exact fields only where needed.
54
+
55
+ ## How It Works
56
+
57
+ STEP files are parsed locally by a stripped Open CASCADE Technology (OCCT) kernel compiled to WebAssembly. No data leaves your machine. No Docker, no cloud API, no CAD vendor dependency. The package bundles everything — just `npx` and go.
58
+
59
+ ## Why CAD MCP Server?
60
+
61
+ - **Zero install friction.** One `npx` command, no native CAD software, no licenses.
62
+ - **Read-only by design.** The server measures geometry; the AI interprets meaning. No risk of accidental edits.
63
+ - **Local-first.** All processing stays on your machine. STEP files never leave your filesystem.
64
+ - **WASM-speed.** OCCT runs at near-native speed in a bundled WebAssembly kernel.
65
+ - **LLM-native output.** Results are structured JSON designed for AI consumption, not human eyeballs.
66
+
67
+ ## What It Is Not
68
+
69
+ - Not a CAD editor — no geometry creation or modification.
70
+ - Not a CAM system — no toolpath generation.
71
+ - Not a manufacturability certifier — it provides evidence, not conclusions.
72
+ - Not an AP242 PMI engine — PMI hints are lightweight and heuristic-based.
73
+ - Not a feature-tree recovery tool — STEP is a boundary-representation format.
74
+
75
+ Good AI answers separate measured facts, assumptions, and recommendations.
76
+
77
+ ## Roadmap
78
+
79
+ - **v0.2** — Advanced face adjacency graphs, edge-vexity classification, larger file support.
80
+ - **v0.3** — Assembly hierarchy traversal, color/layer metadata, improved PMI coverage.
81
+ - **v1.0** — Stable tool surface, first-semver API guarantees.
82
+
83
+ Interested in hosted or enterprise features? Let us know via [GitHub Discussions](https://github.com/mattmohandiss/cad-mcp-server/discussions).
84
+
85
+ ## Requirements
86
+
87
+ - Node.js 22 or newer
88
+ - Local access to STEP/STP files
89
+
90
+ No Docker, Open CASCADE install, or native CAD application required.
91
+
92
+ ## Distribution
93
+
94
+ The npm package includes:
95
+ - MCP server JavaScript in `dist/`
96
+ - Bundled `occt-wasm` package with optimized `occt-wasm.wasm` geometry kernel
97
+ - TypeScript declarations for published runtime files
98
+
99
+ ## Contributing
100
+
101
+ Contributions welcome. See the [GitHub repo](https://github.com/mattmohandiss/cad-mcp-server) for issues and discussions.
102
+
103
+ ## License
104
+
105
+ This project is **MIT licensed** — free for all uses, commercial included.
106
+
107
+ The bundled `occt-wasm` backend uses Open CASCADE Technology (LGPL-2.1). Review the [third-party notices](THIRD_PARTY_NOTICES.md) before redistributing modified kernel builds.
108
+
109
+ ## Support
110
+
111
+ If CAD MCP Server saves you time, consider [sponsoring](https://github.com/sponsors/mattmohandiss) development.
@@ -0,0 +1,20 @@
1
+ # Third-Party Notices
2
+
3
+ CAD MCP Server bundles a WebAssembly geometry kernel built from Open CASCADE Technology through the local `occt-wasm` package.
4
+
5
+ ## Open CASCADE Technology
6
+
7
+ - Project: Open CASCADE Technology
8
+ - Website: https://dev.opencascade.org/
9
+ - License: GNU Lesser General Public License version 2.1
10
+
11
+ Open CASCADE Technology is used for STEP import and geometric/topological measurement. The bundled WebAssembly artifact is distributed as part of the `occt-wasm` runtime included in this npm package.
12
+
13
+ ## occt-wasm
14
+
15
+ - Package: `occt-wasm`
16
+ - License: MIT OR Apache-2.0
17
+
18
+ This project uses a stripped local build of `occt-wasm` focused on read-only STEP inspection.
19
+
20
+ Review the upstream license terms before redistributing modified kernel builds or embedding this package in another commercial distribution.
@@ -0,0 +1,31 @@
1
+ export declare function compareStepFiles(fileA: string, fileB: string): Promise<{
2
+ schema_version: "0.4";
3
+ files: {
4
+ a: string;
5
+ b: string;
6
+ };
7
+ deltas: {
8
+ dimensions: {
9
+ width: number;
10
+ height: number;
11
+ depth: number;
12
+ };
13
+ volume: number;
14
+ surfaceArea: number;
15
+ bodyCount: number;
16
+ faceCount: number | undefined;
17
+ edgeCount: number | undefined;
18
+ };
19
+ exchange: {
20
+ schemaChanged: boolean;
21
+ productNamesA: string[];
22
+ productNamesB: string[];
23
+ };
24
+ warnings: import("../providers/schema.js").Warning[];
25
+ limitations: import("../providers/schema.js").Limitation[];
26
+ providers: {
27
+ a: import("../providers/schema.js").ProviderInfo[];
28
+ b: import("../providers/schema.js").ProviderInfo[];
29
+ };
30
+ }>;
31
+ //# sourceMappingURL=compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/cad/compare.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDlE"}
@@ -0,0 +1,51 @@
1
+ import { withStepModel } from './model-store.js';
2
+ import { CAD_RESPONSE_SCHEMA_VERSION } from './schema-version.js';
3
+ export async function compareStepFiles(fileA, fileB) {
4
+ return withStepModel(fileA, async (modelA) => withStepModel(fileB, async (modelB) => {
5
+ const [brepA, brepB, semanticA, semanticB] = await Promise.all([
6
+ modelA.getBRepModel(),
7
+ modelB.getBRepModel(),
8
+ modelA.getSemanticModel(),
9
+ modelB.getSemanticModel(),
10
+ ]);
11
+ return {
12
+ schema_version: CAD_RESPONSE_SCHEMA_VERSION,
13
+ files: { a: fileA, b: fileB },
14
+ deltas: {
15
+ dimensions: {
16
+ width: brepB.dimensions.width - brepA.dimensions.width,
17
+ height: brepB.dimensions.height - brepA.dimensions.height,
18
+ depth: brepB.dimensions.depth - brepA.dimensions.depth,
19
+ },
20
+ volume: brepB.volume - brepA.volume,
21
+ surfaceArea: brepB.surfaceArea - brepA.surfaceArea,
22
+ bodyCount: brepB.bodyCount - brepA.bodyCount,
23
+ faceCount: brepB.faceCount !== undefined && brepA.faceCount !== undefined
24
+ ? brepB.faceCount - brepA.faceCount
25
+ : undefined,
26
+ edgeCount: brepB.edgeStatistics && brepA.edgeStatistics
27
+ ? brepB.edgeStatistics.count - brepA.edgeStatistics.count
28
+ : undefined,
29
+ },
30
+ exchange: {
31
+ schemaChanged: semanticA.schema !== semanticB.schema,
32
+ productNamesA: semanticA.productNames,
33
+ productNamesB: semanticB.productNames,
34
+ },
35
+ warnings: [...brepA.health.warnings, ...brepB.health.warnings],
36
+ limitations: [
37
+ ...semanticA.limitations,
38
+ ...semanticB.limitations,
39
+ {
40
+ source: 'compare_step_files',
41
+ message: 'Comparison uses metric and metadata deltas only; stable feature identity and adjacency across revisions are not inferred.',
42
+ },
43
+ ],
44
+ providers: {
45
+ a: [brepA.provider, semanticA.provider],
46
+ b: [brepB.provider, semanticB.provider],
47
+ },
48
+ };
49
+ }));
50
+ }
51
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/cad/compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,KAAa;IACjE,OAAO,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAC3C,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACpC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7D,MAAM,CAAC,YAAY,EAAE;YACrB,MAAM,CAAC,YAAY,EAAE;YACrB,MAAM,CAAC,gBAAgB,EAAE;YACzB,MAAM,CAAC,gBAAgB,EAAE;SAC1B,CAAC,CAAC;QAEH,OAAO;YACL,cAAc,EAAE,2BAA2B;YAC3C,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;YAC7B,MAAM,EAAE;gBACN,UAAU,EAAE;oBACV,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK;oBACtD,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM;oBACzD,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK;iBACvD;gBACD,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;gBACnC,WAAW,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;gBAClD,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;gBAC5C,SAAS,EACP,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;oBAC5D,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;oBACnC,CAAC,CAAC,SAAS;gBACf,SAAS,EACP,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc;oBAC1C,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK;oBACzD,CAAC,CAAC,SAAS;aAChB;YACD,QAAQ,EAAE;gBACR,aAAa,EAAE,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;gBACpD,aAAa,EAAE,SAAS,CAAC,YAAY;gBACrC,aAAa,EAAE,SAAS,CAAC,YAAY;aACtC;YACD,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC9D,WAAW,EAAE;gBACX,GAAG,SAAS,CAAC,WAAW;gBACxB,GAAG,SAAS,CAAC,WAAW;gBACxB;oBACE,MAAM,EAAE,oBAAoB;oBAC5B,OAAO,EACL,2HAA2H;iBAC9H;aACF;YACD,SAAS,EAAE;gBACT,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC;gBACvC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC;aACxC;SACF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { OcctKernel, ShapeHandle } from 'occt-wasm';
2
+ import type { BRepModel } from '../providers/brep.js';
3
+ import type { SemanticModel } from '../providers/semantic.js';
4
+ import type { PmiAnnotationEntity, PmiDatumEntity, PmiDimensionEntity, PmiToleranceEntity } from '../providers/lightweight-step/pmi-parser.js';
5
+ import { type ExtractedEdgeEntity, type ExtractedFaceEntity } from '../providers/occt-wasm/query-entities.js';
6
+ type PmiEntity = PmiToleranceEntity | PmiDimensionEntity | PmiDatumEntity | PmiAnnotationEntity;
7
+ interface FileKey {
8
+ requestedPath: string;
9
+ resolvedPath: string;
10
+ size: number;
11
+ mtimeMs: number;
12
+ }
13
+ interface ShapeContext {
14
+ kernel: OcctKernel;
15
+ shape: ShapeHandle;
16
+ }
17
+ declare class LoadedStepModel {
18
+ readonly requestedPath: string;
19
+ readonly resolvedPath: string;
20
+ readonly cacheKey: string;
21
+ lastAccess: number;
22
+ activeUsers: number;
23
+ private stepTextPromise?;
24
+ private shapePromise?;
25
+ private bodyMap?;
26
+ private faceEntities?;
27
+ private faceEntitiesWithBody?;
28
+ private edgeEntities?;
29
+ private edgeEntitiesWithBody?;
30
+ private brepPromise?;
31
+ private semanticPromise?;
32
+ private pmiPromise?;
33
+ constructor(fileKey: FileKey);
34
+ getShapeContext(action?: string): Promise<ShapeContext>;
35
+ getFaceEntities(includeBodyId: boolean): Promise<ExtractedFaceEntity[]>;
36
+ getEdgeEntities(includeBodyId: boolean): Promise<ExtractedEdgeEntity[]>;
37
+ getBRepModel(): Promise<BRepModel>;
38
+ getSemanticModel(): Promise<SemanticModel>;
39
+ getPmiEntities(): Promise<{
40
+ pmi_entities: PmiEntity[];
41
+ }>;
42
+ dispose(): void;
43
+ use<T>(run: (model: LoadedStepModel) => Promise<T>): Promise<T>;
44
+ private importShape;
45
+ private getStepText;
46
+ private shapeAndBodyMap;
47
+ private buildBRepModel;
48
+ }
49
+ export declare function getStepModel(filePath: string): Promise<LoadedStepModel>;
50
+ export declare function withStepModel<T>(filePath: string, run: (model: LoadedStepModel) => Promise<T>): Promise<T>;
51
+ export {};
52
+ //# sourceMappingURL=model-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-store.d.ts","sourceRoot":"","sources":["../../src/cad/model-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,6CAA6C,CAAC;AAOrD,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,MAAM,0CAA0C,CAAC;AAGlD,KAAK,SAAS,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAEhG,UAAU,OAAO;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;CACpB;AAID,cAAM,eAAe;IACnB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,UAAU,SAAc;IACxB,WAAW,SAAK;IAEhB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,YAAY,CAAC,CAAwB;IAC7C,OAAO,CAAC,OAAO,CAAC,CAA6C;IAC7D,OAAO,CAAC,YAAY,CAAC,CAAwB;IAC7C,OAAO,CAAC,oBAAoB,CAAC,CAAwB;IACrD,OAAO,CAAC,YAAY,CAAC,CAAwB;IAC7C,OAAO,CAAC,oBAAoB,CAAC,CAAwB;IACrD,OAAO,CAAC,WAAW,CAAC,CAAqB;IACzC,OAAO,CAAC,eAAe,CAAC,CAAyB;IACjD,OAAO,CAAC,UAAU,CAAC,CAAyC;gBAEhD,OAAO,EAAE,OAAO;IAMtB,eAAe,CAAC,MAAM,SAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAM9D,eAAe,CAAC,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAgBvE,eAAe,CAAC,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAgBvE,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAMlC,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAM1C,cAAc,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,SAAS,EAAE,CAAA;KAAE,CAAC;IAQ9D,OAAO,IAAI,IAAI;IAOT,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAUvD,WAAW;YAaX,WAAW;YAKX,eAAe;YAQf,cAAc;CAiD7B;AAqCD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAE7E;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1C,OAAO,CAAC,CAAC,CAAC,CAGZ"}
@@ -0,0 +1,227 @@
1
+ import { realpath, stat } from 'node:fs/promises';
2
+ import { extractPmiEntities } from '../providers/lightweight-step/pmi-parser.js';
3
+ import { LightweightStepSemanticProvider } from '../providers/lightweight-step/semantic-provider.js';
4
+ import { getOcctKernel } from '../providers/occt-wasm/kernel.js';
5
+ import { mapOcctError, readStepText } from '../providers/occt-wasm/import.js';
6
+ import { getDimensions, guessShapeClass, toBoundingBox } from '../providers/occt-wasm/measure.js';
7
+ import { getEdgeStatistics } from '../providers/occt-wasm/topology.js';
8
+ import { buildBodyMap, extractEdgeEntities, extractFaceEntities, } from '../providers/occt-wasm/query-entities.js';
9
+ import { makeId } from '../utils/ids.js';
10
+ const semanticProvider = new LightweightStepSemanticProvider();
11
+ class LoadedStepModel {
12
+ requestedPath;
13
+ resolvedPath;
14
+ cacheKey;
15
+ lastAccess = Date.now();
16
+ activeUsers = 0;
17
+ stepTextPromise;
18
+ shapePromise;
19
+ bodyMap;
20
+ faceEntities;
21
+ faceEntitiesWithBody;
22
+ edgeEntities;
23
+ edgeEntitiesWithBody;
24
+ brepPromise;
25
+ semanticPromise;
26
+ pmiPromise;
27
+ constructor(fileKey) {
28
+ this.requestedPath = fileKey.requestedPath;
29
+ this.resolvedPath = fileKey.resolvedPath;
30
+ this.cacheKey = `${fileKey.resolvedPath}:${fileKey.size}:${fileKey.mtimeMs}`;
31
+ }
32
+ async getShapeContext(action = 'STEP import') {
33
+ this.lastAccess = Date.now();
34
+ this.shapePromise ??= this.importShape(action);
35
+ return this.shapePromise;
36
+ }
37
+ async getFaceEntities(includeBodyId) {
38
+ this.lastAccess = Date.now();
39
+ if (includeBodyId) {
40
+ this.faceEntitiesWithBody ??= extractFaceEntities(...(await this.shapeAndBodyMap('query_step_faces')));
41
+ return this.faceEntitiesWithBody;
42
+ }
43
+ if (!this.faceEntities) {
44
+ const { kernel, shape } = await this.getShapeContext('query_step_faces');
45
+ this.faceEntities = extractFaceEntities(kernel, shape);
46
+ }
47
+ return this.faceEntities;
48
+ }
49
+ async getEdgeEntities(includeBodyId) {
50
+ this.lastAccess = Date.now();
51
+ if (includeBodyId) {
52
+ this.edgeEntitiesWithBody ??= extractEdgeEntities(...(await this.shapeAndBodyMap('query_step_edges')));
53
+ return this.edgeEntitiesWithBody;
54
+ }
55
+ if (!this.edgeEntities) {
56
+ const { kernel, shape } = await this.getShapeContext('query_step_edges');
57
+ this.edgeEntities = extractEdgeEntities(kernel, shape);
58
+ }
59
+ return this.edgeEntities;
60
+ }
61
+ async getBRepModel() {
62
+ this.lastAccess = Date.now();
63
+ this.brepPromise ??= this.buildBRepModel();
64
+ return this.brepPromise;
65
+ }
66
+ async getSemanticModel() {
67
+ this.lastAccess = Date.now();
68
+ this.semanticPromise ??= semanticProvider.extract(this.resolvedPath);
69
+ return this.semanticPromise;
70
+ }
71
+ async getPmiEntities() {
72
+ this.lastAccess = Date.now();
73
+ this.pmiPromise ??= extractPmiEntities(this.resolvedPath);
74
+ return this.pmiPromise;
75
+ }
76
+ dispose() {
77
+ if (!this.shapePromise)
78
+ return;
79
+ void this.shapePromise
80
+ .then(({ kernel, shape }) => kernel.release(shape))
81
+ .catch(() => undefined);
82
+ }
83
+ async use(run) {
84
+ this.activeUsers++;
85
+ try {
86
+ return await run(this);
87
+ }
88
+ finally {
89
+ this.activeUsers--;
90
+ this.lastAccess = Date.now();
91
+ }
92
+ }
93
+ async importShape(action) {
94
+ try {
95
+ const stepText = await this.getStepText();
96
+ const kernel = await getOcctKernel();
97
+ return { kernel, shape: kernel.importStep(stepText) };
98
+ }
99
+ catch (error) {
100
+ if (typeof error === 'object' && error !== null && 'type' in error && 'message' in error) {
101
+ throw error;
102
+ }
103
+ throw mapOcctError(error, action);
104
+ }
105
+ }
106
+ async getStepText() {
107
+ this.stepTextPromise ??= readStepText(this.resolvedPath);
108
+ return this.stepTextPromise;
109
+ }
110
+ async shapeAndBodyMap(action) {
111
+ const { kernel, shape } = await this.getShapeContext(action);
112
+ this.bodyMap ??= buildBodyMap(kernel, shape);
113
+ return [kernel, shape, this.bodyMap];
114
+ }
115
+ async buildBRepModel() {
116
+ const { kernel, shape } = await this.getShapeContext('STEP import');
117
+ const boundingBox = toBoundingBox(kernel, shape);
118
+ const dimensions = getDimensions(boundingBox);
119
+ const solids = kernel.getSubShapes(shape, 'solid');
120
+ const faces = kernel.getSubShapes(shape, 'face');
121
+ const bodyShapes = solids.length ? solids : [shape];
122
+ const bodies = bodyShapes.map((body, index) => {
123
+ const bodyBox = bodyShapes.length === 1 ? boundingBox : toBoundingBox(kernel, body);
124
+ return {
125
+ id: makeId('body', index),
126
+ index,
127
+ boundingBox: bodyBox,
128
+ dimensions: getDimensions(bodyBox),
129
+ volume: kernel.getVolume(body),
130
+ surfaceArea: kernel.getSurfaceArea(body),
131
+ };
132
+ });
133
+ return {
134
+ provider: {
135
+ name: 'occt-wasm',
136
+ capabilities: [
137
+ 'step_import',
138
+ 'body_metrics',
139
+ 'edge_statistics',
140
+ 'surface_types',
141
+ 'curve_types',
142
+ ],
143
+ limitations: [],
144
+ },
145
+ filePath: this.requestedPath,
146
+ units: { length: 'mm', area: 'mm^2', volume: 'mm^3' },
147
+ boundingBox,
148
+ dimensions,
149
+ volume: kernel.getVolume(shape),
150
+ surfaceArea: kernel.getSurfaceArea(shape),
151
+ bodyCount: bodies.length,
152
+ shapeType: guessShapeClass(dimensions),
153
+ faceCount: faces.length,
154
+ edgeStatistics: getEdgeStatistics(kernel, shape),
155
+ bodies,
156
+ health: {
157
+ isValid: safeIsValid(kernel, shape),
158
+ warnings: [],
159
+ },
160
+ provenance: [{ provider: 'occt-wasm', sourceId: 'brep:shape', method: 'measured' }],
161
+ };
162
+ }
163
+ }
164
+ class StepModelStore {
165
+ maxModels = 5;
166
+ models = new Map();
167
+ async get(filePath) {
168
+ const fileKey = await resolveFileKey(filePath);
169
+ const existing = this.models.get(fileKey.resolvedPath);
170
+ if (existing &&
171
+ existing.cacheKey === `${fileKey.resolvedPath}:${fileKey.size}:${fileKey.mtimeMs}`) {
172
+ existing.lastAccess = Date.now();
173
+ return existing;
174
+ }
175
+ existing?.dispose();
176
+ const model = new LoadedStepModel(fileKey);
177
+ this.models.set(fileKey.resolvedPath, model);
178
+ this.evictIfNeeded();
179
+ return model;
180
+ }
181
+ evictIfNeeded() {
182
+ if (this.models.size <= this.maxModels)
183
+ return;
184
+ const oldest = [...this.models.entries()]
185
+ .filter(([, model]) => model.activeUsers === 0)
186
+ .sort((a, b) => a[1].lastAccess - b[1].lastAccess)[0];
187
+ if (!oldest)
188
+ return;
189
+ oldest[1].dispose();
190
+ this.models.delete(oldest[0]);
191
+ }
192
+ }
193
+ const store = new StepModelStore();
194
+ export async function getStepModel(filePath) {
195
+ return store.get(filePath);
196
+ }
197
+ export async function withStepModel(filePath, run) {
198
+ const model = await store.get(filePath);
199
+ return model.use(run);
200
+ }
201
+ async function resolveFileKey(filePath) {
202
+ try {
203
+ const [resolvedPath, fileStat] = await Promise.all([realpath(filePath), stat(filePath)]);
204
+ return {
205
+ requestedPath: filePath,
206
+ resolvedPath,
207
+ size: fileStat.size,
208
+ mtimeMs: fileStat.mtimeMs,
209
+ };
210
+ }
211
+ catch (error) {
212
+ const message = error instanceof Error ? error.message : String(error);
213
+ throw {
214
+ type: 'file_not_found',
215
+ message: `File not found: ${filePath}. ${message}`,
216
+ };
217
+ }
218
+ }
219
+ function safeIsValid(kernel, shape) {
220
+ try {
221
+ return kernel.isValid(shape);
222
+ }
223
+ catch {
224
+ return undefined;
225
+ }
226
+ }
227
+ //# sourceMappingURL=model-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-store.js","sourceRoot":"","sources":["../../src/cad/model-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { QueryStepEdgesInput } from '../../tools/step-tools.js';
2
+ /**
3
+ * Query STEP file edges with filtering, sorting, and pagination.
4
+ */
5
+ export declare function queryStepEdges(filePath: string, input: QueryStepEdgesInput): Promise<import("../../tools/step-tools.js").StepQueryResponse<Record<string, unknown>>>;
6
+ //# sourceMappingURL=edges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edges.d.ts","sourceRoot":"","sources":["../../../src/cad/query/edges.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAarE;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,2FAkFhF"}