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

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 a463c0d111f8f432469d77dd4b9038fd370f6801 at 2026-10-20T21:08:32.781Z. 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
  }
@@ -41919,6 +41939,20 @@ var init_CHANGELOG = __esm({
41919
41939
  "pcb"
41920
41940
  ]
41921
41941
  },
41942
+ {
41943
+ id: "2026-10-20-lossless-import",
41944
+ version: "undefined",
41945
+ date: "2026-10-20",
41946
+ category: "fix",
41947
+ title: "Opening older documents keeps everything",
41948
+ 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.",
41949
+ features: [
41950
+ "documents",
41951
+ "import",
41952
+ "electronics",
41953
+ "assembly"
41954
+ ]
41955
+ },
41922
41956
  {
41923
41957
  id: "2026-10-20-live-part-stock-check",
41924
41958
  version: "0.10.0",
@@ -41977,6 +42011,19 @@ var init_CHANGELOG = __esm({
41977
42011
  "get_footprint"
41978
42012
  ]
41979
42013
  },
42014
+ {
42015
+ id: "2026-10-20-collab-order-and-exact-floats",
42016
+ version: "undefined",
42017
+ date: "2026-10-20",
42018
+ category: "fix",
42019
+ title: "Collaborators see the same part order; exact reloads",
42020
+ 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.",
42021
+ features: [
42022
+ "collaboration",
42023
+ "undo",
42024
+ "documents"
42025
+ ]
42026
+ },
41980
42027
  {
41981
42028
  id: "2026-10-20-ai-update-targets-owner",
41982
42029
  version: "undefined",
@@ -86874,8 +86921,8 @@ var init_server3 = __esm({
86874
86921
  init_order_feed();
86875
86922
  init_animate();
86876
86923
  PKG_VERSION = (() => {
86877
- if ("0.10.0-main.105") {
86878
- return "0.10.0-main.105";
86924
+ if ("0.10.0-main.107") {
86925
+ return "0.10.0-main.107";
86879
86926
  }
86880
86927
  try {
86881
86928
  const req = createRequire2(import.meta.url);
@@ -86884,8 +86931,8 @@ var init_server3 = __esm({
86884
86931
  return "0.0.0";
86885
86932
  }
86886
86933
  })();
86887
- BUILD_SHA = "ae48039994dc8149dae73f8a5fbeb73dd9012575";
86888
- BUILD_TIME = "2026-10-20T20:00:38.184Z";
86934
+ BUILD_SHA = "a463c0d111f8f432469d77dd4b9038fd370f6801";
86935
+ BUILD_TIME = "2026-10-20T21:08:32.781Z";
86889
86936
  SHORT_SHA = BUILD_SHA === "unknown" ? "unknown" : BUILD_SHA.slice(0, 7);
86890
86937
  VERSION_WITH_BUILD = SHORT_SHA === "unknown" ? PKG_VERSION : `${PKG_VERSION}+${SHORT_SHA}`;
86891
86938
  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.107",
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": "a463c0d111f8f432469d77dd4b9038fd370f6801",
23
+ "builtAt": "2026-10-20T21:08:32.781Z"
24
24
  }
25
25
  }
Binary file