@vcad/mcp 0.10.0-main.105 → 0.10.0-main.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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 ae48039994dc8149dae73f8a5fbeb73dd9012575 at 2026-10-20T20:00:38.184Z. Source: https://github.com/ecto/vcad
9
+ Built from 4142e4f65547ee1e2e893302fedbaa05961d0d83 at 2026-10-20T21:28:47.814Z. Source: https://github.com/ecto/vcad
package/index.mjs CHANGED
@@ -5380,11 +5380,11 @@ function __wbg_get_imports() {
5380
5380
  return ret;
5381
5381
  },
5382
5382
  __wbindgen_generic_0000000000000004: function(arg0, arg1) {
5383
- const ret = makeMutClosure(arg0, arg1, wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__443);
5383
+ const ret = makeMutClosure(arg0, arg1, wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__447);
5384
5384
  return ret;
5385
5385
  },
5386
5386
  __wbindgen_generic_0000000000000005: function(arg0, arg1) {
5387
- const ret = makeMutClosure(arg0, arg1, wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__444);
5387
+ const ret = makeMutClosure(arg0, arg1, wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__448);
5388
5388
  return ret;
5389
5389
  },
5390
5390
  __wbindgen_generic_0000000000000006: function(arg0) {
@@ -5473,14 +5473,14 @@ function wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bin
5473
5473
  throw takeFromExternrefTable0(ret[0]);
5474
5474
  }
5475
5475
  }
5476
- function wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__443(arg0, arg1, arg2) {
5477
- const ret = wasm.wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__443(arg0, arg1, arg2);
5476
+ function wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__447(arg0, arg1, arg2) {
5477
+ const ret = wasm.wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__447(arg0, arg1, arg2);
5478
5478
  if (ret[1]) {
5479
5479
  throw takeFromExternrefTable0(ret[0]);
5480
5480
  }
5481
5481
  }
5482
- function wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__444(arg0, arg1, arg2) {
5483
- const ret = wasm.wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__444(arg0, arg1, arg2);
5482
+ function wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__448(arg0, arg1, arg2) {
5483
+ const ret = wasm.wasm_bindgen_d8ba3021eaa32f54___convert__closures_____invoke___wasm_bindgen_d8ba3021eaa32f54___sys__JsNullable_wgpu_f894171a91484cea___backend__webgpu__webgpu_sys__gen_GpuError__GpuError___core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_d8ba3021eaa32f54___JsError___true__448(arg0, arg1, arg2);
5484
5484
  if (ret[1]) {
5485
5485
  throw takeFromExternrefTable0(ret[0]);
5486
5486
  }
@@ -8030,6 +8030,52 @@ var init_vcad_kernel_wasm = __esm({
8030
8030
  const ret = wasm.wasmdocumentengine_add_feature(this.__wbg_ptr, ptr0, len0);
8031
8031
  return ret;
8032
8032
  }
8033
+ /**
8034
+ * Apply a JSON `DocCommand` (see `vcad_app::command`). Returns the
8035
+ * shared JSON envelope: `{"ok":true,"result":{…}}` or
8036
+ * `{"ok":false,"error":{"kind":…,"message":…}}`. Unlike the per-method
8037
+ * calls, unknown ids and malformed input are reported, not ignored.
8038
+ * @param {string} command_json
8039
+ * @returns {string}
8040
+ */
8041
+ apply(command_json) {
8042
+ let deferred2_0;
8043
+ let deferred2_1;
8044
+ try {
8045
+ const ptr0 = passStringToWasm0(command_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
8046
+ const len0 = WASM_VECTOR_LEN;
8047
+ const ret = wasm.wasmdocumentengine_apply(this.__wbg_ptr, ptr0, len0);
8048
+ deferred2_0 = ret[0];
8049
+ deferred2_1 = ret[1];
8050
+ return getStringFromWasm0(ret[0], ret[1]);
8051
+ } finally {
8052
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
8053
+ }
8054
+ }
8055
+ /**
8056
+ * Lower an AI tool call (`create`, `translate`, `linear_pattern`, …)
8057
+ * to a `DocCommand` in Rust and apply it. Same envelope as `apply`;
8058
+ * tools the engine can't lower yet report `{"kind":"unsupported"}`.
8059
+ * @param {string} tool
8060
+ * @param {string} args_json
8061
+ * @returns {string}
8062
+ */
8063
+ apply_tool(tool, args_json) {
8064
+ let deferred3_0;
8065
+ let deferred3_1;
8066
+ try {
8067
+ const ptr0 = passStringToWasm0(tool, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
8068
+ const len0 = WASM_VECTOR_LEN;
8069
+ const ptr1 = passStringToWasm0(args_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
8070
+ const len1 = WASM_VECTOR_LEN;
8071
+ const ret = wasm.wasmdocumentengine_apply_tool(this.__wbg_ptr, ptr0, len0, ptr1, len1);
8072
+ deferred3_0 = ret[0];
8073
+ deferred3_1 = ret[1];
8074
+ return getStringFromWasm0(ret[0], ret[1]);
8075
+ } finally {
8076
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
8077
+ }
8078
+ }
8033
8079
  /**
8034
8080
  * Whether redo is available.
8035
8081
  * @returns {boolean}
@@ -8420,6 +8466,22 @@ var init_vcad_kernel_wasm = __esm({
8420
8466
  const ret = wasm.wasmdocumentengine_set_visible(this.__wbg_ptr, ptr0, len0, visible);
8421
8467
  return ret;
8422
8468
  }
8469
+ /**
8470
+ * Deterministic state fingerprint; matches `vcad_engine_state_hash`.
8471
+ * @returns {string}
8472
+ */
8473
+ stateHash() {
8474
+ let deferred1_0;
8475
+ let deferred1_1;
8476
+ try {
8477
+ const ret = wasm.wasmdocumentengine_stateHash(this.__wbg_ptr);
8478
+ deferred1_0 = ret[0];
8479
+ deferred1_1 = ret[1];
8480
+ return getStringFromWasm0(ret[0], ret[1]);
8481
+ } finally {
8482
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
8483
+ }
8484
+ }
8423
8485
  /**
8424
8486
  * Undo the last action.
8425
8487
  * @returns {any}
@@ -8442,6 +8504,16 @@ var init_vcad_kernel_wasm = __esm({
8442
8504
  const ret = wasm.wasmdocumentengine_update_feature(this.__wbg_ptr, ptr0, len0, ptr1, len1);
8443
8505
  return ret;
8444
8506
  }
8507
+ /**
8508
+ * Create an empty engine with a fixed replica id (deterministic stable
8509
+ * ids — used by the parity harness and by hosts that persist replicas).
8510
+ * @param {number} replica_id
8511
+ * @returns {WasmDocumentEngine}
8512
+ */
8513
+ static withReplica(replica_id) {
8514
+ const ret = wasm.wasmdocumentengine_withReplica(replica_id);
8515
+ return _WasmDocumentEngine.__wrap(ret);
8516
+ }
8445
8517
  };
8446
8518
  if (Symbol.dispose) WasmDocumentEngine.prototype[Symbol.dispose] = WasmDocumentEngine.prototype.free;
8447
8519
  WasmKeybindings = class {
@@ -30738,8 +30810,6 @@ var init_esm2 = __esm({
30738
30810
 
30739
30811
  // ../core/dist/stores/engine-command.js
30740
30812
  function applyCommand(engine, command) {
30741
- if (typeof engine.apply !== "function")
30742
- return applyLegacy(engine, command);
30743
30813
  const envelope = JSON.parse(engine.apply(JSON.stringify(command)));
30744
30814
  if (!envelope.ok)
30745
30815
  throw new DocCommandError(command, envelope.error);
@@ -30748,8 +30818,6 @@ function applyCommand(engine, command) {
30748
30818
  return envelope.result;
30749
30819
  }
30750
30820
  function applyToolCall(engine, tool, args) {
30751
- if (typeof engine.apply_tool !== "function")
30752
- return null;
30753
30821
  const envelope = JSON.parse(engine.apply_tool(tool, JSON.stringify(args)));
30754
30822
  if (envelope.ok) {
30755
30823
  for (const w of envelope.result.warnings ?? [])
@@ -30757,52 +30825,6 @@ function applyToolCall(engine, tool, args) {
30757
30825
  }
30758
30826
  return envelope;
30759
30827
  }
30760
- function applyLegacy(engine, c) {
30761
- switch (c.type) {
30762
- case "add_feature": {
30763
- const r = engine.add_feature(JSON.stringify(c.feature));
30764
- if (c.name && r.createdFeatureId) {
30765
- return { ...engine.rename_feature(r.createdFeatureId, c.name), createdFeatureId: r.createdFeatureId };
30766
- }
30767
- return r;
30768
- }
30769
- case "delete_feature":
30770
- return engine.delete_feature_by_id(c.id);
30771
- case "set_translation":
30772
- return engine.set_translation(c.id, ...c.offset);
30773
- case "set_rotation":
30774
- return engine.set_rotation(c.id, ...c.angles);
30775
- case "set_scale":
30776
- return engine.set_scale(c.id, ...c.factor);
30777
- case "set_material":
30778
- return engine.set_material(c.id, c.material);
30779
- case "set_visible":
30780
- return engine.set_visible(c.id, c.visible);
30781
- case "rename":
30782
- return engine.rename_feature(c.id, c.name);
30783
- case "set_joint_state":
30784
- return engine.set_joint_state(c.id, c.state);
30785
- case "import_ir":
30786
- return { consumedPartIds: [], ...engine.import_ir(JSON.stringify(c.document)) };
30787
- case "set_param":
30788
- return { consumedPartIds: [], ...engine.set_param(c.id, c.key, JSON.stringify(c.value)) };
30789
- case "create_feature":
30790
- return { consumedPartIds: [], ...engine.create_feature(c.kind, JSON.stringify(c.params ?? {})) };
30791
- case "reorder": {
30792
- const others = JSON.parse(engine.get_ordered_features_json()).filter((f) => f.id !== c.id);
30793
- const before = c.index > 0 ? others[c.index - 1]?.id ?? "" : "";
30794
- const after = others[c.index]?.id ?? "";
30795
- const position = engine.compute_position_between(before, after);
30796
- return { consumedPartIds: [], ...engine.move_feature(c.id, position) };
30797
- }
30798
- case "undo":
30799
- return { consumedPartIds: [], ...engine.undo() };
30800
- case "redo":
30801
- return { consumedPartIds: [], ...engine.redo() };
30802
- default:
30803
- throw new Error(`[vcad] ${c.type} needs a kernel WASM with WasmDocumentEngine.apply`);
30804
- }
30805
- }
30806
30828
  var DocCommandError;
30807
30829
  var init_engine_command = __esm({
30808
30830
  "../core/dist/stores/engine-command.js"() {
@@ -41443,9 +41465,7 @@ var init_camera_framing = __esm({
41443
41465
  var init_executors = __esm({
41444
41466
  "../core/dist/commands/executors.js"() {
41445
41467
  "use strict";
41446
- init_registry2();
41447
41468
  init_engine_store();
41448
- init_dist2();
41449
41469
  init_dist();
41450
41470
  init_camera_framing();
41451
41471
  }
@@ -41907,6 +41927,20 @@ var init_CHANGELOG = __esm({
41907
41927
  migration: "Use https://vcad.io (printing works through the local relay at 127.0.0.1:7878) or build apple/VcadApp with build-ffi.sh and bundle.sh."
41908
41928
  }
41909
41929
  },
41930
+ {
41931
+ id: "2026-10-20-reduced-order-thermal-stress",
41932
+ version: "undefined",
41933
+ date: "2026-10-20",
41934
+ category: "perf",
41935
+ title: "10x faster thermal-stress sweeps via superposition",
41936
+ summary: "Voxel FEA now exposes per-element stress tensors; a POD reduced-order sweep solves 61 transient thermal-stress frames with 6 solves (2e-4 MPa vs full).",
41937
+ features: [
41938
+ "fea",
41939
+ "thermal",
41940
+ "simulation",
41941
+ "animation"
41942
+ ]
41943
+ },
41910
41944
  {
41911
41945
  id: "2026-10-20-pcb3d-kernel-ratsnest",
41912
41946
  version: "undefined",
@@ -41919,6 +41953,37 @@ var init_CHANGELOG = __esm({
41919
41953
  "pcb"
41920
41954
  ]
41921
41955
  },
41956
+ {
41957
+ id: "2026-10-20-multiphysics-field-stack",
41958
+ version: "undefined",
41959
+ date: "2026-10-20",
41960
+ category: "feat",
41961
+ title: "Multiphysics field stacks on the part",
41962
+ summary: "View thermal, stress, displacement and EM fields on one part, compressed 70x with per-layer error bounds; surface, slice and probe views in web and macOS.",
41963
+ features: [
41964
+ "viewport",
41965
+ "simulation",
41966
+ "thermal",
41967
+ "fea",
41968
+ "em",
41969
+ "compression",
41970
+ "native"
41971
+ ]
41972
+ },
41973
+ {
41974
+ id: "2026-10-20-lossless-import",
41975
+ version: "undefined",
41976
+ date: "2026-10-20",
41977
+ category: "fix",
41978
+ title: "Opening older documents keeps everything",
41979
+ summary: "Opening an older .vcad file no longer drops PCB boards, schematics, parameters, imported meshes, part inertials and colliders, or operations the editor has no tool for.",
41980
+ features: [
41981
+ "documents",
41982
+ "import",
41983
+ "electronics",
41984
+ "assembly"
41985
+ ]
41986
+ },
41922
41987
  {
41923
41988
  id: "2026-10-20-live-part-stock-check",
41924
41989
  version: "0.10.0",
@@ -41977,6 +42042,47 @@ var init_CHANGELOG = __esm({
41977
42042
  "get_footprint"
41978
42043
  ]
41979
42044
  },
42045
+ {
42046
+ id: "2026-10-20-coupled-multiphysics-bracket",
42047
+ version: "undefined",
42048
+ date: "2026-10-20",
42049
+ category: "feat",
42050
+ title: "Thermal-expansion stress in voxel FEA",
42051
+ summary: "analyze_fields_thermal adds \u03B1\xB7\u0394T initial strain to static voxel FEA; the bracket demo now chains busbar Joule heat \u2192 temperature \u2192 thermal + load stress.",
42052
+ features: [
42053
+ "fea",
42054
+ "thermal",
42055
+ "em",
42056
+ "simulation"
42057
+ ]
42058
+ },
42059
+ {
42060
+ id: "2026-10-20-compressed-field-viewer",
42061
+ version: "undefined",
42062
+ date: "2026-10-20",
42063
+ category: "feat",
42064
+ title: "View error-bounded compressed solver fields",
42065
+ summary: "Load a tang-compress field (?field=...), decode it in-browser on WebGPU or WASM, and view a colormapped slice with its max-error bound and native hash check.",
42066
+ features: [
42067
+ "viewport",
42068
+ "simulation",
42069
+ "thermal",
42070
+ "compression"
42071
+ ]
42072
+ },
42073
+ {
42074
+ id: "2026-10-20-collab-order-and-exact-floats",
42075
+ version: "undefined",
42076
+ date: "2026-10-20",
42077
+ category: "fix",
42078
+ title: "Collaborators see the same part order; exact reloads",
42079
+ summary: "Parts added at the same moment by two collaborators now order identically for both; one edit is one undo step; reloading a document no longer nudges dimensions by a rounding bit.",
42080
+ features: [
42081
+ "collaboration",
42082
+ "undo",
42083
+ "documents"
42084
+ ]
42085
+ },
41980
42086
  {
41981
42087
  id: "2026-10-20-ai-update-targets-owner",
41982
42088
  version: "undefined",
@@ -86874,8 +86980,8 @@ var init_server3 = __esm({
86874
86980
  init_order_feed();
86875
86981
  init_animate();
86876
86982
  PKG_VERSION = (() => {
86877
- if ("0.10.0-main.105") {
86878
- return "0.10.0-main.105";
86983
+ if ("0.10.0-main.108") {
86984
+ return "0.10.0-main.108";
86879
86985
  }
86880
86986
  try {
86881
86987
  const req = createRequire2(import.meta.url);
@@ -86884,8 +86990,8 @@ var init_server3 = __esm({
86884
86990
  return "0.0.0";
86885
86991
  }
86886
86992
  })();
86887
- BUILD_SHA = "ae48039994dc8149dae73f8a5fbeb73dd9012575";
86888
- BUILD_TIME = "2026-10-20T20:00:38.184Z";
86993
+ BUILD_SHA = "4142e4f65547ee1e2e893302fedbaa05961d0d83";
86994
+ BUILD_TIME = "2026-10-20T21:28:47.814Z";
86889
86995
  SHORT_SHA = BUILD_SHA === "unknown" ? "unknown" : BUILD_SHA.slice(0, 7);
86890
86996
  VERSION_WITH_BUILD = SHORT_SHA === "unknown" ? PKG_VERSION : `${PKG_VERSION}+${SHORT_SHA}`;
86891
86997
  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.105",
3
+ "version": "0.10.0-main.108",
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": "ae48039994dc8149dae73f8a5fbeb73dd9012575",
23
- "builtAt": "2026-10-20T20:00:38.184Z"
22
+ "sha": "4142e4f65547ee1e2e893302fedbaa05961d0d83",
23
+ "builtAt": "2026-10-20T21:28:47.814Z"
24
24
  }
25
25
  }
Binary file