(signal: AbortSignal)
| 105 | } |
| 106 | |
| 107 | async execute(signal: AbortSignal): Promise<ToolResult> { |
| 108 | try { |
| 109 | const workspaceContext = this.config.getWorkspaceContext(); |
| 110 | const workspaceDirectories = workspaceContext.getDirectories(); |
| 111 | |
| 112 | // If a specific path is provided, resolve it and check if it's within workspace |
| 113 | let searchDirectories: readonly string[]; |
| 114 | if (this.params.path) { |
| 115 | const searchDirAbsolute = path.resolve( |
| 116 | this.config.getTargetDir(), |
| 117 | this.params.path, |
| 118 | ); |
| 119 | if (!workspaceContext.isPathWithinWorkspace(searchDirAbsolute)) { |
| 120 | return { |
| 121 | llmContent: `Error: Path "${this.params.path}" is not within any workspace directory`, |
| 122 | returnDisplay: `Path is not within workspace`, |
| 123 | }; |
| 124 | } |
| 125 | searchDirectories = [searchDirAbsolute]; |
| 126 | } else { |
| 127 | // Search across all workspace directories |
| 128 | searchDirectories = workspaceDirectories; |
| 129 | } |
| 130 | |
| 131 | // Get centralized file discovery service |
| 132 | const respectGitIgnore = |
| 133 | this.params.respect_git_ignore ?? |
| 134 | this.config.getFileFilteringRespectGitIgnore(); |
| 135 | const fileDiscovery = this.config.getFileService(); |
| 136 | |
| 137 | // Collect entries from all search directories |
| 138 | let allEntries: GlobPath[] = []; |
| 139 | |
| 140 | for (const searchDir of searchDirectories) { |
| 141 | const entries = (await glob(this.params.pattern, { |
| 142 | cwd: searchDir, |
| 143 | withFileTypes: true, |
| 144 | nodir: true, |
| 145 | stat: true, |
| 146 | nocase: !this.params.case_sensitive, |
| 147 | dot: true, |
| 148 | ignore: ['**/node_modules/**', '**/.git/**'], |
| 149 | follow: false, |
| 150 | signal, |
| 151 | })) as GlobPath[]; |
| 152 | |
| 153 | allEntries = allEntries.concat(entries); |
| 154 | } |
| 155 | |
| 156 | const entries = allEntries; |
| 157 | |
| 158 | // Apply git-aware filtering if enabled and in git repository |
| 159 | let filteredEntries = entries; |
| 160 | let gitIgnoredCount = 0; |
| 161 | |
| 162 | if (respectGitIgnore) { |
| 163 | const relativePaths = entries.map((p) => |
| 164 | path.relative(this.config.getTargetDir(), p.fullpath()), |
nothing calls this directly
no test coverage detected