From 802884f8146c8146498e970427b5a4c7f957d19e Mon Sep 17 00:00:00 2001 From: waleed Date: Sat, 31 Jan 2026 20:04:06 -0800 Subject: [PATCH] fix(copilot): add lock checks for insert and extract operations - insert_into_subflow: Check if existing block being moved is locked - extract_from_subflow: Check if block or parent subflow is locked These operations now match the UI behavior where locked blocks cannot be moved into/out of containers. Co-Authored-By: Claude Opus 4.5 --- .../tools/server/workflow/edit-workflow.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts index 54080236d..cfc231bbc 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts @@ -2296,6 +2296,17 @@ function applyOperationsToWorkflowState( break } + // Check if existing block is locked + if (existingBlock.locked) { + logSkippedItem(skippedItems, { + type: 'block_locked', + operationType: 'insert_into_subflow', + blockId: block_id, + reason: `Block "${block_id}" is locked and cannot be moved into a subflow`, + }) + break + } + // Moving existing block into subflow - just update parent existingBlock.data = { ...existingBlock.data, @@ -2441,6 +2452,30 @@ function applyOperationsToWorkflowState( break } + // Check if block is locked + if (block.locked) { + logSkippedItem(skippedItems, { + type: 'block_locked', + operationType: 'extract_from_subflow', + blockId: block_id, + reason: `Block "${block_id}" is locked and cannot be extracted from subflow`, + }) + break + } + + // Check if parent subflow is locked + const parentSubflow = modifiedState.blocks[subflowId] + if (parentSubflow?.locked) { + logSkippedItem(skippedItems, { + type: 'block_locked', + operationType: 'extract_from_subflow', + blockId: block_id, + reason: `Subflow "${subflowId}" is locked - cannot extract block "${block_id}"`, + details: { subflowId }, + }) + break + } + // Verify it's actually a child of this subflow if (block.data?.parentId !== subflowId) { logger.warn('Block is not a child of specified subflow', {