From 28b8d12d3da11bdb744dcac0346143f5720070f3 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Fri, 5 Jun 2026 00:34:32 +0000 Subject: [PATCH] fix(canvas): add ?cascade=true to Pause/Resume API calls ahead of #2122 PR #2122 changes the Pause and Resume endpoints so they default to single-workspace scope and return 409 Conflict when descendants exist unless the caller explicitly passes ?cascade=true. This commit migrates all molecule-core callers to pass ?cascade=true so the existing cascade behavior is preserved after #2122 lands: - ContextMenu.tsx: pause and resume context-menu actions - canvas.ts: batchPause multi-select action - ContextMenu.test.tsx: update mock assertions to match new URLs Refs: #2122 Co-Authored-By: Claude Opus 4.7 --- canvas/src/components/ContextMenu.tsx | 4 ++-- canvas/src/components/__tests__/ContextMenu.test.tsx | 4 ++-- canvas/src/store/canvas.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/canvas/src/components/ContextMenu.tsx b/canvas/src/components/ContextMenu.tsx index 0b8fce505..41dc32543 100644 --- a/canvas/src/components/ContextMenu.tsx +++ b/canvas/src/components/ContextMenu.tsx @@ -172,7 +172,7 @@ export function ContextMenu() { const nodeId = contextMenu.nodeId; closeContextMenu(); try { - await api.post(`/workspaces/${nodeId}/pause`, {}); + await api.post(`/workspaces/${nodeId}/pause?cascade=true`, {}); updateNodeData(nodeId, { status: "paused" }); } catch (e) { showToast("Pause failed", "error"); @@ -184,7 +184,7 @@ export function ContextMenu() { const nodeId = contextMenu.nodeId; closeContextMenu(); try { - await api.post(`/workspaces/${nodeId}/resume`, {}); + await api.post(`/workspaces/${nodeId}/resume?cascade=true`, {}); updateNodeData(nodeId, { status: "provisioning" }); } catch (e) { showToast("Resume failed", "error"); diff --git a/canvas/src/components/__tests__/ContextMenu.test.tsx b/canvas/src/components/__tests__/ContextMenu.test.tsx index ac404d7a4..01d337a64 100644 --- a/canvas/src/components/__tests__/ContextMenu.test.tsx +++ b/canvas/src/components/__tests__/ContextMenu.test.tsx @@ -385,7 +385,7 @@ describe("ContextMenu — item actions", () => { render(); fireEvent.click(screen.getByRole("menuitem", { name: /pause/i })); await act(async () => { /* flush */ }); - expect(mockPost).toHaveBeenCalledWith("/workspaces/n1/pause", {}); + expect(mockPost).toHaveBeenCalledWith("/workspaces/n1/pause?cascade=true", {}); expect(mockStoreState.updateNodeData).toHaveBeenCalledWith("n1", { status: "paused" }); }); @@ -395,7 +395,7 @@ describe("ContextMenu — item actions", () => { render(); fireEvent.click(screen.getByRole("menuitem", { name: /resume/i })); await act(async () => { /* flush */ }); - expect(mockPost).toHaveBeenCalledWith("/workspaces/n1/resume", {}); + expect(mockPost).toHaveBeenCalledWith("/workspaces/n1/resume?cascade=true", {}); }); }); diff --git a/canvas/src/store/canvas.ts b/canvas/src/store/canvas.ts index 7f90e8937..23273f552 100644 --- a/canvas/src/store/canvas.ts +++ b/canvas/src/store/canvas.ts @@ -324,7 +324,7 @@ export const useCanvasStore = create((set, get) => ({ batchPause: async () => { const ids = Array.from(get().selectedNodeIds); const results = await Promise.allSettled( - ids.map((id) => api.post(`/workspaces/${id}/pause`)) + ids.map((id) => api.post(`/workspaces/${id}/pause?cascade=true`)) ); const failed: string[] = []; results.forEach((r, i) => { -- 2.52.0