Roo-Code/src/core/tools/searchFilesTool.ts
Matt Rubens 10b2fb32ed
Adjust searching outside of the workspace to respect the auto-approve… (#4670)
Adjust searching outside of the workspace to respect the auto-approve checkbox
2025-06-13 18:49:39 -04:00

78 lines
2.3 KiB
TypeScript

import path from "path"
import { Task } from "../task/Task"
import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools"
import { ClineSayTool } from "../../shared/ExtensionMessage"
import { getReadablePath } from "../../utils/path"
import { isPathOutsideWorkspace } from "../../utils/pathUtils"
import { regexSearchFiles } from "../../services/ripgrep"
export async function searchFilesTool(
cline: Task,
block: ToolUse,
askApproval: AskApproval,
handleError: HandleError,
pushToolResult: PushToolResult,
removeClosingTag: RemoveClosingTag,
) {
const relDirPath: string | undefined = block.params.path
const regex: string | undefined = block.params.regex
const filePattern: string | undefined = block.params.file_pattern
const absolutePath = relDirPath ? path.resolve(cline.cwd, relDirPath) : cline.cwd
const isOutsideWorkspace = isPathOutsideWorkspace(absolutePath)
const sharedMessageProps: ClineSayTool = {
tool: "searchFiles",
path: getReadablePath(cline.cwd, removeClosingTag("path", relDirPath)),
regex: removeClosingTag("regex", regex),
filePattern: removeClosingTag("file_pattern", filePattern),
isOutsideWorkspace,
}
try {
if (block.partial) {
const partialMessage = JSON.stringify({ ...sharedMessageProps, content: "" } satisfies ClineSayTool)
await cline.ask("tool", partialMessage, block.partial).catch(() => {})
return
} else {
if (!relDirPath) {
cline.consecutiveMistakeCount++
cline.recordToolError("search_files")
pushToolResult(await cline.sayAndCreateMissingParamError("search_files", "path"))
return
}
if (!regex) {
cline.consecutiveMistakeCount++
cline.recordToolError("search_files")
pushToolResult(await cline.sayAndCreateMissingParamError("search_files", "regex"))
return
}
cline.consecutiveMistakeCount = 0
const results = await regexSearchFiles(
cline.cwd,
absolutePath,
regex,
filePattern,
cline.rooIgnoreController,
)
const completeMessage = JSON.stringify({ ...sharedMessageProps, content: results } satisfies ClineSayTool)
const didApprove = await askApproval("tool", completeMessage)
if (!didApprove) {
return
}
pushToolResult(results)
return
}
} catch (error) {
await handleError("searching files", error)
return
}
}