From da04ea0e9f7f969ad83679b8f5885183e20895ca Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Wed, 13 Aug 2025 21:18:07 -0700 Subject: [PATCH] fix(subflows): added change detection for parallels, updated deploy and status schemas to match parallel/loop (#956) --- .../app/api/workflows/[id]/deploy/route.ts | 13 +++++---- .../app/api/workflows/[id]/status/route.ts | 13 +++++---- apps/sim/lib/workflows/utils.ts | 27 +++++++++++++++++++ 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/apps/sim/app/api/workflows/[id]/deploy/route.ts b/apps/sim/app/api/workflows/[id]/deploy/route.ts index 4b19f9fc25..3684907bee 100644 --- a/apps/sim/app/api/workflows/[id]/deploy/route.ts +++ b/apps/sim/app/api/workflows/[id]/deploy/route.ts @@ -211,16 +211,19 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{ const config = (subflow.config as any) || {} if (subflow.type === 'loop') { loops[subflow.id] = { + id: subflow.id, nodes: config.nodes || [], - iterationCount: config.iterationCount || 1, - iterationType: config.iterationType || 'fixed', - collection: config.collection || '', + iterations: config.iterations || 1, + loopType: config.loopType || 'for', + forEachItems: config.forEachItems || '', } } else if (subflow.type === 'parallel') { parallels[subflow.id] = { + id: subflow.id, nodes: config.nodes || [], - parallelCount: config.parallelCount || 2, - collection: config.collection || '', + count: config.count || 2, + distribution: config.distribution || '', + parallelType: config.parallelType || 'count', } } }) diff --git a/apps/sim/app/api/workflows/[id]/status/route.ts b/apps/sim/app/api/workflows/[id]/status/route.ts index 5bd227b4c5..8b524a1014 100644 --- a/apps/sim/app/api/workflows/[id]/status/route.ts +++ b/apps/sim/app/api/workflows/[id]/status/route.ts @@ -57,16 +57,19 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{ const config = (subflow.config as any) || {} if (subflow.type === 'loop') { loops[subflow.id] = { + id: subflow.id, nodes: config.nodes || [], - iterationCount: config.iterationCount || 1, - iterationType: config.iterationType || 'fixed', - collection: config.collection || '', + iterations: config.iterations || 1, + loopType: config.loopType || 'for', + forEachItems: config.forEachItems || '', } } else if (subflow.type === 'parallel') { parallels[subflow.id] = { + id: subflow.id, nodes: config.nodes || [], - parallelCount: config.parallelCount || 2, - collection: config.collection || '', + count: config.count || 2, + distribution: config.distribution || '', + parallelType: config.parallelType || 'count', } } }) diff --git a/apps/sim/lib/workflows/utils.ts b/apps/sim/lib/workflows/utils.ts index 689bdaa45e..ff3cc10dc7 100644 --- a/apps/sim/lib/workflows/utils.ts +++ b/apps/sim/lib/workflows/utils.ts @@ -313,6 +313,33 @@ export function hasWorkflowChanged( } } + // 5. Compare parallels + const currentParallels = currentState.parallels || {} + const deployedParallels = deployedState.parallels || {} + + const currentParallelIds = Object.keys(currentParallels).sort() + const deployedParallelIds = Object.keys(deployedParallels).sort() + + if ( + currentParallelIds.length !== deployedParallelIds.length || + normalizedStringify(currentParallelIds) !== normalizedStringify(deployedParallelIds) + ) { + return true + } + + // Compare each parallel with normalized values + for (const parallelId of currentParallelIds) { + const normalizedCurrentParallel = normalizeValue(currentParallels[parallelId]) + const normalizedDeployedParallel = normalizeValue(deployedParallels[parallelId]) + + if ( + normalizedStringify(normalizedCurrentParallel) !== + normalizedStringify(normalizedDeployedParallel) + ) { + return true + } + } + return false }