From c420dad905da54d712b72efc0f36604fcf7f4712 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Thu, 4 Jun 2026 23:36:58 +0000 Subject: [PATCH 1/2] fix(canvas): pass ?cascade=true to Pause/Resume endpoints PR #2122 makes workspace Pause/Resume cascade opt-in via ?cascade=true. Without this parameter, pausing/resuming a workspace with descendants returns 409 Conflict, breaking the Canvas ContextMenu and batch-pause flows that currently depend on implicit cascade behavior. Add ?cascade=true to all Canvas callers so the existing UX behavior is preserved when #2122 lands. Refs: #2122 /sop-ack --- 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 From a061a43e8f79f628b8541b533a80f6dba6ad4b8b Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Fri, 5 Jun 2026 18:33:16 +0000 Subject: [PATCH 2/2] ci: empty commit to re-trigger workflow run -- 2.52.0