@vcad/mcp 0.10.0-main.125 → 0.10.0-main.127

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 (3) hide show
  1. package/README.md +1 -1
  2. package/index.mjs +65 -66
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -6,4 +6,4 @@ vcad's MCP server as a self-contained bundle (server + BRep kernel WASM).
6
6
  { "mcpServers": { "vcad": { "command": "npx", "args": ["-y", "@vcad/mcp"] } } }
7
7
  ```
8
8
 
9
- Built from 0faa082d15ca8fd803090dfc416f68c12b5a3971 at 2026-10-21T13:48:35.626Z. Source: https://github.com/ecto/vcad
9
+ Built from 29cbe4343d120465c4b5eda7f7ccfc72d65a2171 at 2026-10-21T14:37:18.317Z. Source: https://github.com/ecto/vcad
package/index.mjs CHANGED
@@ -12220,6 +12220,8 @@ var init_dist = __esm({
12220
12220
  importStepBufferWithReport: wasmModule7.importStepBufferWithReport,
12221
12221
  documentToStepBuffer: wasmModule7.documentToStepBuffer,
12222
12222
  registerStepSource: wasmModule7.registerStepSource,
12223
+ stepImportDocument: wasmModule7.stepImportDocument,
12224
+ importStepMeshDocument: wasmModule7.importStepMeshDocument,
12223
12225
  stepSourceRegistered: wasmModule7.stepSourceRegistered,
12224
12226
  unregisterStepSource: wasmModule7.unregisterStepSource,
12225
12227
  inspectDocumentFaces: wasmModule7.inspectDocumentFaces,
@@ -12774,6 +12776,28 @@ var init_dist = __esm({
12774
12776
  summary: result.summary
12775
12777
  };
12776
12778
  }
12779
+ /**
12780
+ * Build the document for a B-rep STEP import: one lazy `step_import` root
12781
+ * per solid index of the file registered under `path`, named `partName`
12782
+ * (or `partName_N` for several), in `material` (`vcad_eval::step_doc`).
12783
+ */
12784
+ stepImportDocument(path, solidIndices, partName, material) {
12785
+ if (typeof this.kernel.stepImportDocument !== "function") {
12786
+ throw new Error("stepImportDocument is not available - rebuild the kernel WASM");
12787
+ }
12788
+ return JSON.parse(this.kernel.stepImportDocument(path, Uint32Array.from(solidIndices), partName, material));
12789
+ }
12790
+ /**
12791
+ * Tessellated STEP import straight to a document (one `ImportedMesh` root
12792
+ * per body), built in the kernel. Throws when the file has no geometry.
12793
+ */
12794
+ importStepMeshDocument(data, partName, material, source) {
12795
+ if (typeof this.kernel.importStepMeshDocument !== "function") {
12796
+ throw new Error("importStepMeshDocument is not available - rebuild the kernel WASM");
12797
+ }
12798
+ const r = this.kernel.importStepMeshDocument(new Uint8Array(data), partName, material, source);
12799
+ return { ...r, document: JSON.parse(r.document) };
12800
+ }
12777
12801
  /**
12778
12802
  * Register STEP file contents so `step_import` nodes resolve to B-rep.
12779
12803
  *
@@ -41371,6 +41395,18 @@ var init_CHANGELOG = __esm({
41371
41395
  "render"
41372
41396
  ]
41373
41397
  },
41398
+ {
41399
+ id: "2026-10-21-mac-sim-teardown-race",
41400
+ version: "0.10.0",
41401
+ date: "2026-10-21",
41402
+ category: "fix",
41403
+ title: "Stopping a simulation no longer leaves a stale frame",
41404
+ summary: "In the Mac app, a physics frame already in flight when the simulation was torn down could repopulate its state; such frames are now dropped.",
41405
+ features: [
41406
+ "simulation",
41407
+ "mac"
41408
+ ]
41409
+ },
41374
41410
  {
41375
41411
  id: "2026-10-21-mac-open-vcode",
41376
41412
  version: "0.10.0",
@@ -41448,6 +41484,18 @@ var init_CHANGELOG = __esm({
41448
41484
  "ai"
41449
41485
  ]
41450
41486
  },
41487
+ {
41488
+ id: "2026-10-21-agent-nested-create",
41489
+ version: "0.10.0",
41490
+ date: "2026-10-21",
41491
+ category: "fix",
41492
+ title: "Agent accepts nested create calls",
41493
+ summary: "The Agent's create tool now accepts the nested argument shape models naturally emit, and repeat requests reuse the endpoint's prompt cache.",
41494
+ features: [
41495
+ "desktop",
41496
+ "agent"
41497
+ ]
41498
+ },
41451
41499
  {
41452
41500
  id: "2026-10-20-vendor-verified-power-imu-footprints",
41453
41501
  version: "0.10.0",
@@ -81044,30 +81092,6 @@ function readStepInput(input) {
81044
81092
  }
81045
81093
  return { bytes: readFileSync7(filepath), diskPath: resolve5(filepath) };
81046
81094
  }
81047
- function defaultMaterials() {
81048
- return {
81049
- steel: {
81050
- name: "Steel",
81051
- color: [0.6, 0.6, 0.65],
81052
- metallic: 0.9,
81053
- roughness: 0.3,
81054
- density: 7850
81055
- },
81056
- aluminum: {
81057
- name: "Aluminum",
81058
- color: [0.8, 0.8, 0.85],
81059
- metallic: 0.9,
81060
- roughness: 0.2,
81061
- density: 2700
81062
- },
81063
- default: {
81064
- name: "Default",
81065
- color: [0.8, 0.8, 0.8],
81066
- metallic: 0,
81067
- roughness: 0.5
81068
- }
81069
- };
81070
- }
81071
81095
  function skippedFaceSummary(report, warnings) {
81072
81096
  const skipped = report.reduce((sum, s) => sum + s.skipped_faces.length, 0);
81073
81097
  if (skipped === 0) return {};
@@ -81096,36 +81120,18 @@ function importStep(input, engine) {
81096
81120
  /\.(step|stp)$/i.test(sourceLabel) ? sourceLabel.slice(-5) : ""
81097
81121
  );
81098
81122
  const partMaterial = material ?? "steel";
81099
- const doc = createDocument();
81100
- doc.materials = defaultMaterials();
81101
- const addRoot = (nodeId, nodeName, op) => {
81102
- doc.nodes[String(nodeId)] = { id: nodeId, name: nodeName, op };
81103
- doc.roots.push({ root: nodeId, material: partMaterial });
81104
- doc.part_materials[nodeName] = partMaterial;
81105
- };
81123
+ let doc;
81106
81124
  let summary;
81107
81125
  if (as_mesh) {
81108
- const { meshes, report, summary: importWarnings } = engine.importStepWithReport(arrayBuffer);
81109
- if (meshes.length === 0) {
81110
- throw new Error("No geometry found in STEP file");
81111
- }
81112
- meshes.forEach((mesh, i) => {
81113
- const op = {
81114
- type: "ImportedMesh",
81115
- positions: Array.from(mesh.positions),
81116
- indices: Array.from(mesh.indices),
81117
- normals: mesh.normals ? Array.from(mesh.normals) : void 0,
81118
- source: sourceLabel
81119
- };
81120
- addRoot(i + 1, meshes.length === 1 ? partName : `${partName}_${i + 1}`, op);
81121
- });
81126
+ const imported = engine.importStepMeshDocument(arrayBuffer, partName, partMaterial, sourceLabel);
81127
+ doc = imported.document;
81122
81128
  summary = {
81123
81129
  representation: "mesh",
81124
- bodies: meshes.length,
81125
- total_triangles: meshes.reduce((sum, m) => sum + m.indices.length / 3, 0),
81126
- total_vertices: meshes.reduce((sum, m) => sum + m.positions.length / 3, 0),
81130
+ bodies: imported.bodies,
81131
+ total_triangles: imported.triangles,
81132
+ total_vertices: imported.vertices,
81127
81133
  note: "Imported as triangle meshes: no analytic faces, and these parts cannot be exported to STEP. Drop `as_mesh` for a B-rep import.",
81128
- ...skippedFaceSummary(report, importWarnings)
81134
+ ...skippedFaceSummary(imported.report, imported.summary)
81129
81135
  };
81130
81136
  } else {
81131
81137
  const label = basename(sourceLabel).replace(/[^\w.-]/g, "_") || "import.step";
@@ -81139,18 +81145,12 @@ function importStep(input, engine) {
81139
81145
  if (registered.solids.length === 0) {
81140
81146
  throw new Error("No geometry found in STEP file");
81141
81147
  }
81142
- registered.solids.forEach((solid, i) => {
81143
- const op = {
81144
- type: "step_import",
81145
- path,
81146
- ...solid.index === 0 ? {} : { solid_index: solid.index }
81147
- };
81148
- addRoot(
81149
- i + 1,
81150
- registered.solids.length === 1 ? partName : `${partName}_${i + 1}`,
81151
- op
81152
- );
81153
- });
81148
+ doc = engine.stepImportDocument(
81149
+ path,
81150
+ registered.solids.map((solid) => solid.index),
81151
+ partName,
81152
+ partMaterial
81153
+ );
81154
81154
  const meshOnly = registered.solids.filter((s) => s.faces === 0);
81155
81155
  summary = {
81156
81156
  representation: "brep",
@@ -81216,7 +81216,6 @@ var MAX_STEP_BYTES, STEP_CACHE_DIR, importStepSchema, toolDefs46;
81216
81216
  var init_import = __esm({
81217
81217
  "src/tools/import.ts"() {
81218
81218
  "use strict";
81219
- init_dist2();
81220
81219
  init_safe_path();
81221
81220
  init_remote();
81222
81221
  init_artifact_store();
@@ -86903,8 +86902,8 @@ var init_server3 = __esm({
86903
86902
  init_order_feed();
86904
86903
  init_animate();
86905
86904
  PKG_VERSION = (() => {
86906
- if ("0.10.0-main.125") {
86907
- return "0.10.0-main.125";
86905
+ if ("0.10.0-main.127") {
86906
+ return "0.10.0-main.127";
86908
86907
  }
86909
86908
  try {
86910
86909
  const req = createRequire2(import.meta.url);
@@ -86913,8 +86912,8 @@ var init_server3 = __esm({
86913
86912
  return "0.0.0";
86914
86913
  }
86915
86914
  })();
86916
- BUILD_SHA = "0faa082d15ca8fd803090dfc416f68c12b5a3971";
86917
- BUILD_TIME = "2026-10-21T13:48:35.626Z";
86915
+ BUILD_SHA = "29cbe4343d120465c4b5eda7f7ccfc72d65a2171";
86916
+ BUILD_TIME = "2026-10-21T14:37:18.317Z";
86918
86917
  SHORT_SHA = BUILD_SHA === "unknown" ? "unknown" : BUILD_SHA.slice(0, 7);
86919
86918
  VERSION_WITH_BUILD = SHORT_SHA === "unknown" ? PKG_VERSION : `${PKG_VERSION}+${SHORT_SHA}`;
86920
86919
  INSTANCE_ID = randomUUID7().slice(0, 8);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vcad/mcp",
3
- "version": "0.10.0-main.125",
3
+ "version": "0.10.0-main.127",
4
4
  "description": "vcad MCP server — parametric CAD + PCB design tools for AI agents (self-contained: bundled server + kernel WASM)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "homepage": "https://vcad.io",
21
21
  "vcadBuild": {
22
- "sha": "0faa082d15ca8fd803090dfc416f68c12b5a3971",
23
- "builtAt": "2026-10-21T13:48:35.626Z"
22
+ "sha": "29cbe4343d120465c4b5eda7f7ccfc72d65a2171",
23
+ "builtAt": "2026-10-21T14:37:18.317Z"
24
24
  }
25
25
  }