diff --git a/apps/sim/app/api/workflows/[id]/yaml/route.ts b/apps/sim/app/api/workflows/[id]/yaml/route.ts index 54e33237fa..87130e3895 100644 --- a/apps/sim/app/api/workflows/[id]/yaml/route.ts +++ b/apps/sim/app/api/workflows/[id]/yaml/route.ts @@ -10,6 +10,7 @@ import { loadWorkflowFromNormalizedTables, saveWorkflowToNormalizedTables, } from '@/lib/workflows/db-helpers' +import { updateBlockReferences } from '@/lib/workflows/reference-utils' import { sanitizeAgentToolsInBlocks } from '@/lib/workflows/validation' import { getUserId } from '@/app/api/auth/oauth/utils' import { getAllBlocks, getBlock } from '@/blocks' @@ -31,36 +32,6 @@ const YamlWorkflowRequestSchema = z.object({ createCheckpoint: z.boolean().optional().default(false), }) -function updateBlockReferences( - value: any, - blockIdMapping: Map, - requestId: string -): any { - if (typeof value === 'string') { - // Replace references in string values - for (const [oldId, newId] of blockIdMapping.entries()) { - if (value.includes(oldId)) { - value = value.replaceAll(`<${oldId}.`, `<${newId}.`).replaceAll(`%${oldId}.`, `%${newId}.`) - } - } - return value - } - - if (Array.isArray(value)) { - return value.map((item) => updateBlockReferences(item, blockIdMapping, requestId)) - } - - if (value && typeof value === 'object') { - const result: Record = {} - for (const [key, val] of Object.entries(value)) { - result[key] = updateBlockReferences(val, blockIdMapping, requestId) - } - return result - } - - return value -} - /** * Helper function to create a checkpoint before workflow changes */ diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx index c4ea4c6c65..b242851f71 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx @@ -1,16 +1,19 @@ import type React from 'react' import { memo, useMemo, useRef } from 'react' -import { Trash2 } from 'lucide-react' +import { Copy, Trash2 } from 'lucide-react' import { Handle, type NodeProps, Position, useReactFlow } from 'reactflow' import { StartIcon } from '@/components/icons' import { Button } from '@/components/ui/button' import { Card } from '@/components/ui/card' +import { createLogger } from '@/lib/logs/console/logger' import { cn } from '@/lib/utils' import { type DiffStatus, hasDiffStatus } from '@/lib/workflows/diff/types' import { IterationBadges } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/components/iteration-badges/iteration-badges' import { useCurrentWorkflow } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' +const logger = createLogger('SubflowNode') + const SubflowNodeStyles: React.FC = () => { return (