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),