@vcad/mcp 0.10.0-main.121 → 0.10.0-main.122
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 +1 -1
- package/index.mjs +78 -282
- package/package.json +3 -3
- package/vcad_kernel_wasm_bg.wasm +2 -2
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
|
|
9
|
+
Built from 0d1f74805515a4bd023c466963bccf96238bf30e at 2026-10-21T11:51:20.827Z. 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
|
-
|
|
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
|
-
|
|
32905
|
-
|
|
32906
|
-
|
|
32907
|
-
|
|
32908
|
-
|
|
32909
|
-
|
|
32910
|
-
|
|
32911
|
-
|
|
32912
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32976
|
-
|
|
32977
|
-
|
|
32978
|
-
|
|
32979
|
-
|
|
32980
|
-
|
|
32981
|
-
|
|
32982
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32998
|
-
|
|
32999
|
-
|
|
33000
|
-
|
|
33001
|
-
|
|
33002
|
-
|
|
33003
|
-
|
|
33004
|
-
|
|
33005
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
33191
|
-
|
|
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
|
-
|
|
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
|
-
|
|
33212
|
-
|
|
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) => {
|
|
@@ -41837,6 +41620,19 @@ var init_CHANGELOG = __esm({
|
|
|
41837
41620
|
"cli"
|
|
41838
41621
|
]
|
|
41839
41622
|
},
|
|
41623
|
+
{
|
|
41624
|
+
id: "2026-10-21-desktop-agent-blank-canvas",
|
|
41625
|
+
version: "0.10.0",
|
|
41626
|
+
date: "2026-10-21",
|
|
41627
|
+
category: "feat",
|
|
41628
|
+
title: "Agent works from a blank canvas, defaults to frog api",
|
|
41629
|
+
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.",
|
|
41630
|
+
features: [
|
|
41631
|
+
"desktop",
|
|
41632
|
+
"agent",
|
|
41633
|
+
"ai"
|
|
41634
|
+
]
|
|
41635
|
+
},
|
|
41840
41636
|
{
|
|
41841
41637
|
id: "2026-10-21-desktop-agent",
|
|
41842
41638
|
version: "0.10.0",
|
|
@@ -87339,8 +87135,8 @@ var init_server3 = __esm({
|
|
|
87339
87135
|
init_order_feed();
|
|
87340
87136
|
init_animate();
|
|
87341
87137
|
PKG_VERSION = (() => {
|
|
87342
|
-
if ("0.10.0-main.
|
|
87343
|
-
return "0.10.0-main.
|
|
87138
|
+
if ("0.10.0-main.122") {
|
|
87139
|
+
return "0.10.0-main.122";
|
|
87344
87140
|
}
|
|
87345
87141
|
try {
|
|
87346
87142
|
const req = createRequire2(import.meta.url);
|
|
@@ -87349,8 +87145,8 @@ var init_server3 = __esm({
|
|
|
87349
87145
|
return "0.0.0";
|
|
87350
87146
|
}
|
|
87351
87147
|
})();
|
|
87352
|
-
BUILD_SHA = "
|
|
87353
|
-
BUILD_TIME = "2026-10-
|
|
87148
|
+
BUILD_SHA = "0d1f74805515a4bd023c466963bccf96238bf30e";
|
|
87149
|
+
BUILD_TIME = "2026-10-21T11:51:20.827Z";
|
|
87354
87150
|
SHORT_SHA = BUILD_SHA === "unknown" ? "unknown" : BUILD_SHA.slice(0, 7);
|
|
87355
87151
|
VERSION_WITH_BUILD = SHORT_SHA === "unknown" ? PKG_VERSION : `${PKG_VERSION}+${SHORT_SHA}`;
|
|
87356
87152
|
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.
|
|
3
|
+
"version": "0.10.0-main.122",
|
|
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": "
|
|
23
|
-
"builtAt": "2026-10-
|
|
22
|
+
"sha": "0d1f74805515a4bd023c466963bccf96238bf30e",
|
|
23
|
+
"builtAt": "2026-10-21T11:51:20.827Z"
|
|
24
24
|
}
|
|
25
25
|
}
|
package/vcad_kernel_wasm_bg.wasm
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/vcad_kernel_wasm_bg.wasm
|
|
3
|
-
size:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 35344269 bytes
|
|
4
|
+
sha256: f137f70cfc89fa960504f31724d571c662641e65672e7fe45b712c027f5818ef
|