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 }