diff --git a/packages/opencode/src/file/ripgrep.ts b/packages/opencode/src/file/ripgrep.ts index 5de4a13c91..b18221100a 100644 --- a/packages/opencode/src/file/ripgrep.ts +++ b/packages/opencode/src/file/ripgrep.ts @@ -5,8 +5,6 @@ import fs from "fs/promises" import z from "zod" import { NamedError } from "@opencode-ai/util/error" import { lazy } from "../util/lazy" -import { $ } from "bun" - import { ZipReader, BlobReader, BlobWriter } from "@zip.js/zip.js" import { Log } from "@/util/log" @@ -368,11 +366,11 @@ export namespace Ripgrep { } export async function search(input: { cwd: string; pattern: string; glob?: string[]; limit?: number }) { - const args = [`${await filepath()}`, "--json", "--hidden", "--glob='!.git/*'"] + const args = [await filepath(), "--json", "--hidden", "--glob=!.git/*"] if (input.glob) { for (const g of input.glob) { - args.push(`--glob='${g}'`) + args.push(`--glob=${g}`) } } @@ -383,15 +381,21 @@ export namespace Ripgrep { args.push("--") args.push(input.pattern) - const command = args.join(" ") - const result = await $`${{ raw: command }}`.cwd(input.cwd).quiet().nothrow() - if (result.exitCode !== 0) { + const proc = Bun.spawn(args, { + cwd: input.cwd, + stdout: "pipe", + stderr: "ignore", + }) + + const output = await Bun.readableStreamToText(proc.stdout) + await proc.exited + + if (proc.exitCode !== 0) { return [] } // Handle both Unix (\n) and Windows (\r\n) line endings - const lines = result.text().trim().split(/\r?\n/).filter(Boolean) - // Parse JSON lines from ripgrep output + const lines = output.trim().split(/\r?\n/).filter(Boolean) return lines .map((line) => JSON.parse(line))