import { generateId } from '@sim/utils/id' import { getEffectiveBlockOutputs } from '@/lib/workflows/blocks/block-outputs' import { createDefaultInputFormatField } from '@/lib/workflows/input-format' import { getBlock } from '@/blocks' import type { BlockConfig, SubBlockConfig } from '@/blocks/types' import type { BlockState, SubBlockState, WorkflowState } from '@/stores/workflows/workflow/types' export interface DefaultWorkflowArtifacts { workflowState: WorkflowState subBlockValues: Record> startBlockId: string } const START_BLOCK_TYPE = 'start_trigger' const DEFAULT_START_POSITION = { x: 0, y: 0 } function cloneDefaultValue(value: unknown): unknown { if (Array.isArray(value)) { return value.map((item) => cloneDefaultValue(item)) } if (value && typeof value === 'object') { return { ...(value as Record) } } return value ?? null } function resolveInitialValue(subBlock: SubBlockConfig): unknown { if (typeof subBlock.value === 'function') { try { return cloneDefaultValue(subBlock.value({})) } catch (error) { // Ignore resolution errors and fall back to default/null values } } if (subBlock.defaultValue !== undefined) { return cloneDefaultValue(subBlock.defaultValue) } if (subBlock.type === 'input-format') { return [createDefaultInputFormatField()] } if (subBlock.type === 'table') { return [] } return null } function buildStartBlockConfig(): BlockConfig { const blockConfig = getBlock(START_BLOCK_TYPE) if (!blockConfig) { throw new Error('Start trigger block configuration is not registered') } return blockConfig } function buildStartBlockState( blockConfig: BlockConfig, blockId: string ): { blockState: BlockState; subBlockValues: Record } { const subBlocks: Record = {} const subBlockValues: Record = {} blockConfig.subBlocks.forEach((config) => { const initialValue = resolveInitialValue(config) subBlocks[config.id] = { id: config.id, type: config.type, value: (initialValue ?? null) as SubBlockState['value'], } subBlockValues[config.id] = initialValue ?? null }) const outputs = getEffectiveBlockOutputs(blockConfig.type, subBlocks, { triggerMode: false, preferToolOutputs: true, }) const blockState: BlockState = { id: blockId, type: blockConfig.type, name: blockConfig.name, position: { ...DEFAULT_START_POSITION }, subBlocks, outputs, enabled: true, horizontalHandles: true, advancedMode: false, triggerMode: false, height: 0, data: {}, locked: false, } return { blockState, subBlockValues } } export function buildDefaultWorkflowArtifacts(): DefaultWorkflowArtifacts { const blockConfig = buildStartBlockConfig() const startBlockId = generateId() const { blockState, subBlockValues } = buildStartBlockState(blockConfig, startBlockId) const workflowState: WorkflowState = { blocks: { [startBlockId]: blockState, }, edges: [], loops: {}, parallels: {}, lastSaved: Date.now(), } return { workflowState, subBlockValues: { [startBlockId]: subBlockValues, }, startBlockId, } }