@vcad/mcp 0.10.0-main.121 → 0.10.0-main.123

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 8043f5abee602db89815a1ad7ecc319ed0980648 at 2026-10-21T02:20:10.272Z. Source: https://github.com/ecto/vcad
9
+ Built from 4c65cd9f4d93e78adf4900e8e3459a0b33d38dce at 2026-10-21T13:05:13.604Z. Source: https://github.com/ecto/vcad
package/index.mjs CHANGED
@@ -31676,10 +31676,6 @@ function getPcbBoardFeatureId(state) {
31676
31676
  const pcb = features.find((f) => f.kind === "pcb-board");
31677
31677
  return pcb?.id ?? "";
31678
31678
  }
31679
- function setCrdtSchematic(state, schematic) {
31680
- const schId = getOrCreateSchematicFeature(state);
31681
- applyCommand(state._crdtEngine, { type: "set_param", id: schId, key: "sheet", value: crdtStr(JSON.stringify(schematic)) });
31682
- }
31683
31679
  function setCrdtPcb(state, pcb) {
31684
31680
  const pcbFid = getPcbBoardFeatureId(state);
31685
31681
  if (!pcbFid)
@@ -31687,6 +31683,18 @@ function setCrdtPcb(state, pcb) {
31687
31683
  const result = applyCommand(state._crdtEngine, { type: "set_param", id: pcbFid, key: "board", value: crdtStr(JSON.stringify(pcb)) });
31688
31684
  return applyLegacyResult(result);
31689
31685
  }
31686
+ function applyEdit(get, set, tool, args) {
31687
+ const engine = get()._crdtEngine;
31688
+ if (!engine)
31689
+ return false;
31690
+ const envelope = applyToolCall(engine, tool, args);
31691
+ if (!envelope.ok) {
31692
+ console.warn(`[document-store] ${tool}: ${envelope.error.message}`);
31693
+ return false;
31694
+ }
31695
+ set(applyApiResult(envelope.result));
31696
+ return true;
31697
+ }
31690
31698
  function addPcbToDocument(get, set, pcbBoard, boardName2) {
31691
31699
  const engine = get()._crdtEngine;
31692
31700
  if (!engine) {
@@ -32889,291 +32897,92 @@ var init_document_store = __esm({
32889
32897
  set({ ...patch, isDirty: true });
32890
32898
  },
32891
32899
  moveSchematicComponent: (idx, position) => {
32892
- const state = get();
32893
- if (!state.document.schematic)
32894
- return;
32895
- const sch = structuredClone(state.document.schematic);
32896
- if (sch.components[idx]) {
32897
- sch.components[idx].position = { x: position.x, y: position.y };
32898
- }
32899
- setCrdtSchematic(state, sch);
32900
- const doc = JSON.parse(state._crdtEngine.get_document_json());
32901
- set({ document: doc, isDirty: true });
32900
+ applyEdit(get, set, "sch_move_component", { index: idx, position: { x: position.x, y: position.y } });
32902
32901
  },
32903
32902
  moveSchematicComponentWithWires: (idx, position, wireUpdates) => {
32904
- const state = get();
32905
- if (!state.document.schematic)
32906
- return;
32907
- const sch = structuredClone(state.document.schematic);
32908
- if (sch.components[idx]) {
32909
- sch.components[idx].position = { x: position.x, y: position.y };
32910
- }
32911
- for (const wu of wireUpdates) {
32912
- const wire = sch.wires[wu.wireIdx];
32913
- if (wire) {
32914
- wire[wu.endpoint] = { x: wu.pos.x, y: wu.pos.y };
32915
- }
32916
- }
32917
- setCrdtSchematic(state, sch);
32918
- const doc = JSON.parse(state._crdtEngine.get_document_json());
32919
- set({ document: doc, isDirty: true });
32903
+ applyEdit(get, set, "sch_move_component", {
32904
+ index: idx,
32905
+ position: { x: position.x, y: position.y },
32906
+ wire_updates: wireUpdates.map((wu) => ({
32907
+ wire_index: wu.wireIdx,
32908
+ endpoint: wu.endpoint,
32909
+ position: { x: wu.pos.x, y: wu.pos.y }
32910
+ }))
32911
+ });
32920
32912
  },
32921
32913
  moveFootprint: (_nodeId, idx, position) => {
32922
- const state = get();
32923
- if (!state.document.pcb)
32924
- return;
32925
- const pcb = structuredClone(state.document.pcb);
32926
- const fp = pcb.footprints[idx];
32927
- if (!fp)
32928
- return;
32929
- const dx = position.x - fp.position.x;
32930
- const dy = position.y - fp.position.y;
32931
- if (dx !== 0 || dy !== 0) {
32932
- const TOL = 0.08;
32933
- const ang = (fp.rotation ?? 0) * Math.PI / 180;
32934
- const cos = Math.cos(ang);
32935
- const sin = Math.sin(ang);
32936
- const padWorld2 = fp.pads.map((p) => ({
32937
- x: fp.position.x + (p.position.x * cos - p.position.y * sin),
32938
- y: fp.position.y + (p.position.x * sin + p.position.y * cos)
32939
- }));
32940
- for (const tr of pcb.traces) {
32941
- for (const end of [tr.start, tr.end]) {
32942
- if (padWorld2.some((pw) => Math.abs(end.x - pw.x) < TOL && Math.abs(end.y - pw.y) < TOL)) {
32943
- end.x += dx;
32944
- end.y += dy;
32945
- }
32946
- }
32947
- }
32948
- }
32949
- fp.position = { x: position.x, y: position.y };
32950
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32914
+ applyEdit(get, set, "pcb_move_footprint", { index: idx, position: { x: position.x, y: position.y } });
32951
32915
  },
32952
32916
  rotateFootprint: (_nodeId, idx, angleDeg) => {
32953
- const state = get();
32954
- if (!state.document.pcb)
32955
- return;
32956
- const pcb = structuredClone(state.document.pcb);
32957
- if (pcb.footprints[idx]) {
32958
- const fp = pcb.footprints[idx];
32959
- fp.rotation = ((fp.rotation ?? 0) + angleDeg) % 360;
32960
- }
32961
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32917
+ applyEdit(get, set, "pcb_rotate_footprint", { index: idx, angle: angleDeg });
32962
32918
  },
32963
32919
  flipFootprint: (_nodeId, idx) => {
32964
- const state = get();
32965
- if (!state.document.pcb)
32966
- return;
32967
- const pcb = structuredClone(state.document.pcb);
32968
- if (pcb.footprints[idx]) {
32969
- const fp = pcb.footprints[idx];
32970
- fp.front = !(fp.front ?? true);
32971
- }
32972
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32920
+ applyEdit(get, set, "pcb_flip_footprint", { index: idx });
32973
32921
  },
32974
32922
  addTrace: (_nodeId, trace) => {
32975
- const state = get();
32976
- if (!state.document.pcb)
32977
- return;
32978
- const pcb = structuredClone(state.document.pcb);
32979
- pcb.traces.push({
32980
- start: { x: trace.start.x, y: trace.start.y },
32981
- end: { x: trace.end.x, y: trace.end.y },
32982
- width: trace.width,
32983
- layer: trace.layer,
32984
- net: trace.net
32923
+ applyEdit(get, set, "pcb_add_trace", {
32924
+ trace: {
32925
+ start: { x: trace.start.x, y: trace.start.y },
32926
+ end: { x: trace.end.x, y: trace.end.y },
32927
+ width: trace.width,
32928
+ layer: trace.layer,
32929
+ net: trace.net
32930
+ }
32985
32931
  });
32986
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32987
32932
  },
32988
32933
  removeTrace: (_nodeId, idx) => {
32989
- const state = get();
32990
- if (!state.document.pcb)
32991
- return;
32992
- const pcb = structuredClone(state.document.pcb);
32993
- pcb.traces.splice(idx, 1);
32994
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32934
+ applyEdit(get, set, "pcb_remove_trace", { index: idx });
32995
32935
  },
32996
32936
  addVia: (_nodeId, via) => {
32997
- const state = get();
32998
- if (!state.document.pcb)
32999
- return;
33000
- const pcb = structuredClone(state.document.pcb);
33001
- pcb.vias.push({
33002
- position: { x: via.position.x, y: via.position.y },
33003
- diameter: via.diameter,
33004
- drill: via.drill,
33005
- startLayer: via.startLayer,
33006
- endLayer: via.endLayer,
33007
- net: via.net
32937
+ applyEdit(get, set, "pcb_add_via", {
32938
+ via: {
32939
+ position: { x: via.position.x, y: via.position.y },
32940
+ diameter: via.diameter,
32941
+ drill: via.drill,
32942
+ startLayer: via.startLayer,
32943
+ endLayer: via.endLayer,
32944
+ net: via.net
32945
+ }
33008
32946
  });
33009
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
33010
32947
  },
33011
32948
  removeVia: (_nodeId, idx) => {
33012
- const state = get();
33013
- if (!state.document.pcb)
33014
- return;
33015
- const pcb = structuredClone(state.document.pcb);
33016
- pcb.vias.splice(idx, 1);
33017
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32949
+ applyEdit(get, set, "pcb_remove_via", { index: idx });
33018
32950
  },
33019
32951
  addSchematicComponent: (comp, _boardNodeId) => {
33020
- const state = get();
33021
- if (!state.document.schematic)
33022
- return;
33023
- const sch = structuredClone(state.document.schematic);
33024
- sch.components.push(structuredClone(comp));
33025
- setCrdtSchematic(state, sch);
33026
- if (state.document.pcb && comp.footprintId && comp.properties?.footprintTemplate) {
33027
- const pcb = structuredClone(state.document.pcb);
33028
- try {
33029
- const template = JSON.parse(comp.properties.footprintTemplate);
33030
- const fpCount = pcb.footprints.length;
33031
- pcb.footprints.push({
33032
- ref: comp.ref,
33033
- value: comp.value,
33034
- footprintName: comp.footprintId,
33035
- position: { x: 10 + fpCount % 5 * 10, y: 10 + Math.floor(fpCount / 5) * 10 },
33036
- pads: template.pads ?? [],
33037
- graphics: template.graphics ?? []
33038
- });
33039
- } catch {
33040
- }
33041
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
33042
- return;
33043
- }
33044
- const doc = JSON.parse(state._crdtEngine.get_document_json());
33045
- set({ document: doc, isDirty: true });
32952
+ applyEdit(get, set, "sch_add_component", { component: comp });
33046
32953
  },
33047
32954
  removeSchematicComponent: (idx, _boardNodeId) => {
33048
- const state = get();
33049
- if (!state.document.schematic)
33050
- return;
33051
- const sch = structuredClone(state.document.schematic);
33052
- const removed = sch.components.splice(idx, 1);
33053
- setCrdtSchematic(state, sch);
33054
- if (state.document.pcb && removed[0]) {
33055
- const pcb = structuredClone(state.document.pcb);
33056
- pcb.footprints = pcb.footprints.filter((fp) => fp.ref !== removed[0].ref);
33057
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
33058
- return;
33059
- }
33060
- const doc = JSON.parse(state._crdtEngine.get_document_json());
33061
- set({ document: doc, isDirty: true });
32955
+ applyEdit(get, set, "sch_remove_component", { index: idx });
33062
32956
  },
33063
32957
  updateSchematicComponent: (idx, updates, _boardNodeId) => {
33064
- const state = get();
33065
- if (!state.document.schematic)
33066
- return;
33067
- const sch = structuredClone(state.document.schematic);
33068
- if (sch.components[idx]) {
33069
- Object.assign(sch.components[idx], updates);
33070
- }
33071
- setCrdtSchematic(state, sch);
33072
- if (updates.value !== void 0 && state.document.pcb) {
33073
- const pcb = structuredClone(state.document.pcb);
33074
- const ref = sch.components[idx]?.ref;
33075
- if (ref) {
33076
- const fp = pcb.footprints.find((f) => f.ref === ref);
33077
- if (fp)
33078
- fp.value = updates.value;
33079
- }
33080
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
33081
- return;
33082
- }
33083
- const doc = JSON.parse(state._crdtEngine.get_document_json());
33084
- set({ document: doc, isDirty: true });
32958
+ applyEdit(get, set, "sch_update_component", { index: idx, updates });
33085
32959
  },
33086
32960
  addSchematicWire: (wire) => {
33087
- const state = get();
33088
- if (!state.document.schematic)
33089
- return;
33090
- const sch = structuredClone(state.document.schematic);
33091
- sch.wires.push({ start: { ...wire.start }, end: { ...wire.end } });
33092
- setCrdtSchematic(state, sch);
33093
- const doc = JSON.parse(state._crdtEngine.get_document_json());
33094
- set({ document: doc, isDirty: true });
32961
+ applyEdit(get, set, "sch_add_wire", { wire: { start: { ...wire.start }, end: { ...wire.end } } });
33095
32962
  },
33096
32963
  removeSchematicWire: (idx) => {
33097
- const state = get();
33098
- if (!state.document.schematic)
33099
- return;
33100
- const sch = structuredClone(state.document.schematic);
33101
- sch.wires.splice(idx, 1);
33102
- setCrdtSchematic(state, sch);
33103
- const doc = JSON.parse(state._crdtEngine.get_document_json());
33104
- set({ document: doc, isDirty: true });
32964
+ applyEdit(get, set, "sch_remove_wire", { index: idx });
33105
32965
  },
33106
32966
  addSchematicLabel: (label) => {
33107
- const state = get();
33108
- if (!state.document.schematic)
33109
- return;
33110
- const sch = structuredClone(state.document.schematic);
33111
- sch.labels.push(structuredClone(label));
33112
- setCrdtSchematic(state, sch);
33113
- const doc = JSON.parse(state._crdtEngine.get_document_json());
33114
- set({ document: doc, isDirty: true });
32967
+ applyEdit(get, set, "sch_add_label", { label });
33115
32968
  },
33116
32969
  removeSchematicLabel: (idx) => {
33117
- const state = get();
33118
- if (!state.document.schematic)
33119
- return;
33120
- const sch = structuredClone(state.document.schematic);
33121
- sch.labels.splice(idx, 1);
33122
- setCrdtSchematic(state, sch);
33123
- const doc = JSON.parse(state._crdtEngine.get_document_json());
33124
- set({ document: doc, isDirty: true });
32970
+ applyEdit(get, set, "sch_remove_label", { index: idx });
33125
32971
  },
33126
32972
  addSchematicJunction: (junction) => {
33127
- const state = get();
33128
- if (!state.document.schematic)
33129
- return;
33130
- const sch = structuredClone(state.document.schematic);
33131
- sch.junctions.push({ position: { ...junction.position } });
33132
- setCrdtSchematic(state, sch);
33133
- const doc = JSON.parse(state._crdtEngine.get_document_json());
33134
- set({ document: doc, isDirty: true });
32973
+ applyEdit(get, set, "sch_add_junction", { junction: { position: { ...junction.position } } });
33135
32974
  },
33136
32975
  addFootprint: (_nodeId, fp) => {
33137
- const state = get();
33138
- if (!state.document.pcb)
33139
- return;
33140
- const pcb = structuredClone(state.document.pcb);
33141
- pcb.footprints.push(structuredClone(fp));
33142
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32976
+ applyEdit(get, set, "pcb_add_footprint", { footprint: fp });
33143
32977
  },
33144
32978
  removeFootprint: (_nodeId, idx) => {
33145
- const state = get();
33146
- if (!state.document.pcb)
33147
- return;
33148
- const pcb = structuredClone(state.document.pcb);
33149
- pcb.footprints.splice(idx, 1);
33150
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32979
+ applyEdit(get, set, "pcb_remove_footprint", { index: idx });
33151
32980
  },
33152
32981
  setBoardOutline: (outline) => {
33153
- const state = get();
33154
- if (!state.document.pcb)
33155
- return;
33156
- const pcb = structuredClone(state.document.pcb);
33157
- pcb.outline = structuredClone(outline);
33158
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32982
+ applyEdit(get, set, "pcb_set_outline", { outline });
33159
32983
  },
33160
32984
  resizeBoard: (width, height) => {
33161
- const state = get();
33162
- if (!state.document.pcb)
33163
- return;
33164
- const w = Math.max(1, width);
33165
- const h = Math.max(1, height);
33166
- const pcb = structuredClone(state.document.pcb);
33167
- pcb.outline = {
33168
- ...pcb.outline,
33169
- vertices: [
33170
- { x: 0, y: 0 },
33171
- { x: w, y: 0 },
33172
- { x: w, y: h },
33173
- { x: 0, y: h }
33174
- ]
33175
- };
33176
- set({ ...setCrdtPcb(state, pcb), isDirty: true });
32985
+ applyEdit(get, set, "pcb_resize", { width, height });
33177
32986
  },
33178
32987
  persistSketchConstraints: (partId, session) => {
33179
32988
  const state = get();
@@ -33187,42 +32996,16 @@ var init_document_store = __esm({
33187
32996
  set({ ...setCrdtConstraints(state, next), isDirty: true });
33188
32997
  },
33189
32998
  addDesignConstraint: (constraint) => {
33190
- const state = get();
33191
- const existing = state.document.constraints ?? [];
33192
- let max = 0;
33193
- for (const c of existing) {
33194
- const m = /^c(\d+)$/.exec(c.id);
33195
- if (m)
33196
- max = Math.max(max, Number(m[1]));
33197
- }
33198
- const next = [...existing, { ...constraint, id: `c${max + 1}` }];
33199
- set({ ...setCrdtConstraints(state, next), isDirty: true });
32999
+ if (!applyEdit(get, set, "add_design_constraint", { constraint }))
33000
+ return null;
33200
33001
  return get().solveDesignConstraints();
33201
33002
  },
33202
33003
  removeDesignConstraint: (id) => {
33203
- const state = get();
33204
- const existing = state.document.constraints ?? [];
33205
- const next = existing.filter((c) => c.id !== id);
33206
- if (next.length === existing.length)
33207
- return;
33208
- set({ ...setCrdtConstraints(state, next), isDirty: true });
33004
+ applyEdit(get, set, "remove_design_constraint", { id });
33209
33005
  },
33210
33006
  updateDesignConstraint: (id, patch) => {
33211
- const state = get();
33212
- const existing = state.document.constraints ?? [];
33213
- const next = existing.map((c) => {
33214
- if (c.id !== id)
33215
- return c;
33216
- const kind = { ...c.kind };
33217
- if (patch.value !== void 0 && "value" in kind)
33218
- kind.value = patch.value;
33219
- return {
33220
- ...c,
33221
- kind,
33222
- ...patch.driven !== void 0 ? { driven: patch.driven } : {}
33223
- };
33224
- });
33225
- set({ ...setCrdtConstraints(state, next), isDirty: true });
33007
+ if (!applyEdit(get, set, "update_design_constraint", { id, value: patch.value, driven: patch.driven }))
33008
+ return null;
33226
33009
  return get().solveDesignConstraints();
33227
33010
  },
33228
33011
  solveDesignConstraints: (opts) => {
@@ -41824,6 +41607,32 @@ var init_CHANGELOG = __esm({
41824
41607
  CHANGELOG_default = {
41825
41608
  $schema: "./changelog.schema.json",
41826
41609
  entries: [
41610
+ {
41611
+ id: "2026-10-21-planar-cap-normals",
41612
+ version: "0.10.0",
41613
+ date: "2026-10-21",
41614
+ category: "fix",
41615
+ title: "Flat faces keep exact normals in photoreal renders",
41616
+ summary: "The crease bake no longer smooths across flat loft caps: planar faces shade with their exact plane normal, so glass and polished caps render without streaks.",
41617
+ features: [
41618
+ "photoreal",
41619
+ "tessellation",
41620
+ "render"
41621
+ ]
41622
+ },
41623
+ {
41624
+ id: "2026-10-21-mac-app-updates",
41625
+ version: "0.10.0",
41626
+ date: "2026-10-21",
41627
+ category: "feat",
41628
+ title: "Mac app checks for updates",
41629
+ summary: "The native Mac app checks for signed updates automatically and adds Check for Updates\u2026 to the app menu, ready for Developer ID\u2013signed, notarized releases.",
41630
+ features: [
41631
+ "desktop",
41632
+ "mac",
41633
+ "updates"
41634
+ ]
41635
+ },
41827
41636
  {
41828
41637
  id: "2026-10-21-loon-relative-mesh-paths",
41829
41638
  version: "0.10.0",
@@ -41837,6 +41646,32 @@ var init_CHANGELOG = __esm({
41837
41646
  "cli"
41838
41647
  ]
41839
41648
  },
41649
+ {
41650
+ id: "2026-10-21-gpu-photoreal-limits",
41651
+ version: "0.10.0",
41652
+ date: "2026-10-21",
41653
+ category: "fix",
41654
+ title: "GPU photoreal handles big meshes and driver failures",
41655
+ summary: "The GPU path tracer no longer refuses meshes over 1M triangles (the device's buffer limit applies instead), and a driver that loses the device now gives a clear error, with vcad render falling back to the CPU.",
41656
+ features: [
41657
+ "photoreal",
41658
+ "gpu",
41659
+ "render"
41660
+ ]
41661
+ },
41662
+ {
41663
+ id: "2026-10-21-desktop-agent-blank-canvas",
41664
+ version: "0.10.0",
41665
+ date: "2026-10-21",
41666
+ category: "feat",
41667
+ title: "Agent works from a blank canvas, defaults to frog api",
41668
+ summary: "The Mac app's Agent can start from an empty Untitled document, renders the views it asks for, and connects to frog api by default with the model picked from the endpoint.",
41669
+ features: [
41670
+ "desktop",
41671
+ "agent",
41672
+ "ai"
41673
+ ]
41674
+ },
41840
41675
  {
41841
41676
  id: "2026-10-21-desktop-agent",
41842
41677
  version: "0.10.0",
@@ -87339,8 +87174,8 @@ var init_server3 = __esm({
87339
87174
  init_order_feed();
87340
87175
  init_animate();
87341
87176
  PKG_VERSION = (() => {
87342
- if ("0.10.0-main.121") {
87343
- return "0.10.0-main.121";
87177
+ if ("0.10.0-main.123") {
87178
+ return "0.10.0-main.123";
87344
87179
  }
87345
87180
  try {
87346
87181
  const req = createRequire2(import.meta.url);
@@ -87349,8 +87184,8 @@ var init_server3 = __esm({
87349
87184
  return "0.0.0";
87350
87185
  }
87351
87186
  })();
87352
- BUILD_SHA = "8043f5abee602db89815a1ad7ecc319ed0980648";
87353
- BUILD_TIME = "2026-10-21T02:20:10.272Z";
87187
+ BUILD_SHA = "4c65cd9f4d93e78adf4900e8e3459a0b33d38dce";
87188
+ BUILD_TIME = "2026-10-21T13:05:13.604Z";
87354
87189
  SHORT_SHA = BUILD_SHA === "unknown" ? "unknown" : BUILD_SHA.slice(0, 7);
87355
87190
  VERSION_WITH_BUILD = SHORT_SHA === "unknown" ? PKG_VERSION : `${PKG_VERSION}+${SHORT_SHA}`;
87356
87191
  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.121",
3
+ "version": "0.10.0-main.123",
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": "8043f5abee602db89815a1ad7ecc319ed0980648",
23
- "builtAt": "2026-10-21T02:20:10.272Z"
22
+ "sha": "4c65cd9f4d93e78adf4900e8e3459a0b33d38dce",
23
+ "builtAt": "2026-10-21T13:05:13.604Z"
24
24
  }
25
25
  }
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/vcad_kernel_wasm_bg.wasm
3
- size: 35320568 bytes
4
- sha256: 24dd687cb75b71263edce9eab3a9d751c7e679dd114f99b4f49e975a4677756f
3
+ size: 35419240 bytes
4
+ sha256: dd437e1d919dd4a61ab3ba0c9f6fa0f8e01ca3f1b16c592df3b5d4045103b53e