import * as fs from 'fs/promises'; import * as path from 'path'; import type { ToolResult } from '../../types/index.js'; import type { ToolWithMetadata } from '../types.js'; import { loadDescription } from '../load_description.js'; import { getPermissionManager } from '../../permission/index.js'; export const deleteFileTool: ToolWithMetadata = { name: 'delete_file', description: loadDescription('delete_file'), metadata: { name: 'delete_file', category: 'filesystem', description: '删除文件或目录', keywords: ['delete', 'remove', 'file', 'rm', '删除', '移除', '文件'], deferLoading: true, }, parameters: { path: { type: 'string', description: '要删除的文件或目录的路径', required: true, }, recursive: { type: 'boolean', description: '是否递归删除目录(默认 false)', required: false, }, }, execute: async (params: Record): Promise => { const filePath = params.path as string; const recursive = (params.recursive as boolean) || false; const cwd = process.cwd(); const absolutePath = path.isAbsolute(filePath) ? filePath : path.join(cwd, filePath); // 权限检查 const permissionManager = getPermissionManager(); const permResult = await permissionManager.checkFilePermission({ operation: 'delete', path: absolutePath, workdir: cwd, }); if (!permResult.allowed) { if (permResult.needsConfirmation) { return { success: false, output: '', error: `需要用户确认: 删除 ${absolutePath}\n原因: ${permResult.reason || '需要权限确认'}`, }; } return { success: false, output: '', error: `权限被拒绝: ${permResult.reason || '不允许删除此文件'}`, }; } try { const stats = await fs.stat(absolutePath); if (stats.isDirectory()) { if (!recursive) { // 检查目录是否为空 const entries = await fs.readdir(absolutePath); if (entries.length > 0) { return { success: false, output: '', error: `目录不为空。如需删除非空目录,请设置 recursive: true`, }; } await fs.rmdir(absolutePath); } else { await fs.rm(absolutePath, { recursive: true }); } return { success: true, output: `已删除目录: ${absolutePath}`, }; } else { await fs.unlink(absolutePath); return { success: true, output: `已删除文件: ${absolutePath}`, }; } } catch (error) { return { success: false, output: '', error: error instanceof Error ? error.message : String(error), }; } }, };