From c19263e25fc76ce6d0cb2003e57d511d0f8f08e9 Mon Sep 17 00:00:00 2001 From: waleed Date: Sat, 31 Jan 2026 18:42:06 -0800 Subject: [PATCH] fix(duplicate): unlock all blocks when duplicating workflow - Server-side workflow duplication now sets locked: false for all blocks - regenerateWorkflowStateIds also unlocks blocks for templates - Client-side regenerateBlockIds already handled this (for paste/import) Co-Authored-By: Claude Opus 4.5 --- apps/sim/lib/workflows/persistence/duplicate.ts | 1 + apps/sim/lib/workflows/persistence/utils.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/sim/lib/workflows/persistence/duplicate.ts b/apps/sim/lib/workflows/persistence/duplicate.ts index d73df91cc..8e006e076 100644 --- a/apps/sim/lib/workflows/persistence/duplicate.ts +++ b/apps/sim/lib/workflows/persistence/duplicate.ts @@ -189,6 +189,7 @@ export async function duplicateWorkflow( parentId: newParentId, extent: newExtent, data: updatedData, + locked: false, // Duplicated blocks should always be unlocked createdAt: now, updatedAt: now, } diff --git a/apps/sim/lib/workflows/persistence/utils.ts b/apps/sim/lib/workflows/persistence/utils.ts index fc990682a..b747177e3 100644 --- a/apps/sim/lib/workflows/persistence/utils.ts +++ b/apps/sim/lib/workflows/persistence/utils.ts @@ -629,7 +629,8 @@ export function regenerateWorkflowStateIds(state: RegenerateStateInput): Regener // Regenerate blocks with updated references Object.entries(state.blocks || {}).forEach(([oldId, block]) => { const newId = blockIdMapping.get(oldId)! - const newBlock: BlockState = { ...block, id: newId } + // Duplicated blocks are always unlocked so users can edit them + const newBlock: BlockState = { ...block, id: newId, locked: false } // Update parentId reference if it exists if (newBlock.data?.parentId) {