From f2a83a0a005f70aca7298685aec58ec2d6e39afe Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Mon, 13 Apr 2026 10:14:19 -0400 Subject: [PATCH] refactor(file): stream ripgrep search parsing --- packages/opencode/src/file/ripgrep.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/opencode/src/file/ripgrep.ts b/packages/opencode/src/file/ripgrep.ts index 81cd2bf0dc..1d2d4b56d3 100644 --- a/packages/opencode/src/file/ripgrep.ts +++ b/packages/opencode/src/file/ripgrep.ts @@ -408,6 +408,14 @@ export namespace Ripgrep { }) { return yield* Effect.scoped( Effect.gen(function* () { + const parse = Effect.fn("Ripgrep.parse")(function* (line: string) { + const row = yield* Effect.try({ + try: () => Result.parse(JSON.parse(line)), + catch: (cause) => new Error(`invalid ripgrep output: ${cause}`), + }) + if (row.type !== "match") return undefined + return row.data + }) const cmd = yield* args({ mode: "search", glob: input.glob, @@ -428,11 +436,8 @@ export namespace Ripgrep { Stream.decodeText(handle.stdout).pipe( Stream.splitLines, Stream.filter((line) => line.length > 0), - Stream.mapEffect((line) => - decode(line).pipe(Effect.mapError((cause) => new Error("invalid ripgrep output", { cause }))), - ), - Stream.filter((row): row is Schema.Schema.Type => row.type === "match"), - Stream.map((row): Item => row.data), + Stream.mapEffect(parse), + Stream.filter((item): item is Item => item !== undefined), Stream.runCollect, Effect.map((chunk) => [...chunk]), ),