Skip to content

Commit bb944d6

Browse files
waleedlatif1claude
andcommitted
feat(mothership): remove resource-level delete tools from copilot
Remove delete operations for workflows, folders, tables, and files from the mothership copilot to prevent destructive actions via AI. Row-level and column-level deletes are preserved. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1413d8a commit bb944d6

File tree

7 files changed

+3
-108
lines changed

7 files changed

+3
-108
lines changed

apps/sim/lib/copilot/orchestrator/tool-executor/index.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ import type {
5252
CreateFolderParams,
5353
CreateWorkflowParams,
5454
CreateWorkspaceMcpServerParams,
55-
DeleteFolderParams,
56-
DeleteWorkflowParams,
5755
DeleteWorkspaceMcpServerParams,
5856
DeployApiParams,
5957
DeployChatParams,
@@ -82,8 +80,6 @@ import { executeVfsGlob, executeVfsGrep, executeVfsList, executeVfsRead } from '
8280
import {
8381
executeCreateFolder,
8482
executeCreateWorkflow,
85-
executeDeleteFolder,
86-
executeDeleteWorkflow,
8783
executeGenerateApiKey,
8884
executeGetBlockOutputs,
8985
executeGetBlockUpstreamReferences,
@@ -836,11 +832,9 @@ const SIM_WORKFLOW_TOOL_HANDLERS: Record<
836832
create_folder: (p, c) => executeCreateFolder(p as CreateFolderParams, c),
837833
rename_workflow: (p, c) => executeRenameWorkflow(p as unknown as RenameWorkflowParams, c),
838834
update_workflow: (p, c) => executeUpdateWorkflow(p as unknown as UpdateWorkflowParams, c),
839-
delete_workflow: (p, c) => executeDeleteWorkflow(p as unknown as DeleteWorkflowParams, c),
840835
move_workflow: (p, c) => executeMoveWorkflow(p as unknown as MoveWorkflowParams, c),
841836
move_folder: (p, c) => executeMoveFolder(p as unknown as MoveFolderParams, c),
842837
rename_folder: (p, c) => executeRenameFolder(p as unknown as RenameFolderParams, c),
843-
delete_folder: (p, c) => executeDeleteFolder(p as unknown as DeleteFolderParams, c),
844838
get_workflow_data: (p, c) => executeGetWorkflowData(p as GetWorkflowDataParams, c),
845839
get_block_outputs: (p, c) => executeGetBlockOutputs(p as GetBlockOutputsParams, c),
846840
get_block_upstream_references: (p, c) =>

apps/sim/lib/copilot/orchestrator/tool-executor/param-types.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,6 @@ export interface UpdateWorkflowParams {
169169
description?: string
170170
}
171171

172-
export interface DeleteWorkflowParams {
173-
workflowId: string
174-
}
175-
176172
export interface MoveWorkflowParams {
177173
workflowId: string
178174
folderId: string | null
@@ -188,10 +184,6 @@ export interface RenameFolderParams {
188184
name: string
189185
}
190186

191-
export interface DeleteFolderParams {
192-
folderId: string
193-
}
194-
195187
export interface UpdateWorkspaceMcpServerParams {
196188
serverId: string
197189
name?: string

apps/sim/lib/copilot/orchestrator/tool-executor/workflow-tools/mutations.ts

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import {
1111
import {
1212
createFolderRecord,
1313
createWorkflowRecord,
14-
deleteFolderRecord,
15-
deleteWorkflowRecord,
1614
setWorkflowVariables,
1715
updateFolderRecord,
1816
updateWorkflowRecord,
@@ -70,8 +68,6 @@ function buildExecutionError(error: unknown): ToolCallResult {
7068
import type {
7169
CreateFolderParams,
7270
CreateWorkflowParams,
73-
DeleteFolderParams,
74-
DeleteWorkflowParams,
7571
GenerateApiKeyParams,
7672
MoveFolderParams,
7773
MoveWorkflowParams,
@@ -550,28 +546,6 @@ export async function executeUpdateWorkflow(
550546
}
551547
}
552548

553-
export async function executeDeleteWorkflow(
554-
params: DeleteWorkflowParams,
555-
context: ExecutionContext
556-
): Promise<ToolCallResult> {
557-
try {
558-
const workflowId = params.workflowId
559-
if (!workflowId) {
560-
return { success: false, error: 'workflowId is required' }
561-
}
562-
563-
const { workflow: workflowRecord } = await ensureWorkflowAccess(workflowId, context.userId)
564-
await deleteWorkflowRecord(workflowId)
565-
566-
return {
567-
success: true,
568-
output: { workflowId, name: workflowRecord.name, deleted: true },
569-
}
570-
} catch (error) {
571-
return { success: false, error: error instanceof Error ? error.message : String(error) }
572-
}
573-
}
574-
575549
export async function executeRenameFolder(
576550
params: RenameFolderParams,
577551
context: ExecutionContext
@@ -597,27 +571,6 @@ export async function executeRenameFolder(
597571
}
598572
}
599573

600-
export async function executeDeleteFolder(
601-
params: DeleteFolderParams,
602-
context: ExecutionContext
603-
): Promise<ToolCallResult> {
604-
try {
605-
const folderId = params.folderId
606-
if (!folderId) {
607-
return { success: false, error: 'folderId is required' }
608-
}
609-
610-
const deleted = await deleteFolderRecord(folderId)
611-
if (!deleted) {
612-
return { success: false, error: 'Folder not found' }
613-
}
614-
615-
return { success: true, output: { folderId, deleted: true } }
616-
} catch (error) {
617-
return { success: false, error: error instanceof Error ? error.message : String(error) }
618-
}
619-
}
620-
621574
export async function executeRunBlock(
622575
params: RunBlockParams,
623576
context: ExecutionContext

apps/sim/lib/copilot/tools/server/files/workspace-file.ts

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { createLogger } from '@sim/logger'
22
import type { BaseServerTool, ServerToolContext } from '@/lib/copilot/tools/server/base-tool'
33
import type { WorkspaceFileArgs, WorkspaceFileResult } from '@/lib/copilot/tools/shared/schemas'
44
import {
5-
deleteWorkspaceFile,
65
getWorkspaceFile,
76
renameWorkspaceFile,
87
updateWorkspaceFileContent,
@@ -159,36 +158,10 @@ export const workspaceFileServerTool: BaseServerTool<WorkspaceFileArgs, Workspac
159158
}
160159
}
161160

162-
case 'delete': {
163-
const fileId = (args as Record<string, unknown>).fileId as string | undefined
164-
if (!fileId) {
165-
return { success: false, message: 'fileId is required for delete operation' }
166-
}
167-
168-
const fileRecord = await getWorkspaceFile(workspaceId, fileId)
169-
if (!fileRecord) {
170-
return { success: false, message: `File with ID "${fileId}" not found` }
171-
}
172-
173-
await deleteWorkspaceFile(workspaceId, fileId)
174-
175-
logger.info('Workspace file deleted via copilot', {
176-
fileId,
177-
name: fileRecord.name,
178-
userId: context.userId,
179-
})
180-
181-
return {
182-
success: true,
183-
message: `File "${fileRecord.name}" deleted successfully`,
184-
data: { id: fileId, name: fileRecord.name },
185-
}
186-
}
187-
188161
default:
189162
return {
190163
success: false,
191-
message: `Unknown operation: ${operation}. Supported: write, update, rename, delete. Use the filesystem to list/read files.`,
164+
message: `Unknown operation: ${operation}. Supported: write, update, rename. Use the filesystem to list/read files.`,
192165
}
193166
}
194167
} catch (error) {

apps/sim/lib/copilot/tools/server/router.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ const WRITE_ACTIONS: Record<string, string[]> = {
4141
'create',
4242
'create_from_file',
4343
'import_file',
44-
'delete',
4544
'insert_row',
4645
'batch_insert_rows',
4746
'update_row',
@@ -57,7 +56,7 @@ const WRITE_ACTIONS: Record<string, string[]> = {
5756
manage_mcp_tool: ['add', 'edit', 'delete'],
5857
manage_skill: ['add', 'edit', 'delete'],
5958
manage_credential: ['rename', 'delete'],
60-
workspace_file: ['write', 'update', 'delete', 'rename'],
59+
workspace_file: ['write', 'update', 'rename'],
6160
}
6261

6362
function isActionAllowed(toolName: string, action: string, userPermission: string): boolean {

apps/sim/lib/copilot/tools/server/table/user-table.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
deleteRow,
1313
deleteRowsByFilter,
1414
deleteRowsByIds,
15-
deleteTable,
1615
getRowById,
1716
getTableById,
1817
insertRow,
@@ -275,20 +274,6 @@ export const userTableServerTool: BaseServerTool<UserTableArgs, UserTableResult>
275274
}
276275
}
277276

278-
case 'delete': {
279-
if (!args.tableId) {
280-
return { success: false, message: 'Table ID is required' }
281-
}
282-
283-
const requestId = crypto.randomUUID().slice(0, 8)
284-
await deleteTable(args.tableId, requestId)
285-
286-
return {
287-
success: true,
288-
message: `Deleted table ${args.tableId}`,
289-
}
290-
}
291-
292277
case 'insert_row': {
293278
if (!args.tableId) {
294279
return { success: false, message: 'Table ID is required' }

apps/sim/lib/copilot/tools/shared/schemas.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ export const UserTableArgsSchema = z.object({
112112
'import_file',
113113
'get',
114114
'get_schema',
115-
'delete',
116115
'insert_row',
117116
'batch_insert_rows',
118117
'get_row',
@@ -172,7 +171,7 @@ export type UserTableResult = z.infer<typeof UserTableResultSchema>
172171

173172
// workspace_file - shared schema used by server tool and Go catalog
174173
export const WorkspaceFileArgsSchema = z.object({
175-
operation: z.enum(['write', 'update', 'delete', 'rename']),
174+
operation: z.enum(['write', 'update', 'rename']),
176175
args: z
177176
.object({
178177
fileId: z.string().optional(),

0 commit comments

Comments
 (0)