fix(snapshot): consolidate to use hasWorkflowChanges check (#3051)

* fix(snapshot): consolidate to use hasWorkflowChanges check

* Remove debug logs

* fix normalization logic

* fix serializer for canonical modes
This commit is contained in:
Vikhyath Mondreti
2026-01-28 16:29:17 -08:00
committed by GitHub
parent 0c0f19c717
commit 9e40342af8
7 changed files with 456 additions and 196 deletions

View File

@@ -1,13 +1,16 @@
import { createLogger } from '@sim/logger'
import type { Edge } from 'reactflow'
import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator'
import type { CanonicalModeOverrides } from '@/lib/workflows/subblocks/visibility'
import {
buildCanonicalIndex,
buildSubBlockValues,
evaluateSubBlockCondition,
getCanonicalValues,
isCanonicalPair,
isNonEmptyValue,
isSubBlockFeatureEnabled,
resolveCanonicalMode,
} from '@/lib/workflows/subblocks/visibility'
import { getBlock } from '@/blocks'
import type { SubBlockConfig } from '@/blocks/types'
@@ -42,7 +45,8 @@ function shouldSerializeSubBlock(
displayAdvancedOptions: boolean,
isTriggerContext: boolean,
isTriggerCategory: boolean,
canonicalIndex: ReturnType<typeof buildCanonicalIndex>
canonicalIndex: ReturnType<typeof buildCanonicalIndex>,
canonicalModeOverrides?: CanonicalModeOverrides
): boolean {
if (!isSubBlockFeatureEnabled(subBlockConfig)) return false
@@ -54,6 +58,18 @@ function shouldSerializeSubBlock(
const isCanonicalMember = Boolean(canonicalIndex.canonicalIdBySubBlockId[subBlockConfig.id])
if (isCanonicalMember) {
const canonicalId = canonicalIndex.canonicalIdBySubBlockId[subBlockConfig.id]
const group = canonicalId ? canonicalIndex.groupsById[canonicalId] : undefined
if (group && isCanonicalPair(group)) {
const mode =
canonicalModeOverrides?.[group.canonicalId] ??
(displayAdvancedOptions ? 'advanced' : resolveCanonicalMode(group, values))
const matchesMode =
mode === 'advanced'
? group.advancedIds.includes(subBlockConfig.id)
: group.basicId === subBlockConfig.id
return matchesMode && evaluateSubBlockCondition(subBlockConfig.condition, values)
}
return evaluateSubBlockCondition(subBlockConfig.condition, values)
}
@@ -327,7 +343,8 @@ export class Serializer {
legacyAdvancedMode,
isTriggerContext,
isTriggerCategory,
canonicalIndex
canonicalIndex,
canonicalModeOverrides
)
)
@@ -351,7 +368,8 @@ export class Serializer {
legacyAdvancedMode,
isTriggerContext,
isTriggerCategory,
canonicalIndex
canonicalIndex,
canonicalModeOverrides
)
) {
params[id] = subBlockConfig.value(params)
@@ -365,9 +383,7 @@ export class Serializer {
const chosen = pairMode === 'advanced' ? advancedValue : basicValue
const sourceIds = [group.basicId, ...group.advancedIds].filter(Boolean) as string[]
sourceIds.forEach((id) => {
if (id !== group.canonicalId) delete params[id]
})
sourceIds.forEach((id) => delete params[id])
if (chosen !== undefined) {
params[group.canonicalId] = chosen
@@ -420,6 +436,8 @@ export class Serializer {
const isTriggerContext = block.triggerMode ?? false
const isTriggerCategory = blockConfig.category === 'triggers'
const canonicalIndex = buildCanonicalIndex(blockConfig.subBlocks || [])
const canonicalModeOverrides = block.data?.canonicalModes
const allValues = buildSubBlockValues(block.subBlocks)
// Iterate through the tool's parameters, not the block's subBlocks
Object.entries(currentTool.params || {}).forEach(([paramId, paramConfig]) => {
@@ -432,11 +450,12 @@ export class Serializer {
shouldValidateParam = matchingConfigs.some((subBlockConfig: any) => {
const includedByMode = shouldSerializeSubBlock(
subBlockConfig,
params,
allValues,
displayAdvancedOptions,
isTriggerContext,
isTriggerCategory,
canonicalIndex
canonicalIndex,
canonicalModeOverrides
)
const isRequired = (() => {
@@ -458,11 +477,12 @@ export class Serializer {
const activeConfig = matchingConfigs.find((config: any) =>
shouldSerializeSubBlock(
config,
params,
allValues,
displayAdvancedOptions,
isTriggerContext,
isTriggerCategory,
canonicalIndex
canonicalIndex,
canonicalModeOverrides
)
)
const displayName = activeConfig?.title || paramId