diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/user-message-content/user-message-content.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/user-message-content/user-message-content.tsx index 3778f8fd1c..d4a3ea7c7c 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/user-message-content/user-message-content.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/user-message-content/user-message-content.tsx @@ -65,14 +65,16 @@ function MentionHighlight({ context }: { context: ChatMessageContext }) { } export function UserMessageContent({ content, contexts }: UserMessageContentProps) { + const trimmed = content.trim() + if (!contexts || contexts.length === 0) { - return

{content}

+ return

{trimmed}

} const ranges = computeMentionRanges(content, contexts) if (ranges.length === 0) { - return

{content}

+ return

{trimmed}

} const elements: React.ReactNode[] = [] diff --git a/apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts b/apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts index 2bb37f8410..8d4e770374 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts +++ b/apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts @@ -20,12 +20,18 @@ import { MothershipStreamV1ToolPhase, } from '@/lib/copilot/generated/mothership-stream-v1' import { + CreateFolder, + DeleteFolder, + DeleteWorkflow, DeployApi, DeployChat, DeployMcp, FileWrite, + MoveFolder, + MoveWorkflow, Read as ReadTool, Redeploy, + RenameWorkflow, ToolSearchToolRegex, WorkspaceFile, } from '@/lib/copilot/generated/tool-catalog-v1' @@ -54,6 +60,7 @@ import { useChatHistory, } from '@/hooks/queries/tasks' import { getFolderMap } from '@/hooks/queries/utils/folder-cache' +import { folderKeys } from '@/hooks/queries/utils/folder-keys' import { invalidateWorkflowSelectors } from '@/hooks/queries/utils/invalidate-workflow-lists' import { getTopInsertionSortOrder } from '@/hooks/queries/utils/top-insertion-sort-order' import { getWorkflowById, getWorkflows } from '@/hooks/queries/utils/workflow-cache' @@ -106,6 +113,14 @@ const DEPLOY_TOOL_NAMES: Set = new Set([ DeployMcp.id, Redeploy.id, ]) + +const FOLDER_TOOL_NAMES: Set = new Set([CreateFolder.id, DeleteFolder.id, MoveFolder.id]) + +const WORKFLOW_MUTATION_TOOL_NAMES: Set = new Set([ + MoveWorkflow.id, + RenameWorkflow.id, + DeleteWorkflow.id, +]) const RECONNECT_TAIL_ERROR = 'Live reconnect failed before the stream finished. The latest response may be incomplete.' const MAX_RECONNECT_ATTEMPTS = 10 @@ -982,6 +997,17 @@ export function useChat( } } + if (FOLDER_TOOL_NAMES.has(tc.name) && tc.status === 'success') { + queryClient.invalidateQueries({ + queryKey: folderKeys.list(workspaceId), + }) + } + if (WORKFLOW_MUTATION_TOOL_NAMES.has(tc.name) && tc.status === 'success') { + queryClient.invalidateQueries({ + queryKey: workflowKeys.list(workspaceId), + }) + } + const extractedResources = tc.status === 'success' && isResourceToolName(tc.name) ? extractResourcesFromToolResult( diff --git a/apps/sim/lib/copilot/generated/tool-catalog-v1.ts b/apps/sim/lib/copilot/generated/tool-catalog-v1.ts index 2b70d91b38..9772e0683f 100644 --- a/apps/sim/lib/copilot/generated/tool-catalog-v1.ts +++ b/apps/sim/lib/copilot/generated/tool-catalog-v1.ts @@ -56,11 +56,14 @@ export interface ToolCatalogEntry { | 'manage_mcp_tool' | 'manage_skill' | 'materialize_file' + | 'move_folder' + | 'move_workflow' | 'oauth_get_auth_link' | 'oauth_request_access' | 'open_resource' | 'read' | 'redeploy' + | 'rename_workflow' | 'research' | 'respond' | 'revert_to_version' @@ -137,11 +140,14 @@ export interface ToolCatalogEntry { | 'manage_mcp_tool' | 'manage_skill' | 'materialize_file' + | 'move_folder' + | 'move_workflow' | 'oauth_get_auth_link' | 'oauth_request_access' | 'open_resource' | 'read' | 'redeploy' + | 'rename_workflow' | 'research' | 'respond' | 'revert_to_version' @@ -573,6 +579,22 @@ export const MaterializeFile: ToolCatalogEntry = { requiredPermission: 'write', } +export const MoveFolder: ToolCatalogEntry = { + id: 'move_folder', + name: 'move_folder', + executor: 'sim', + mode: 'async', + requiredPermission: 'write', +} + +export const MoveWorkflow: ToolCatalogEntry = { + id: 'move_workflow', + name: 'move_workflow', + executor: 'sim', + mode: 'async', + requiredPermission: 'write', +} + export const OauthGetAuthLink: ToolCatalogEntry = { id: 'oauth_get_auth_link', name: 'oauth_get_auth_link', @@ -611,6 +633,14 @@ export const Redeploy: ToolCatalogEntry = { requiredPermission: 'admin', } +export const RenameWorkflow: ToolCatalogEntry = { + id: 'rename_workflow', + name: 'rename_workflow', + executor: 'sim', + mode: 'async', + requiredPermission: 'write', +} + export const Research: ToolCatalogEntry = { id: 'research', name: 'research', @@ -859,11 +889,14 @@ export const TOOL_CATALOG: Record = { [ManageMcpTool.id]: ManageMcpTool, [ManageSkill.id]: ManageSkill, [MaterializeFile.id]: MaterializeFile, + [MoveFolder.id]: MoveFolder, + [MoveWorkflow.id]: MoveWorkflow, [OauthGetAuthLink.id]: OauthGetAuthLink, [OauthRequestAccess.id]: OauthRequestAccess, [OpenResource.id]: OpenResource, [Read.id]: Read, [Redeploy.id]: Redeploy, + [RenameWorkflow.id]: RenameWorkflow, [Research.id]: Research, [Respond.id]: Respond, [RevertToVersion.id]: RevertToVersion, diff --git a/apps/sim/lib/copilot/tool-executor/register-handlers.ts b/apps/sim/lib/copilot/tool-executor/register-handlers.ts index 3095b2d6de..4ee4debeb9 100644 --- a/apps/sim/lib/copilot/tool-executor/register-handlers.ts +++ b/apps/sim/lib/copilot/tool-executor/register-handlers.ts @@ -31,11 +31,14 @@ import { ManageMcpTool, ManageSkill, MaterializeFile, + MoveFolder, + MoveWorkflow, OauthGetAuthLink, OauthRequestAccess, OpenResource, Read as ReadTool, Redeploy, + RenameWorkflow, RevertToVersion, RunBlock, RunFromBlock, @@ -84,6 +87,9 @@ import { executeDeleteFolder, executeDeleteWorkflow, executeGenerateApiKey, + executeMoveFolder, + executeMoveWorkflow, + executeRenameWorkflow, executeRunBlock, executeRunFromBlock, executeRunWorkflow, @@ -132,6 +138,9 @@ function buildHandlerMap(): Record { [CreateFolder.id]: h(executeCreateFolder), [DeleteWorkflow.id]: h(executeDeleteWorkflow), [DeleteFolder.id]: h(executeDeleteFolder), + [RenameWorkflow.id]: h(executeRenameWorkflow), + [MoveWorkflow.id]: h(executeMoveWorkflow), + [MoveFolder.id]: h(executeMoveFolder), [RunWorkflow.id]: h(executeRunWorkflow), [RunWorkflowUntilBlock.id]: h(executeRunWorkflowUntilBlock), [RunFromBlock.id]: h(executeRunFromBlock),