diff options
Diffstat (limited to 'packages/core/src/tools/glob.ts')
| -rw-r--r-- | packages/core/src/tools/glob.ts | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/packages/core/src/tools/glob.ts b/packages/core/src/tools/glob.ts index 6acb2a2b..d94a380a 100644 --- a/packages/core/src/tools/glob.ts +++ b/packages/core/src/tools/glob.ts @@ -6,16 +6,16 @@ import fs from 'fs'; import path from 'path'; -import fg from 'fast-glob'; +import { glob } from 'glob'; import { SchemaValidator } from '../utils/schemaValidator.js'; import { BaseTool, ToolResult } from './tools.js'; import { shortenPath, makeRelative } from '../utils/paths.js'; import { Config } from '../config/config.js'; -// Type definition for file entries returned by fast-glob with stats: true -export interface GlobFileEntry { - path: string; - stats?: fs.Stats; +// Subset of 'Path' interface provided by 'glob' that we can implement for testing +export interface GlobPath { + fullpath(): string; + mtimeMs?: number; } /** @@ -24,14 +24,14 @@ export interface GlobFileEntry { * Older files are listed after recent ones, sorted alphabetically by path. */ export function sortFileEntries( - entries: GlobFileEntry[], + entries: GlobPath[], nowTimestamp: number, recencyThresholdMs: number, -): GlobFileEntry[] { +): GlobPath[] { const sortedEntries = [...entries]; sortedEntries.sort((a, b) => { - const mtimeA = a.stats?.mtime?.getTime() ?? 0; - const mtimeB = b.stats?.mtime?.getTime() ?? 0; + const mtimeA = a.mtimeMs ?? 0; + const mtimeB = b.mtimeMs ?? 0; const aIsRecent = nowTimestamp - mtimeA < recencyThresholdMs; const bIsRecent = nowTimestamp - mtimeB < recencyThresholdMs; @@ -42,7 +42,7 @@ export function sortFileEntries( } else if (bIsRecent) { return 1; } else { - return a.path.localeCompare(b.path); + return a.fullpath().localeCompare(b.fullpath()); } }); return sortedEntries; @@ -201,7 +201,7 @@ export class GlobTool extends BaseTool<GlobToolParams, ToolResult> { */ async execute( params: GlobToolParams, - _signal: AbortSignal, + signal: AbortSignal, ): Promise<ToolResult> { const validationError = this.validateToolParams(params); if (validationError) { @@ -223,26 +223,25 @@ export class GlobTool extends BaseTool<GlobToolParams, ToolResult> { this.config.getFileFilteringRespectGitIgnore(); const fileDiscovery = await this.config.getFileService(); - const entries = await fg(params.pattern, { + const entries = (await glob(params.pattern, { cwd: searchDirAbsolute, - absolute: true, - onlyFiles: true, - stats: true, + withFileTypes: true, + nodir: true, + stat: true, + nocase: !params.case_sensitive, dot: true, - caseSensitiveMatch: params.case_sensitive ?? false, ignore: ['**/node_modules/**', '**/.git/**'], - followSymbolicLinks: false, - suppressErrors: true, - }); + follow: false, + signal, + })) as GlobPath[]; // Apply git-aware filtering if enabled and in git repository let filteredEntries = entries; let gitIgnoredCount = 0; if (respectGitIgnore && fileDiscovery.isGitRepository()) { - const allPaths = entries.map((entry) => entry.path); - const relativePaths = allPaths.map((p) => - path.relative(this.rootDirectory, p), + const relativePaths = entries.map((p) => + path.relative(this.rootDirectory, p.fullpath()), ); const filteredRelativePaths = fileDiscovery.filterFiles(relativePaths, { respectGitIgnore, @@ -252,7 +251,7 @@ export class GlobTool extends BaseTool<GlobToolParams, ToolResult> { ); filteredEntries = entries.filter((entry) => - filteredAbsolutePaths.has(entry.path), + filteredAbsolutePaths.has(entry.fullpath()), ); gitIgnoredCount = entries.length - filteredEntries.length; } @@ -274,12 +273,14 @@ export class GlobTool extends BaseTool<GlobToolParams, ToolResult> { // Sort the filtered entries using the new helper function const sortedEntries = sortFileEntries( - filteredEntries as GlobFileEntry[], // Cast because fast-glob's Entry type is generic + filteredEntries, nowTimestamp, oneDayInMs, ); - const sortedAbsolutePaths = sortedEntries.map((entry) => entry.path); + const sortedAbsolutePaths = sortedEntries.map((entry) => + entry.fullpath(), + ); const fileListDescription = sortedAbsolutePaths.join('\n'); const fileCount = sortedAbsolutePaths.length; |
