From 6639871c92dec5d6f753ed84f9eadbf1ea3f82d5 Mon Sep 17 00:00:00 2001 From: Siddharth Ganesan Date: Fri, 9 Jan 2026 18:26:42 -0800 Subject: [PATCH] Fix lint --- .../api/copilot/chat/update-messages/route.ts | 4 +- .../components/thinking-block.tsx | 4 +- .../copilot-message/copilot-message.tsx | 4 +- .../components/tool-call/tool-call.tsx | 50 ++++++++++++------- apps/sim/lib/copilot/registry.ts | 5 +- .../tools/client/base-subagent-tool.ts | 7 +-- .../copilot/tools/client/init-tool-configs.ts | 15 +++--- .../sim/lib/copilot/tools/client/ui-config.ts | 1 - .../workflow/create-workspace-mcp-server.ts | 1 - .../tools/client/workflow/deploy-api.ts | 1 - .../tools/client/workflow/deploy-chat.ts | 1 - .../tools/client/workflow/deploy-mcp.ts | 6 +-- .../workflow/list-workspace-mcp-servers.ts | 13 +++-- apps/sim/stores/panel/copilot/store.ts | 27 +++++----- apps/sim/stores/workflow-diff/store.ts | 16 +++--- 15 files changed, 87 insertions(+), 68 deletions(-) diff --git a/apps/sim/app/api/copilot/chat/update-messages/route.ts b/apps/sim/app/api/copilot/chat/update-messages/route.ts index f9e273dc91..adb040bcce 100644 --- a/apps/sim/app/api/copilot/chat/update-messages/route.ts +++ b/apps/sim/app/api/copilot/chat/update-messages/route.ts @@ -62,7 +62,7 @@ export async function POST(req: NextRequest) { } const body = await req.json() - + // Debug: Log what we received const lastMsg = body.messages?.[body.messages.length - 1] if (lastMsg?.role === 'assistant') { @@ -74,7 +74,7 @@ export async function POST(req: NextRequest) { lastMsgContentBlockTypes: lastMsg.contentBlocks?.map((b: any) => b?.type) || [], }) } - + const { chatId, messages, planArtifact, config } = UpdateMessagesSchema.parse(body) // Verify that the chat belongs to the user diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/thinking-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/thinking-block.tsx index b5def33467..c92e01ba26 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/thinking-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/thinking-block.tsx @@ -246,7 +246,7 @@ export function ThinkingBlock({ )} > {/* Render markdown during streaming with thinking text styling */} -
+
@@ -286,7 +286,7 @@ export function ThinkingBlock({ )} > {/* Use markdown renderer for completed content */} -
+
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/copilot-message.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/copilot-message.tsx index d06f90b039..c51727d752 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/copilot-message.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/copilot-message.tsx @@ -514,7 +514,9 @@ const CopilotMessage: FC = memo( options={parsedTags.options} onSelect={handleOptionSelect} disabled={isSendingMessage || isStreaming} - enableKeyboardNav={isLastMessage && !isStreaming && parsedTags.optionsComplete === true} + enableKeyboardNav={ + isLastMessage && !isStreaming && parsedTags.optionsComplete === true + } streaming={isStreaming || !parsedTags.optionsComplete} /> )} diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/tool-call/tool-call.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/tool-call/tool-call.tsx index 8dd9f72378..4a67ef3809 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/tool-call/tool-call.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/tool-call/tool-call.tsx @@ -10,10 +10,10 @@ import { getRegisteredTools } from '@/lib/copilot/tools/client/registry' // Initialize all tool UI configs import '@/lib/copilot/tools/client/init-tool-configs' import { - getToolUIConfig, - isSpecialTool as isSpecialToolFromConfig, getSubagentLabels as getSubagentLabelsFromConfig, + getToolUIConfig, hasInterrupt as hasInterruptFromConfig, + isSpecialTool as isSpecialToolFromConfig, } from '@/lib/copilot/tools/client/ui-config' import CopilotMarkdownRenderer from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/markdown-renderer' import { SmoothStreamingText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/smooth-streaming' @@ -357,19 +357,21 @@ export function OptionsSelector({ disabled && 'cursor-not-allowed opacity-50', streaming && 'pointer-events-none', isLocked && 'cursor-default', - isHovered && !streaming && 'is-hovered bg-[var(--surface-6)] dark:bg-[var(--surface-5)]' + isHovered && + !streaming && + 'is-hovered bg-[var(--surface-6)] dark:bg-[var(--surface-5)]' )} > @@ -1158,7 +1160,9 @@ function SubagentContentRenderer({ }, [isStreaming, shouldCollapse]) // Build segments: each segment is either text content or a tool call - const segments: Array<{ type: 'text'; content: string } | { type: 'tool'; block: SubAgentContentBlock }> = [] + const segments: Array< + { type: 'text'; content: string } | { type: 'tool'; block: SubAgentContentBlock } + > = [] let currentText = '' let allRawText = '' @@ -1916,20 +1920,21 @@ export function ToolCall({ toolCall: toolCallProp, toolCallId, onStateChange }: 'workflow', ] const isSubagentTool = SUBAGENT_TOOLS.includes(toolCall.name) - + // For ALL subagent tools, don't show anything until we have blocks with content if (isSubagentTool) { // Check if we have any meaningful content in blocks - const hasContent = toolCall.subAgentBlocks && toolCall.subAgentBlocks.some(block => - (block.type === 'subagent_text' && block.content?.trim()) || - (block.type === 'subagent_tool_call' && block.toolCall) + const hasContent = toolCall.subAgentBlocks?.some( + (block) => + (block.type === 'subagent_text' && block.content?.trim()) || + (block.type === 'subagent_tool_call' && block.toolCall) ) - + if (!hasContent) { return null } } - + if (isSubagentTool && toolCall.subAgentBlocks && toolCall.subAgentBlocks.length > 0) { // Render subagent content using the dedicated component return ( @@ -1975,9 +1980,9 @@ export function ToolCall({ toolCall: toolCallProp, toolCallId, onStateChange }: // Check UI config for secondary action const toolUIConfig = getToolUIConfig(toolCall.name) const secondaryAction = toolUIConfig?.secondaryAction - const showSecondaryAction = - secondaryAction && - secondaryAction.showInStates.includes(toolCall.state as ClientToolCallState) + const showSecondaryAction = secondaryAction?.showInStates.includes( + toolCall.state as ClientToolCallState + ) // Legacy fallbacks for tools that haven't migrated to UI config const showMoveToBackground = @@ -2396,7 +2401,10 @@ export function ToolCall({ toolCall: toolCallProp, toolCallId, onStateChange }: )} {/* Render subagent content as thinking text */} {toolCall.subAgentBlocks && toolCall.subAgentBlocks.length > 0 && ( - + )}
) @@ -2455,7 +2463,10 @@ export function ToolCall({ toolCall: toolCallProp, toolCallId, onStateChange }: )} {/* Render subagent content as thinking text */} {toolCall.subAgentBlocks && toolCall.subAgentBlocks.length > 0 && ( - + )} ) @@ -2564,7 +2575,10 @@ export function ToolCall({ toolCall: toolCallProp, toolCallId, onStateChange }: {/* Render subagent content as thinking text */} {toolCall.subAgentBlocks && toolCall.subAgentBlocks.length > 0 && ( - + )} ) diff --git a/apps/sim/lib/copilot/registry.ts b/apps/sim/lib/copilot/registry.ts index 372edea35f..c1742ea7d5 100644 --- a/apps/sim/lib/copilot/registry.ts +++ b/apps/sim/lib/copilot/registry.ts @@ -121,7 +121,10 @@ export const ToolArgSchemas = { serverId: z .string() .describe('The MCP server ID to deploy to (get from list_workspace_mcp_servers)'), - workflowId: z.string().optional().describe('Optional workflow ID (defaults to active workflow)'), + workflowId: z + .string() + .optional() + .describe('Optional workflow ID (defaults to active workflow)'), toolName: z.string().optional().describe('Custom tool name (defaults to workflow name)'), toolDescription: z.string().optional().describe('Custom tool description'), parameterDescriptions: z diff --git a/apps/sim/lib/copilot/tools/client/base-subagent-tool.ts b/apps/sim/lib/copilot/tools/client/base-subagent-tool.ts index 277fcafb09..7a843dd882 100644 --- a/apps/sim/lib/copilot/tools/client/base-subagent-tool.ts +++ b/apps/sim/lib/copilot/tools/client/base-subagent-tool.ts @@ -8,11 +8,7 @@ * Examples: edit, plan, debug, evaluate, research, etc. */ import type { LucideIcon } from 'lucide-react' -import { - BaseClientTool, - type BaseClientToolMetadata, - ClientToolCallState, -} from './base-tool' +import { BaseClientTool, type BaseClientToolMetadata, ClientToolCallState } from './base-tool' import type { SubagentConfig, ToolUIConfig } from './ui-config' import { registerToolUIConfig } from './ui-config' @@ -122,4 +118,3 @@ export function createSubagentToolClass(config: SubagentToolConfig) { } } } - diff --git a/apps/sim/lib/copilot/tools/client/init-tool-configs.ts b/apps/sim/lib/copilot/tools/client/init-tool-configs.ts index be835835c1..821e5ec8d6 100644 --- a/apps/sim/lib/copilot/tools/client/init-tool-configs.ts +++ b/apps/sim/lib/copilot/tools/client/init-tool-configs.ts @@ -35,15 +35,14 @@ import './user/set-environment-variables' // Re-export UI config utilities for convenience export { - getToolUIConfig, - isSubagentTool, - isSpecialTool, - hasInterrupt, getSubagentLabels, - type ToolUIConfig, - type SubagentConfig, + getToolUIConfig, + hasInterrupt, type InterruptConfig, - type SecondaryActionConfig, + isSpecialTool, + isSubagentTool, type ParamsTableConfig, + type SecondaryActionConfig, + type SubagentConfig, + type ToolUIConfig, } from './ui-config' - diff --git a/apps/sim/lib/copilot/tools/client/ui-config.ts b/apps/sim/lib/copilot/tools/client/ui-config.ts index a49e39ebde..6fac1645c7 100644 --- a/apps/sim/lib/copilot/tools/client/ui-config.ts +++ b/apps/sim/lib/copilot/tools/client/ui-config.ts @@ -236,4 +236,3 @@ export function getSubagentLabels( export function getAllToolUIConfigs(): Record { return { ...toolUIConfigs } } - diff --git a/apps/sim/lib/copilot/tools/client/workflow/create-workspace-mcp-server.ts b/apps/sim/lib/copilot/tools/client/workflow/create-workspace-mcp-server.ts index 8a60094d5e..f50832184f 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/create-workspace-mcp-server.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/create-workspace-mcp-server.ts @@ -153,4 +153,3 @@ export class CreateWorkspaceMcpServerClientTool extends BaseClientTool { await this.handleAccept(args) } } - diff --git a/apps/sim/lib/copilot/tools/client/workflow/deploy-api.ts b/apps/sim/lib/copilot/tools/client/workflow/deploy-api.ts index 35c7c21ced..5b4d9c0b40 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/deploy-api.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/deploy-api.ts @@ -288,4 +288,3 @@ export class DeployApiClientTool extends BaseClientTool { // Register UI config at module load registerToolUIConfig(DeployApiClientTool.id, DeployApiClientTool.metadata.uiConfig!) - diff --git a/apps/sim/lib/copilot/tools/client/workflow/deploy-chat.ts b/apps/sim/lib/copilot/tools/client/workflow/deploy-chat.ts index f7e63c29a0..08fdfe3148 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/deploy-chat.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/deploy-chat.ts @@ -363,4 +363,3 @@ export class DeployChatClientTool extends BaseClientTool { // Register UI config at module load registerToolUIConfig(DeployChatClientTool.id, DeployChatClientTool.metadata.uiConfig!) - diff --git a/apps/sim/lib/copilot/tools/client/workflow/deploy-mcp.ts b/apps/sim/lib/copilot/tools/client/workflow/deploy-mcp.ts index 87ebd233d7..080498473c 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/deploy-mcp.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/deploy-mcp.ts @@ -6,7 +6,6 @@ import { ClientToolCallState, } from '@/lib/copilot/tools/client/base-tool' import { registerToolUIConfig } from '@/lib/copilot/tools/client/ui-config' -import { useCopilotStore } from '@/stores/panel/copilot/store' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' export interface ParameterDescription { @@ -118,7 +117,9 @@ export class DeployMcpClientTool extends BaseClientTool { } // Check if workflow is deployed - const deploymentStatus = useWorkflowRegistry.getState().getWorkflowDeploymentStatus(workflowId) + const deploymentStatus = useWorkflowRegistry + .getState() + .getWorkflowDeploymentStatus(workflowId) if (!deploymentStatus?.isDeployed) { throw new Error( 'Workflow must be deployed before adding as an MCP tool. Use deploy_api first.' @@ -208,4 +209,3 @@ export class DeployMcpClientTool extends BaseClientTool { // Register UI config at module load registerToolUIConfig(DeployMcpClientTool.id, DeployMcpClientTool.metadata.uiConfig!) - diff --git a/apps/sim/lib/copilot/tools/client/workflow/list-workspace-mcp-servers.ts b/apps/sim/lib/copilot/tools/client/workflow/list-workspace-mcp-servers.ts index 763b5bea48..a1aff45288 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/list-workspace-mcp-servers.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/list-workspace-mcp-servers.ts @@ -92,10 +92,14 @@ export class ListWorkspaceMcpServersClientTool extends BaseClientTool { { servers: [], count: 0 } ) } else { - await this.markToolComplete(200, `Found ${servers.length} MCP server(s) in the workspace.`, { - servers, - count: servers.length, - }) + await this.markToolComplete( + 200, + `Found ${servers.length} MCP server(s) in the workspace.`, + { + servers, + count: servers.length, + } + ) } logger.info(`Listed ${servers.length} MCP servers`) @@ -106,4 +110,3 @@ export class ListWorkspaceMcpServersClientTool extends BaseClientTool { } } } - diff --git a/apps/sim/stores/panel/copilot/store.ts b/apps/sim/stores/panel/copilot/store.ts index 438380f6ad..9c49d38041 100644 --- a/apps/sim/stores/panel/copilot/store.ts +++ b/apps/sim/stores/panel/copilot/store.ts @@ -57,7 +57,6 @@ import { DeployApiClientTool } from '@/lib/copilot/tools/client/workflow/deploy- import { DeployChatClientTool } from '@/lib/copilot/tools/client/workflow/deploy-chat' import { DeployMcpClientTool } from '@/lib/copilot/tools/client/workflow/deploy-mcp' import { EditWorkflowClientTool } from '@/lib/copilot/tools/client/workflow/edit-workflow' -import { ListWorkspaceMcpServersClientTool } from '@/lib/copilot/tools/client/workflow/list-workspace-mcp-servers' import { GetBlockOutputsClientTool } from '@/lib/copilot/tools/client/workflow/get-block-outputs' import { GetBlockUpstreamReferencesClientTool } from '@/lib/copilot/tools/client/workflow/get-block-upstream-references' import { GetUserWorkflowClientTool } from '@/lib/copilot/tools/client/workflow/get-user-workflow' @@ -65,6 +64,7 @@ import { GetWorkflowConsoleClientTool } from '@/lib/copilot/tools/client/workflo import { GetWorkflowDataClientTool } from '@/lib/copilot/tools/client/workflow/get-workflow-data' import { GetWorkflowFromNameClientTool } from '@/lib/copilot/tools/client/workflow/get-workflow-from-name' import { ListUserWorkflowsClientTool } from '@/lib/copilot/tools/client/workflow/list-user-workflows' +import { ListWorkspaceMcpServersClientTool } from '@/lib/copilot/tools/client/workflow/list-workspace-mcp-servers' import { ManageCustomToolClientTool } from '@/lib/copilot/tools/client/workflow/manage-custom-tool' import { ManageMcpToolClientTool } from '@/lib/copilot/tools/client/workflow/manage-mcp-tool' import { RunWorkflowClientTool } from '@/lib/copilot/tools/client/workflow/run-workflow' @@ -399,9 +399,9 @@ function normalizeMessagesForUI(messages: CopilotMessage[]): CopilotMessage[] { if (message.role === 'assistant') { logger.info('[normalizeMessagesForUI] Loading assistant message', { id: message.id, - hasContent: !!(message.content && message.content.trim()), + hasContent: !!message.content?.trim(), contentBlockCount: message.contentBlocks?.length || 0, - contentBlockTypes: (message.contentBlocks as any[])?.map(b => b?.type) || [], + contentBlockTypes: (message.contentBlocks as any[])?.map((b) => b?.type) || [], }) } } @@ -642,9 +642,9 @@ function serializeMessagesForDB(messages: CopilotMessage[]): any[] { if (msg.role === 'assistant') { logger.info('[serializeMessagesForDB] Input assistant message', { id: msg.id, - hasContent: !!(msg.content && msg.content.trim()), + hasContent: !!msg.content?.trim(), contentBlockCount: msg.contentBlocks?.length || 0, - contentBlockTypes: (msg.contentBlocks as any[])?.map(b => b?.type) || [], + contentBlockTypes: (msg.contentBlocks as any[])?.map((b) => b?.type) || [], }) } } @@ -652,12 +652,15 @@ function serializeMessagesForDB(messages: CopilotMessage[]): any[] { logger.info('[serializeMessagesForDB] Serialized messages', { inputCount: messages.length, outputCount: result.length, - sample: result.length > 0 ? { - role: result[result.length - 1].role, - hasContent: !!result[result.length - 1].content, - contentBlockCount: result[result.length - 1].contentBlocks?.length || 0, - toolCallCount: result[result.length - 1].toolCalls?.length || 0, - } : null + sample: + result.length > 0 + ? { + role: result[result.length - 1].role, + hasContent: !!result[result.length - 1].content, + contentBlockCount: result[result.length - 1].contentBlocks?.length || 0, + toolCallCount: result[result.length - 1].toolCalls?.length || 0, + } + : null, }) return result @@ -3139,7 +3142,7 @@ export const useCopilotStore = create()( contentLength: lastMsg.content?.length || 0, hasContentBlocks: !!lastMsg.contentBlocks, contentBlockCount: lastMsg.contentBlocks?.length || 0, - contentBlockTypes: (lastMsg.contentBlocks as any[])?.map(b => b?.type) || [], + contentBlockTypes: (lastMsg.contentBlocks as any[])?.map((b) => b?.type) || [], }) } const dbMessages = validateMessagesForLLM(currentMessages) diff --git a/apps/sim/stores/workflow-diff/store.ts b/apps/sim/stores/workflow-diff/store.ts index 54ee8b69d9..dcee3be910 100644 --- a/apps/sim/stores/workflow-diff/store.ts +++ b/apps/sim/stores/workflow-diff/store.ts @@ -448,9 +448,11 @@ export const useWorkflowDiffStore = create { if (toolCallId) { - getClientTool(toolCallId)?.handleAccept?.()?.catch?.((error: Error) => { - logger.warn('Failed to notify tool accept state', { error }) - }) + getClientTool(toolCallId) + ?.handleAccept?.() + ?.catch?.((error: Error) => { + logger.warn('Failed to notify tool accept state', { error }) + }) } }) }, @@ -554,9 +556,11 @@ export const useWorkflowDiffStore = create { if (toolCallId) { - getClientTool(toolCallId)?.handleReject?.()?.catch?.((error: Error) => { - logger.warn('Failed to notify tool reject state', { error }) - }) + getClientTool(toolCallId) + ?.handleReject?.() + ?.catch?.((error: Error) => { + logger.warn('Failed to notify tool reject state', { error }) + }) } }) },