From d067fbe3fdb013d51082fd928368032bdd7c01a3 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Mon, 23 Mar 2026 22:16:26 -0400 Subject: [PATCH] fix(windows): use overlapped stdio for spawned pipes --- packages/opencode/src/effect/cross-spawn-spawner.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/effect/cross-spawn-spawner.ts b/packages/opencode/src/effect/cross-spawn-spawner.ts index e99e81c02d..f7b8786d08 100644 --- a/packages/opencode/src/effect/cross-spawn-spawner.ts +++ b/packages/opencode/src/effect/cross-spawn-spawner.ts @@ -148,15 +148,17 @@ export const make = Effect.gen(function* () { serr: ChildProcess.StderrConfig, extra: ReadonlyArray<{ fd: number; config: ChildProcess.AdditionalFdConfig }>, ): NodeChildProcess.StdioOptions => { + const pipe = (x: NodeChildProcess.IOType | undefined) => + process.platform === "win32" && x === "pipe" ? "overlapped" : x const arr: Array = [ - input(sin.stream), - output(sout.stream), - output(serr.stream), + pipe(input(sin.stream)), + pipe(output(sout.stream)), + pipe(output(serr.stream)), ] if (extra.length === 0) return arr as NodeChildProcess.StdioOptions const max = extra.reduce((acc, x) => Math.max(acc, x.fd), 2) for (let i = 3; i <= max; i++) arr[i] = "ignore" - for (const x of extra) arr[x.fd] = "pipe" + for (const x of extra) arr[x.fd] = pipe("pipe") return arr as NodeChildProcess.StdioOptions }