From ae335082fe9e6c865de45731aa10a1d077477ce6 Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Sat, 24 Jan 2026 21:46:10 -0800 Subject: [PATCH 1/3] fix(copilot): canonical modes should be constructed --- .../tools/server/workflow/edit-workflow.ts | 57 ++++++++++++++++++- bun.lock | 1 - 2 files changed, 56 insertions(+), 2 deletions(-) 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 34de7723fb..c2fc1c4ab8 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts @@ -11,9 +11,10 @@ import { extractAndPersistCustomTools } from '@/lib/workflows/persistence/custom import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' import { isValidKey } from '@/lib/workflows/sanitization/key-validation' import { validateWorkflowState } from '@/lib/workflows/sanitization/validation' +import { buildCanonicalIndex, isCanonicalPair } from '@/lib/workflows/subblocks/visibility' import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { getAllBlocks, getBlock } from '@/blocks/registry' -import type { SubBlockConfig } from '@/blocks/types' +import type { BlockConfig, SubBlockConfig } from '@/blocks/types' import { EDGE, normalizeName, RESERVED_BLOCK_NAMES } from '@/executor/constants' import { getUserPermissionConfig } from '@/executor/utils/permission-check' import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils' @@ -667,11 +668,56 @@ function createBlockFromParams( } } }) + + if (validatedInputs) { + updateCanonicalModesForInputs(blockState, Object.keys(validatedInputs), blockConfig) + } } return blockState } +function updateCanonicalModesForInputs( + block: { data?: { canonicalModes?: Record } }, + inputKeys: string[], + blockConfig: BlockConfig +): void { + if (!blockConfig.subBlocks?.length) return + + const canonicalIndex = buildCanonicalIndex(blockConfig.subBlocks) + const canonicalModeUpdates: Record = {} + + for (const inputKey of inputKeys) { + const canonicalId = canonicalIndex.canonicalIdBySubBlockId[inputKey] + if (!canonicalId) continue + + const group = canonicalIndex.groupsById[canonicalId] + if (!group || !isCanonicalPair(group)) continue + + const subBlockConfig = blockConfig.subBlocks.find((sb) => sb.id === inputKey) + if ( + !subBlockConfig?.mode || + subBlockConfig.mode === 'both' || + subBlockConfig.mode === 'trigger' + ) + continue + + const inputMode: 'basic' | 'advanced' = + subBlockConfig.mode === 'advanced' ? 'advanced' : 'basic' + const existingMode = canonicalModeUpdates[canonicalId] + + if (!existingMode || inputMode === 'advanced') { + canonicalModeUpdates[canonicalId] = inputMode + } + } + + if (Object.keys(canonicalModeUpdates).length > 0) { + if (!block.data) block.data = {} + if (!block.data.canonicalModes) block.data.canonicalModes = {} + Object.assign(block.data.canonicalModes, canonicalModeUpdates) + } +} + /** * Normalize tools array by adding back fields that were sanitized for training */ @@ -1654,6 +1700,15 @@ function applyOperationsToWorkflowState( block.data.collection = params.inputs.collection } } + + const editBlockConfig = getBlock(block.type) + if (editBlockConfig) { + updateCanonicalModesForInputs( + block, + Object.keys(validationResult.validInputs), + editBlockConfig + ) + } } // Update basic properties diff --git a/bun.lock b/bun.lock index 4faa352e62..f1df7669ea 100644 --- a/bun.lock +++ b/bun.lock @@ -1,6 +1,5 @@ { "lockfileVersion": 1, - "configVersion": 0, "workspaces": { "": { "name": "simstudio", From 2f9a076f9e60e2bb611e0192d6e5e8fd86a9c4df Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Sat, 24 Jan 2026 21:56:16 -0800 Subject: [PATCH 2/3] reuse canonicalIndex --- .../tools/server/workflow/edit-workflow.ts | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) 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 c2fc1c4ab8..cdaca28b90 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts @@ -694,20 +694,11 @@ function updateCanonicalModesForInputs( const group = canonicalIndex.groupsById[canonicalId] if (!group || !isCanonicalPair(group)) continue - const subBlockConfig = blockConfig.subBlocks.find((sb) => sb.id === inputKey) - if ( - !subBlockConfig?.mode || - subBlockConfig.mode === 'both' || - subBlockConfig.mode === 'trigger' - ) - continue - - const inputMode: 'basic' | 'advanced' = - subBlockConfig.mode === 'advanced' ? 'advanced' : 'basic' + const isAdvanced = group.advancedIds.includes(inputKey) const existingMode = canonicalModeUpdates[canonicalId] - if (!existingMode || inputMode === 'advanced') { - canonicalModeUpdates[canonicalId] = inputMode + if (!existingMode || isAdvanced) { + canonicalModeUpdates[canonicalId] = isAdvanced ? 'advanced' : 'basic' } } From 4de9121ce27b09140ae53f75b6fb1a2dd1319b85 Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Sat, 24 Jan 2026 22:04:10 -0800 Subject: [PATCH 3/3] fix insert into subflow case: --- .../lib/copilot/tools/server/workflow/edit-workflow.ts | 9 +++++++++ 1 file changed, 9 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 cdaca28b90..1e112d3fcf 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts @@ -2302,6 +2302,15 @@ function applyOperationsToWorkflowState( existingBlock.subBlocks[key].value = sanitizedValue } }) + + const existingBlockConfig = getBlock(existingBlock.type) + if (existingBlockConfig) { + updateCanonicalModesForInputs( + existingBlock, + Object.keys(validationResult.validInputs), + existingBlockConfig + ) + } } } else { // Special container types (loop, parallel) are not in the block registry but are valid