From c9e182216e9b2d12c7ac26a5d2110e62c99fe78c Mon Sep 17 00:00:00 2001 From: Siddharth Ganesan Date: Fri, 30 Jan 2026 17:01:15 -0800 Subject: [PATCH] Stuff --- .../lib/copilot/orchestrator/sse-handlers.ts | 6 ++++ .../tools/server/workflow/edit-workflow.ts | 30 +++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/apps/sim/lib/copilot/orchestrator/sse-handlers.ts b/apps/sim/lib/copilot/orchestrator/sse-handlers.ts index e3b26df53..dbe512b72 100644 --- a/apps/sim/lib/copilot/orchestrator/sse-handlers.ts +++ b/apps/sim/lib/copilot/orchestrator/sse-handlers.ts @@ -202,6 +202,9 @@ export const sseHandlers: Record = { // Respond tools are internal to copilot's subagent system - skip execution // The copilot backend handles these internally to signal subagent completion if (RESPOND_TOOL_SET.has(toolName)) { + toolCall.status = 'success' + toolCall.endTime = Date.now() + toolCall.result = { success: true, output: 'Internal respond tool - handled by copilot backend' } return } @@ -354,6 +357,9 @@ export const subAgentHandlers: Record = { // Respond tools are internal to copilot's subagent system - skip execution if (RESPOND_TOOL_SET.has(toolName)) { + toolCall.status = 'success' + toolCall.endTime = Date.now() + toolCall.result = { success: true, output: 'Internal respond tool - handled by copilot backend' } return } 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 711be838f..3e5d63662 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts @@ -8,6 +8,7 @@ import { validateSelectorIds } from '@/lib/copilot/validation/selector-validator import type { PermissionGroupConfig } from '@/lib/permission-groups/types' import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' import { extractAndPersistCustomTools } from '@/lib/workflows/persistence/custom-tools-persistence' +import { applyAutoLayout } from '@/lib/workflows/autolayout' import { loadWorkflowFromNormalizedTables, saveWorkflowToNormalizedTables, @@ -3072,11 +3073,30 @@ export const editWorkflowServerTool: BaseServerTool = { // Persist the workflow state to the database const finalWorkflowState = validation.sanitizedState || modifiedWorkflowState + + // Apply autolayout to position blocks properly + const layoutResult = applyAutoLayout(finalWorkflowState.blocks, finalWorkflowState.edges, { + horizontalSpacing: 250, + verticalSpacing: 100, + padding: { x: 100, y: 100 }, + }) + + const layoutedBlocks = layoutResult.success && layoutResult.blocks + ? layoutResult.blocks + : finalWorkflowState.blocks + + if (!layoutResult.success) { + logger.warn('Autolayout failed, using default positions', { + workflowId, + error: layoutResult.error, + }) + } + const workflowStateForDb = { - blocks: finalWorkflowState.blocks, + blocks: layoutedBlocks, edges: finalWorkflowState.edges, - loops: generateLoopBlocks(finalWorkflowState.blocks as any), - parallels: generateParallelBlocks(finalWorkflowState.blocks as any), + loops: generateLoopBlocks(layoutedBlocks as any), + parallels: generateParallelBlocks(layoutedBlocks as any), lastSaved: Date.now(), isDeployed: false, } @@ -3101,10 +3121,10 @@ export const editWorkflowServerTool: BaseServerTool = { logger.info('Workflow state persisted to database', { workflowId }) - // Return the modified workflow state for the client to convert to YAML if needed + // Return the modified workflow state with autolayout applied return { success: true, - workflowState: validation.sanitizedState || modifiedWorkflowState, + workflowState: { ...finalWorkflowState, blocks: layoutedBlocks }, // Include input validation errors so the LLM can see what was rejected ...(inputErrors && { inputValidationErrors: inputErrors,