From 345381e61a7e1d73e85f6c36157688ad53346a57 Mon Sep 17 00:00:00 2001 From: "dayuan.jiang" Date: Tue, 30 Dec 2025 00:02:37 +0900 Subject: [PATCH] fix(cascade-delete): recursively collect edge children (labels) - Change from cellsToDelete.add(edgeId) to collectDescendants(edgeId) - Fixes orphaned edge labels causing draw.io to crash/clear canvas - Edge labels (parent=edgeId) are now deleted with their parent edge --- lib/utils.ts | 7 ++++++- packages/mcp-server/package.json | 2 +- packages/mcp-server/src/diagram-operations.ts | 7 ++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/utils.ts b/lib/utils.ts index 18d0c6c..89ba67a 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -674,13 +674,18 @@ export function applyDiagramOperations( collectDescendants(op.cell_id) // Find edges referencing any of the cells to be deleted + // Also recursively collect children of those edges (e.g., edge labels) for (const cellId of cellsToDelete) { const referencingEdges = root.querySelectorAll( `mxCell[source="${cellId}"], mxCell[target="${cellId}"]`, ) referencingEdges.forEach((edge) => { const edgeId = edge.getAttribute("id") - if (edgeId) cellsToDelete.add(edgeId) + // Protect root cells from being added via edge references + if (edgeId && edgeId !== "0" && edgeId !== "1") { + // Recurse to collect edge's children (like labels) + collectDescendants(edgeId) + } }) } diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index 7239235..c0d5b81 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -1,6 +1,6 @@ { "name": "@next-ai-drawio/mcp-server", - "version": "0.1.9", + "version": "0.1.10", "description": "MCP server for Next AI Draw.io - AI-powered diagram generation with real-time browser preview", "type": "module", "main": "dist/index.js", diff --git a/packages/mcp-server/src/diagram-operations.ts b/packages/mcp-server/src/diagram-operations.ts index 511bb4e..93225fc 100644 --- a/packages/mcp-server/src/diagram-operations.ts +++ b/packages/mcp-server/src/diagram-operations.ts @@ -223,13 +223,18 @@ export function applyDiagramOperations( collectDescendants(op.cell_id) // Find edges referencing any of the cells to be deleted + // Also recursively collect children of those edges (e.g., edge labels) for (const cellId of cellsToDelete) { const referencingEdges = root.querySelectorAll( `mxCell[source="${cellId}"], mxCell[target="${cellId}"]`, ) referencingEdges.forEach((edge) => { const edgeId = edge.getAttribute("id") - if (edgeId) cellsToDelete.add(edgeId) + // Protect root cells from being added via edge references + if (edgeId && edgeId !== "0" && edgeId !== "1") { + // Recurse to collect edge's children (like labels) + collectDescendants(edgeId) + } }) }