summaryrefslogtreecommitdiff
path: root/packages/core/src/tools/glob.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/tools/glob.ts')
-rw-r--r--packages/core/src/tools/glob.ts51
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;