Folder tools

This commit is contained in:
Siddharth Ganesan
2026-04-06 18:43:16 -07:00
parent c52d63303d
commit 0dd1ee041c
4 changed files with 72 additions and 2 deletions

View File

@@ -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 <p className={USER_MESSAGE_CLASSES}>{content}</p>
return <p className={USER_MESSAGE_CLASSES}>{trimmed}</p>
}
const ranges = computeMentionRanges(content, contexts)
if (ranges.length === 0) {
return <p className={USER_MESSAGE_CLASSES}>{content}</p>
return <p className={USER_MESSAGE_CLASSES}>{trimmed}</p>
}
const elements: React.ReactNode[] = []

View File

@@ -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<string> = new Set([
DeployMcp.id,
Redeploy.id,
])
const FOLDER_TOOL_NAMES: Set<string> = new Set([CreateFolder.id, DeleteFolder.id, MoveFolder.id])
const WORKFLOW_MUTATION_TOOL_NAMES: Set<string> = 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(

View File

@@ -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<string, ToolCatalogEntry> = {
[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,

View File

@@ -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<string, ToolHandler> {
[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),