batch3 T4 review polish: drop Stats hack, document cache race + total counting
- Drop unused Stats type import and its no-op suppression expression - Comment getProjectFiles concurrent-miss race (benign, accepted) - Comment findFiles deliberate post-limit counting (differs from grep) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -15,6 +15,9 @@ interface CacheEntry {
|
|||||||
|
|
||||||
const cache = new Map<string, CacheEntry>(); // keyed by projectId
|
const cache = new Map<string, CacheEntry>(); // keyed by projectId
|
||||||
|
|
||||||
|
// Concurrent calls with a cold/stale cache may both spawn rg. The result is
|
||||||
|
// deterministic so they overwrite identically — no data corruption, just a
|
||||||
|
// rare extra subprocess. Acceptable for single-user mode.
|
||||||
export async function getProjectFiles(projectId: string, projectRoot: string): Promise<string[]> {
|
export async function getProjectFiles(projectId: string, projectRoot: string): Promise<string[]> {
|
||||||
const current = await snapMtimes(projectRoot);
|
const current = await snapMtimes(projectRoot);
|
||||||
const cached = cache.get(projectId);
|
const cached = cache.get(projectId);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { readFile, readdir, stat } from 'node:fs/promises';
|
import { readFile, readdir, stat } from 'node:fs/promises';
|
||||||
import { resolve, relative } from 'node:path';
|
import { resolve, relative } from 'node:path';
|
||||||
import { spawn } from 'node:child_process';
|
import { spawn } from 'node:child_process';
|
||||||
import type { Stats } from 'node:fs';
|
|
||||||
import { pathGuard, PathScopeError } from './path_guard.js';
|
import { pathGuard, PathScopeError } from './path_guard.js';
|
||||||
|
|
||||||
const MAX_FILE_BYTES = 5 * 1024 * 1024;
|
const MAX_FILE_BYTES = 5 * 1024 * 1024;
|
||||||
@@ -48,9 +47,6 @@ export interface FindFilesResult {
|
|||||||
truncated: boolean;
|
truncated: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Suppress unused import warning — Stats is part of the public API surface
|
|
||||||
void (undefined as unknown as Stats);
|
|
||||||
|
|
||||||
export async function listDir(projectRoot: string, relPath: string): Promise<ListDirResult> {
|
export async function listDir(projectRoot: string, relPath: string): Promise<ListDirResult> {
|
||||||
const real = await pathGuard(projectRoot, relPath);
|
const real = await pathGuard(projectRoot, relPath);
|
||||||
const s = await stat(real);
|
const s = await stat(real);
|
||||||
@@ -224,6 +220,8 @@ export async function findFiles(
|
|||||||
const line = buf.slice(0, idx);
|
const line = buf.slice(0, idx);
|
||||||
buf = buf.slice(idx + 1);
|
buf = buf.slice(idx + 1);
|
||||||
if (!line) continue;
|
if (!line) continue;
|
||||||
|
// Keep counting after limit to report accurate `total` to the caller.
|
||||||
|
// grep kills early since the LLM doesn't need a total; this differs intentionally.
|
||||||
total++;
|
total++;
|
||||||
if (files.length < limit) {
|
if (files.length < limit) {
|
||||||
files.push(relative(projectRoot, line) || line);
|
files.push(relative(projectRoot, line) || line);
|
||||||
|
|||||||
Reference in New Issue
Block a user