@vcad/mcp 0.10.0-main.112 → 0.10.0-main.114
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 +276 -14
- 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 a680346430d6b8e6acd07ec8f2821f14ccd6a05f at 2026-10-20T23:26:44.068Z. Source: https://github.com/ecto/vcad
|
package/index.mjs
CHANGED
|
@@ -42019,6 +42019,21 @@ var init_CHANGELOG = __esm({
|
|
|
42019
42019
|
"get_footprint"
|
|
42020
42020
|
]
|
|
42021
42021
|
},
|
|
42022
|
+
{
|
|
42023
|
+
id: "2026-10-20-update-params-apply",
|
|
42024
|
+
version: "0.10.0",
|
|
42025
|
+
date: "2026-10-20",
|
|
42026
|
+
category: "fix",
|
|
42027
|
+
title: "AI updates to part dimensions actually apply",
|
|
42028
|
+
summary: "An update like resizing a cube via size {x,y,z} reported success but changed nothing; nested params now map onto the part's real fields, and unknown params are refused.",
|
|
42029
|
+
features: [
|
|
42030
|
+
"engine",
|
|
42031
|
+
"ai"
|
|
42032
|
+
],
|
|
42033
|
+
mcpTools: [
|
|
42034
|
+
"update"
|
|
42035
|
+
]
|
|
42036
|
+
},
|
|
42022
42037
|
{
|
|
42023
42038
|
id: "2026-10-20-schematic-power-flags",
|
|
42024
42039
|
version: "0.10.0",
|
|
@@ -42152,6 +42167,19 @@ var init_CHANGELOG = __esm({
|
|
|
42152
42167
|
"find_alternatives"
|
|
42153
42168
|
]
|
|
42154
42169
|
},
|
|
42170
|
+
{
|
|
42171
|
+
id: "2026-10-20-import-keeps-materials",
|
|
42172
|
+
version: "0.10.0",
|
|
42173
|
+
date: "2026-10-20",
|
|
42174
|
+
category: "fix",
|
|
42175
|
+
title: "Imported parts keep their material and visibility",
|
|
42176
|
+
summary: "Opening a document through the engine reset every part's material to default and showed hidden parts; both now survive import and every later edit.",
|
|
42177
|
+
features: [
|
|
42178
|
+
"engine",
|
|
42179
|
+
"import",
|
|
42180
|
+
"materials"
|
|
42181
|
+
]
|
|
42182
|
+
},
|
|
42155
42183
|
{
|
|
42156
42184
|
id: "2026-10-20-hierarchical-schematic-sheets",
|
|
42157
42185
|
version: "0.10.0",
|
|
@@ -51371,6 +51399,64 @@ function setSessionScopeProvider(provider) {
|
|
|
51371
51399
|
function activeDocuments() {
|
|
51372
51400
|
return scopeProvider() ?? fallbackDocuments;
|
|
51373
51401
|
}
|
|
51402
|
+
function versionsFor(map) {
|
|
51403
|
+
let v = writeVersions.get(map);
|
|
51404
|
+
if (!v) writeVersions.set(map, v = /* @__PURE__ */ new Map());
|
|
51405
|
+
return v;
|
|
51406
|
+
}
|
|
51407
|
+
function bumpVersion(map, id) {
|
|
51408
|
+
const v = versionsFor(map);
|
|
51409
|
+
v.set(id, (v.get(id) ?? 0) + 1);
|
|
51410
|
+
}
|
|
51411
|
+
function safeFree(engine) {
|
|
51412
|
+
try {
|
|
51413
|
+
engine.free?.();
|
|
51414
|
+
} catch {
|
|
51415
|
+
}
|
|
51416
|
+
}
|
|
51417
|
+
function dropEngineIn(map, id) {
|
|
51418
|
+
const cache2 = engineCaches.get(map);
|
|
51419
|
+
const entry = cache2?.get(id);
|
|
51420
|
+
if (!entry) return;
|
|
51421
|
+
cache2.delete(id);
|
|
51422
|
+
safeFree(entry.engine);
|
|
51423
|
+
}
|
|
51424
|
+
function markDocumentWritten(documentId) {
|
|
51425
|
+
bumpVersion(activeDocuments(), documentId);
|
|
51426
|
+
}
|
|
51427
|
+
function takeCachedEngine(documentId, doc) {
|
|
51428
|
+
const map = activeDocuments();
|
|
51429
|
+
const cache2 = engineCaches.get(map);
|
|
51430
|
+
const entry = cache2?.get(documentId);
|
|
51431
|
+
if (!entry) return null;
|
|
51432
|
+
cache2.delete(documentId);
|
|
51433
|
+
if (entry.doc === doc && map.get(documentId) === doc && entry.version === (versionsFor(map).get(documentId) ?? 0)) {
|
|
51434
|
+
return entry.engine;
|
|
51435
|
+
}
|
|
51436
|
+
safeFree(entry.engine);
|
|
51437
|
+
return null;
|
|
51438
|
+
}
|
|
51439
|
+
function storeEngine(documentId, doc, engine) {
|
|
51440
|
+
const map = activeDocuments();
|
|
51441
|
+
if (map.get(documentId) !== doc) {
|
|
51442
|
+
safeFree(engine);
|
|
51443
|
+
return;
|
|
51444
|
+
}
|
|
51445
|
+
let cache2 = engineCaches.get(map);
|
|
51446
|
+
if (!cache2) engineCaches.set(map, cache2 = /* @__PURE__ */ new Map());
|
|
51447
|
+
const prev = cache2.get(documentId);
|
|
51448
|
+
if (prev && prev.engine !== engine) safeFree(prev.engine);
|
|
51449
|
+
cache2.set(documentId, { engine, doc, version: versionsFor(map).get(documentId) ?? 0 });
|
|
51450
|
+
}
|
|
51451
|
+
function dropEngine(documentId) {
|
|
51452
|
+
dropEngineIn(activeDocuments(), documentId);
|
|
51453
|
+
}
|
|
51454
|
+
function freeScopeEngines(map) {
|
|
51455
|
+
const cache2 = engineCaches.get(map);
|
|
51456
|
+
if (!cache2) return;
|
|
51457
|
+
for (const entry of cache2.values()) safeFree(entry.engine);
|
|
51458
|
+
cache2.clear();
|
|
51459
|
+
}
|
|
51374
51460
|
function randomSuffix() {
|
|
51375
51461
|
const bytes = new Uint8Array(9);
|
|
51376
51462
|
globalThis.crypto.getRandomValues(bytes);
|
|
@@ -51440,9 +51526,10 @@ function resolveDocInput(args, inlineKeys = ["document"]) {
|
|
|
51440
51526
|
function cloneDoc(doc) {
|
|
51441
51527
|
return JSON.parse(JSON.stringify(doc));
|
|
51442
51528
|
}
|
|
51443
|
-
function recordHistorySnapshot(documentId) {
|
|
51529
|
+
function recordHistorySnapshot(documentId, toolName) {
|
|
51444
51530
|
const doc = documents.get(documentId);
|
|
51445
51531
|
if (!doc) return;
|
|
51532
|
+
if (!toolName || !ENGINE_MANAGED_TOOLS.has(toolName)) markDocumentWritten(documentId);
|
|
51446
51533
|
const stack = sessionHistory.get(documentId) ?? [];
|
|
51447
51534
|
stack.push(cloneDoc(doc));
|
|
51448
51535
|
if (stack.length > MAX_HISTORY) stack.shift();
|
|
@@ -51461,6 +51548,7 @@ function undoLastSnapshot(documentId) {
|
|
|
51461
51548
|
}
|
|
51462
51549
|
function clearHistory(documentId) {
|
|
51463
51550
|
sessionHistory.delete(documentId);
|
|
51551
|
+
dropEngine(documentId);
|
|
51464
51552
|
lastChangedParts.delete(documentId);
|
|
51465
51553
|
lastTriangleCount.delete(documentId);
|
|
51466
51554
|
}
|
|
@@ -51478,7 +51566,7 @@ function recordTriangles(documentId, triangles) {
|
|
|
51478
51566
|
function getLastTriangles(documentId) {
|
|
51479
51567
|
return lastTriangleCount.get(documentId) ?? null;
|
|
51480
51568
|
}
|
|
51481
|
-
var fallbackDocuments, scopeProvider, documents, nextId, BOOT_TOKEN_LEN, BOOT_TOKEN, durabilityProbe, documentEnterHooks, MAX_HISTORY, sessionHistory, lastChangedParts, lastTriangleCount;
|
|
51569
|
+
var fallbackDocuments, scopeProvider, documents, engineCaches, writeVersions, ENGINE_MANAGED_TOOLS, nextId, BOOT_TOKEN_LEN, BOOT_TOKEN, durabilityProbe, documentEnterHooks, MAX_HISTORY, sessionHistory, lastChangedParts, lastTriangleCount;
|
|
51482
51570
|
var init_session_core = __esm({
|
|
51483
51571
|
"src/tools/session-core.ts"() {
|
|
51484
51572
|
"use strict";
|
|
@@ -51488,13 +51576,28 @@ var init_session_core = __esm({
|
|
|
51488
51576
|
documents = {
|
|
51489
51577
|
has: (id) => activeDocuments().has(id),
|
|
51490
51578
|
get: (id) => activeDocuments().get(id),
|
|
51491
|
-
set: (id, doc) =>
|
|
51492
|
-
|
|
51493
|
-
|
|
51579
|
+
set: (id, doc) => {
|
|
51580
|
+
const map = activeDocuments();
|
|
51581
|
+
bumpVersion(map, id);
|
|
51582
|
+
return map.set(id, doc);
|
|
51583
|
+
},
|
|
51584
|
+
delete: (id) => {
|
|
51585
|
+
const map = activeDocuments();
|
|
51586
|
+
dropEngineIn(map, id);
|
|
51587
|
+
return map.delete(id);
|
|
51588
|
+
},
|
|
51589
|
+
clear: () => {
|
|
51590
|
+
const map = activeDocuments();
|
|
51591
|
+
freeScopeEngines(map);
|
|
51592
|
+
map.clear();
|
|
51593
|
+
},
|
|
51494
51594
|
get size() {
|
|
51495
51595
|
return activeDocuments().size;
|
|
51496
51596
|
}
|
|
51497
51597
|
};
|
|
51598
|
+
engineCaches = /* @__PURE__ */ new WeakMap();
|
|
51599
|
+
writeVersions = /* @__PURE__ */ new WeakMap();
|
|
51600
|
+
ENGINE_MANAGED_TOOLS = /* @__PURE__ */ new Set(["create", "update", "delete", "set_material"]);
|
|
51498
51601
|
nextId = 1;
|
|
51499
51602
|
BOOT_TOKEN_LEN = 4;
|
|
51500
51603
|
BOOT_TOKEN = randomSuffix().slice(0, BOOT_TOKEN_LEN);
|
|
@@ -53131,7 +53234,21 @@ function durabilityWarning() {
|
|
|
53131
53234
|
}
|
|
53132
53235
|
function runInSessionScope(user, fn) {
|
|
53133
53236
|
if (!user) return fn();
|
|
53134
|
-
|
|
53237
|
+
const documents2 = /* @__PURE__ */ new Map();
|
|
53238
|
+
const release = () => freeScopeEngines(documents2);
|
|
53239
|
+
let out;
|
|
53240
|
+
try {
|
|
53241
|
+
out = sessionScope.run({ documents: documents2, user }, fn);
|
|
53242
|
+
} catch (e) {
|
|
53243
|
+
release();
|
|
53244
|
+
throw e;
|
|
53245
|
+
}
|
|
53246
|
+
if (out && typeof out.then === "function") {
|
|
53247
|
+
out.then(release, release);
|
|
53248
|
+
} else {
|
|
53249
|
+
release();
|
|
53250
|
+
}
|
|
53251
|
+
return out;
|
|
53135
53252
|
}
|
|
53136
53253
|
function currentUser() {
|
|
53137
53254
|
return sessionScope.getStore()?.user ?? null;
|
|
@@ -55719,8 +55836,128 @@ function dispatchRegistryTool(toolName, args, engine) {
|
|
|
55719
55836
|
}
|
|
55720
55837
|
return result;
|
|
55721
55838
|
}
|
|
55722
|
-
function
|
|
55839
|
+
function toStableId(doc, v) {
|
|
55840
|
+
if (typeof v !== "string" && typeof v !== "number") return v;
|
|
55841
|
+
return rootForPartId(doc, v)?.partId ?? String(v);
|
|
55842
|
+
}
|
|
55843
|
+
function owningRootIndex(doc, nodeId) {
|
|
55844
|
+
const exact = doc.roots.findIndex((r) => String(r.root) === nodeId);
|
|
55845
|
+
if (exact >= 0) return exact;
|
|
55846
|
+
return doc.roots.findIndex((r) => {
|
|
55847
|
+
const stack = [r.root];
|
|
55848
|
+
const seen = /* @__PURE__ */ new Set();
|
|
55849
|
+
while (stack.length) {
|
|
55850
|
+
const id = String(stack.pop());
|
|
55851
|
+
if (id === nodeId) return true;
|
|
55852
|
+
if (seen.has(id)) continue;
|
|
55853
|
+
seen.add(id);
|
|
55854
|
+
const op = doc.nodes[id]?.op;
|
|
55855
|
+
if (!op) continue;
|
|
55856
|
+
for (const k of ["child", "left", "right"]) if (op[k] !== void 0) stack.push(op[k]);
|
|
55857
|
+
if (Array.isArray(op.children)) stack.push(...op.children);
|
|
55858
|
+
}
|
|
55859
|
+
return false;
|
|
55860
|
+
});
|
|
55861
|
+
}
|
|
55862
|
+
function nodeRefToStableId(doc, v) {
|
|
55863
|
+
if (typeof v === "number" || typeof v === "string" && /^\d+$/.test(v)) {
|
|
55864
|
+
const idx = owningRootIndex(doc, String(v));
|
|
55865
|
+
if (idx >= 0) return partIdForRoot(doc, idx);
|
|
55866
|
+
}
|
|
55867
|
+
return toStableId(doc, v);
|
|
55868
|
+
}
|
|
55869
|
+
function engineArgs(toolName, args, doc) {
|
|
55870
|
+
const out = toolName === "create" ? applyParamDefaults({ ...args }) : { ...args };
|
|
55871
|
+
if ("part_id" in out) out.part_id = toStableId(doc, out.part_id);
|
|
55872
|
+
if (Array.isArray(out.part_ids)) out.part_ids = out.part_ids.map((v) => toStableId(doc, v));
|
|
55873
|
+
if (out.parent_part_id !== void 0) out.parent_part_id = nodeRefToStableId(doc, out.parent_part_id);
|
|
55874
|
+
if (toolName === "update" && out.node_id !== void 0) {
|
|
55875
|
+
out.node_id = nodeRefToStableId(doc, out.node_id);
|
|
55876
|
+
}
|
|
55877
|
+
if (toolName === "create" && out.params && typeof out.params === "object") {
|
|
55878
|
+
const params = { ...out.params };
|
|
55879
|
+
for (const key3 of ["left", "right", "child"]) {
|
|
55880
|
+
if (key3 in params) params[key3] = nodeRefToStableId(doc, params[key3]);
|
|
55881
|
+
}
|
|
55882
|
+
out.params = params;
|
|
55883
|
+
}
|
|
55884
|
+
return out;
|
|
55885
|
+
}
|
|
55886
|
+
function engineErrorMessage(toolName, args, err9) {
|
|
55887
|
+
switch (err9.kind) {
|
|
55888
|
+
case "unknown_id":
|
|
55889
|
+
return `${toolName}: no part with id "${err9.id ?? "?"}"`;
|
|
55890
|
+
case "invalid":
|
|
55891
|
+
return enrichPlannerError(toolName, args, `${toolName}: ${err9.message ?? "invalid arguments"}`);
|
|
55892
|
+
default:
|
|
55893
|
+
return `${toolName}: ${err9.message ?? err9.kind}`;
|
|
55894
|
+
}
|
|
55895
|
+
}
|
|
55896
|
+
function runMutationViaEngine(toolName, toolArgs, doc, documentId) {
|
|
55897
|
+
if (!ENGINE_LOWERED_TOOLS.has(toolName)) return null;
|
|
55898
|
+
if (process.env.VCAD_MCP_ENGINE_APPLY === "0") return null;
|
|
55899
|
+
const wasm3 = getKernelWasmSync();
|
|
55900
|
+
const factory = wasm3?.WasmDocumentEngine;
|
|
55901
|
+
if (!factory || typeof factory.withReplica !== "function") return null;
|
|
55902
|
+
const cachedEngine = takeCachedEngine(documentId, doc);
|
|
55903
|
+
const engine = cachedEngine ?? factory.withReplica(0);
|
|
55904
|
+
let keep = false;
|
|
55905
|
+
try {
|
|
55906
|
+
if (typeof engine.apply_tool !== "function") return null;
|
|
55907
|
+
const deprecation = typeof toolArgs.part_id === "string" ? partIdDeprecation(toolArgs.part_id, rootForPartId(doc, toolArgs.part_id)) : void 0;
|
|
55908
|
+
const args = engineArgs(toolName, toolArgs, doc);
|
|
55909
|
+
if (!cachedEngine) engine.import_ir(JSON.stringify(doc));
|
|
55910
|
+
const envelope = JSON.parse(engine.apply_tool(toolName, JSON.stringify(args)));
|
|
55911
|
+
if (!envelope.ok || !envelope.result) {
|
|
55912
|
+
const err9 = envelope.error ?? { kind: "invalid", message: "engine returned no result" };
|
|
55913
|
+
if (err9.kind === "unsupported") return null;
|
|
55914
|
+
throw new Error(engineErrorMessage(toolName, args, err9));
|
|
55915
|
+
}
|
|
55916
|
+
const next = envelope.result.document;
|
|
55917
|
+
const parts = envelope.result.parts ?? [];
|
|
55918
|
+
for (const p of parts) {
|
|
55919
|
+
if (!p.name) continue;
|
|
55920
|
+
const rootIdx = next.roots.findIndex((_, i) => next.partIds?.[String(next.roots[i].root)] === p.id);
|
|
55921
|
+
const rootNode = rootIdx >= 0 ? next.nodes[String(next.roots[rootIdx].root)] : void 0;
|
|
55922
|
+
if (rootNode && !rootNode.name) rootNode.name = p.name;
|
|
55923
|
+
}
|
|
55924
|
+
for (const k of Object.keys(doc)) delete doc[k];
|
|
55925
|
+
Object.assign(doc, next);
|
|
55926
|
+
storeEngine(documentId, doc, engine);
|
|
55927
|
+
keep = true;
|
|
55928
|
+
const warnings = [...envelope.result.warnings ?? [], ...deprecation ? [deprecation] : []];
|
|
55929
|
+
const payload = { document_id: documentId };
|
|
55930
|
+
if (toolName === "delete") {
|
|
55931
|
+
payload.removed = args.part_id;
|
|
55932
|
+
} else if (toolName === "set_material") {
|
|
55933
|
+
payload.part_id = args.part_id ?? args.part_ids;
|
|
55934
|
+
payload.material = toolArgs.material;
|
|
55935
|
+
} else {
|
|
55936
|
+
const partId = envelope.result.createdFeatureId ?? (typeof args.part_id === "string" ? args.part_id : void 0);
|
|
55937
|
+
if (partId) {
|
|
55938
|
+
payload.part_id = partId;
|
|
55939
|
+
const part = parts.find((p) => p.id === partId);
|
|
55940
|
+
const root = rootForPartId(doc, partId);
|
|
55941
|
+
const nodeId = part?.primitiveNodeId ?? root?.entry.root;
|
|
55942
|
+
if (nodeId !== void 0) payload.node_id = nodeId;
|
|
55943
|
+
}
|
|
55944
|
+
}
|
|
55945
|
+
if (envelope.result.consumedPartIds?.length) {
|
|
55946
|
+
payload.consumed_part_ids = envelope.result.consumedPartIds;
|
|
55947
|
+
}
|
|
55948
|
+
if (warnings.length) payload.warnings = warnings;
|
|
55949
|
+
return { content: [{ type: "text", text: JSON.stringify(payload) }] };
|
|
55950
|
+
} finally {
|
|
55951
|
+
if (!keep) engine.free?.();
|
|
55952
|
+
}
|
|
55953
|
+
}
|
|
55954
|
+
function runMutation(toolName, rawArgs, doc, documentId, opts = {}) {
|
|
55723
55955
|
const toolArgs = normalizeNodeRefs(toolName, rawArgs, doc);
|
|
55956
|
+
if (opts.engine !== false) {
|
|
55957
|
+
const viaEngine = runMutationViaEngine(toolName, toolArgs, doc, documentId);
|
|
55958
|
+
if (viaEngine) return viaEngine;
|
|
55959
|
+
}
|
|
55960
|
+
if (documentId) markDocumentWritten(documentId);
|
|
55724
55961
|
if (toolName === "delete") {
|
|
55725
55962
|
const partId = String(toolArgs.part_id ?? "");
|
|
55726
55963
|
if (!partId) throw new Error("delete: missing `part_id`");
|
|
@@ -55905,13 +56142,15 @@ function childrenOf(op) {
|
|
|
55905
56142
|
return [];
|
|
55906
56143
|
}
|
|
55907
56144
|
}
|
|
55908
|
-
var BROWSER_ONLY_TOOLS, DEFERRED_TOOLS, READ_ONLY_REGISTRY_TOOLS, MCP_DESCRIPTIONS, CREATE_PARAM_DEFAULTS, CREATE_PARAM_HINTS, NODE_REF_PARAM_KEYS;
|
|
56145
|
+
var BROWSER_ONLY_TOOLS, DEFERRED_TOOLS, READ_ONLY_REGISTRY_TOOLS, MCP_DESCRIPTIONS, CREATE_PARAM_DEFAULTS, CREATE_PARAM_HINTS, NODE_REF_PARAM_KEYS, ENGINE_LOWERED_TOOLS;
|
|
55909
56146
|
var init_registry_dispatch = __esm({
|
|
55910
56147
|
"src/tools/registry-dispatch.ts"() {
|
|
55911
56148
|
"use strict";
|
|
55912
56149
|
init_dist3();
|
|
55913
56150
|
init_session2();
|
|
56151
|
+
init_session_core();
|
|
55914
56152
|
init_part_ids2();
|
|
56153
|
+
init_dist();
|
|
55915
56154
|
init_pose();
|
|
55916
56155
|
init_integrity();
|
|
55917
56156
|
init_measure();
|
|
@@ -55967,6 +56206,26 @@ var init_registry_dispatch = __esm({
|
|
|
55967
56206
|
edge_blend: '{child: nodeId, edges: {type: "All"} | {type: "Near", point: {x,y,z}} | {type: "Direction", axis: {x,y,z}, tol_deg}, profile: {type: "Constant", size, shape} | {type: "Keyed", keys: [{t, size, shape}]}} \u2014 shape 0 = chamfer, 1 = fillet; size in mm'
|
|
55968
56207
|
};
|
|
55969
56208
|
NODE_REF_PARAM_KEYS = ["child", "left", "right", "sketch"];
|
|
56209
|
+
ENGINE_LOWERED_TOOLS = /* @__PURE__ */ new Set([
|
|
56210
|
+
"create",
|
|
56211
|
+
"update",
|
|
56212
|
+
"delete",
|
|
56213
|
+
"set_material",
|
|
56214
|
+
"linear_pattern",
|
|
56215
|
+
"circular_pattern",
|
|
56216
|
+
"mirror",
|
|
56217
|
+
"translate",
|
|
56218
|
+
"rotate",
|
|
56219
|
+
"scale",
|
|
56220
|
+
"union",
|
|
56221
|
+
"difference",
|
|
56222
|
+
"intersection",
|
|
56223
|
+
"fillet",
|
|
56224
|
+
"chamfer",
|
|
56225
|
+
"shell",
|
|
56226
|
+
"tube",
|
|
56227
|
+
"polyline_tube"
|
|
56228
|
+
]);
|
|
55970
56229
|
}
|
|
55971
56230
|
});
|
|
55972
56231
|
|
|
@@ -58041,7 +58300,10 @@ function applyOps(doc, ops, documentId) {
|
|
|
58041
58300
|
name,
|
|
58042
58301
|
resolveSymbolicRefs(args, createdIds, i, doc),
|
|
58043
58302
|
doc,
|
|
58044
|
-
documentId
|
|
58303
|
+
documentId,
|
|
58304
|
+
// Legacy planner: "@N" and raw numeric child refs address the
|
|
58305
|
+
// planner's node numbering (see runMutation).
|
|
58306
|
+
{ engine: false }
|
|
58045
58307
|
);
|
|
58046
58308
|
} catch (err9) {
|
|
58047
58309
|
throw new BatchOpError(i, name, err9);
|
|
@@ -86871,7 +87133,7 @@ async function createServer(existingEngine, context = { user: null }) {
|
|
|
86871
87133
|
}
|
|
86872
87134
|
}
|
|
86873
87135
|
if (incomingId && name !== "undo" && def?.behavior.writesDoc && documents.has(incomingId)) {
|
|
86874
|
-
recordHistorySnapshot(incomingId);
|
|
87136
|
+
recordHistorySnapshot(incomingId, name);
|
|
86875
87137
|
}
|
|
86876
87138
|
const runTool = async () => {
|
|
86877
87139
|
if (!def) {
|
|
@@ -87229,8 +87491,8 @@ var init_server3 = __esm({
|
|
|
87229
87491
|
init_order_feed();
|
|
87230
87492
|
init_animate();
|
|
87231
87493
|
PKG_VERSION = (() => {
|
|
87232
|
-
if ("0.10.0-main.
|
|
87233
|
-
return "0.10.0-main.
|
|
87494
|
+
if ("0.10.0-main.114") {
|
|
87495
|
+
return "0.10.0-main.114";
|
|
87234
87496
|
}
|
|
87235
87497
|
try {
|
|
87236
87498
|
const req = createRequire2(import.meta.url);
|
|
@@ -87239,8 +87501,8 @@ var init_server3 = __esm({
|
|
|
87239
87501
|
return "0.0.0";
|
|
87240
87502
|
}
|
|
87241
87503
|
})();
|
|
87242
|
-
BUILD_SHA = "
|
|
87243
|
-
BUILD_TIME = "2026-10-
|
|
87504
|
+
BUILD_SHA = "a680346430d6b8e6acd07ec8f2821f14ccd6a05f";
|
|
87505
|
+
BUILD_TIME = "2026-10-20T23:26:44.068Z";
|
|
87244
87506
|
SHORT_SHA = BUILD_SHA === "unknown" ? "unknown" : BUILD_SHA.slice(0, 7);
|
|
87245
87507
|
VERSION_WITH_BUILD = SHORT_SHA === "unknown" ? PKG_VERSION : `${PKG_VERSION}+${SHORT_SHA}`;
|
|
87246
87508
|
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.114",
|
|
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": "a680346430d6b8e6acd07ec8f2821f14ccd6a05f",
|
|
23
|
+
"builtAt": "2026-10-20T23:26:44.068Z"
|
|
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: 35323488 bytes
|
|
4
|
+
sha256: 3a4f66bfab16cafe28c6409cd71c6dedcf0a910a856e0649adcff9dce4b7db5a
|