diff --git a/packages/opencode/src/file/ripgrep.ts b/packages/opencode/src/file/ripgrep.ts index 0d1817356..0f6889779 100644 --- a/packages/opencode/src/file/ripgrep.ts +++ b/packages/opencode/src/file/ripgrep.ts @@ -209,7 +209,10 @@ export namespace Ripgrep { hidden?: boolean follow?: boolean maxDepth?: number + signal?: AbortSignal }) { + input.signal?.throwIfAborted() + const args = [await filepath(), "--files", "--glob=!.git/*"] if (input.follow !== false) args.push("--follow") if (input.hidden !== false) args.push("--hidden") @@ -235,6 +238,7 @@ export namespace Ripgrep { stdout: "pipe", stderr: "ignore", maxBuffer: 1024 * 1024 * 20, + signal: input.signal, }) const reader = proc.stdout.getReader() @@ -243,6 +247,8 @@ export namespace Ripgrep { try { while (true) { + input.signal?.throwIfAborted() + const { done, value } = await reader.read() if (done) break @@ -261,11 +267,13 @@ export namespace Ripgrep { reader.releaseLock() await proc.exited } + + input.signal?.throwIfAborted() } - export async function tree(input: { cwd: string; limit?: number }) { + export async function tree(input: { cwd: string; limit?: number; signal?: AbortSignal }) { log.info("tree", input) - const files = await Array.fromAsync(Ripgrep.files({ cwd: input.cwd })) + const files = await Array.fromAsync(Ripgrep.files({ cwd: input.cwd, signal: input.signal })) interface Node { path: string[] children: Node[] diff --git a/packages/opencode/src/tool/glob.ts b/packages/opencode/src/tool/glob.ts index dda57f6ee..6943795f8 100644 --- a/packages/opencode/src/tool/glob.ts +++ b/packages/opencode/src/tool/glob.ts @@ -38,6 +38,7 @@ export const GlobTool = Tool.define("glob", { for await (const file of Ripgrep.files({ cwd: search, glob: [params.pattern], + signal: ctx.abort, })) { if (files.length >= limit) { truncated = true diff --git a/packages/opencode/src/tool/ls.ts b/packages/opencode/src/tool/ls.ts index cc3d75007..b848e969b 100644 --- a/packages/opencode/src/tool/ls.ts +++ b/packages/opencode/src/tool/ls.ts @@ -56,7 +56,7 @@ export const ListTool = Tool.define("list", { const ignoreGlobs = IGNORE_PATTERNS.map((p) => `!${p}*`).concat(params.ignore?.map((p) => `!${p}`) || []) const files = [] - for await (const file of Ripgrep.files({ cwd: searchPath, glob: ignoreGlobs })) { + for await (const file of Ripgrep.files({ cwd: searchPath, glob: ignoreGlobs, signal: ctx.abort })) { files.push(file) if (files.length >= LIMIT) break }