From d17eaac8b7d2cb5a9c3c96ee697cc9c7406d48e9 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:57:35 +1000 Subject: [PATCH 1/2] fix(shell): bound Windows post-exit pipe draining --- packages/util/src/cross-spawn-spawner.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/util/src/cross-spawn-spawner.ts b/packages/util/src/cross-spawn-spawner.ts index 0ca2cb156fc6..d0809b11d46f 100644 --- a/packages/util/src/cross-spawn-spawner.ts +++ b/packages/util/src/cross-spawn-spawner.ts @@ -266,6 +266,15 @@ const makeCrossSpawnSpawner = Effect.gen(function* () { }) proc.on("exit", (...args) => { exit = args + if (process.platform !== "win32") return + // Descendants can keep Windows stdio open after exit. Bound the EOF wait; + // the output pump still drains buffered chunks and flushes its file. + const drain = setTimeout(() => { + proc.stdout?.push(null) + proc.stderr?.push(null) + }, 1000) + drain.unref() + proc.once("close", () => clearTimeout(drain)) }) proc.on("close", (...args) => { if (end) return From ba4dd934ef307475fd4d78c0fd66f3e1ffd3ff2e Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Sat, 29 Aug 2026 14:16:56 +1000 Subject: [PATCH 2/2] fix(shell): shorten Windows drain window to 200ms --- packages/util/src/cross-spawn-spawner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/util/src/cross-spawn-spawner.ts b/packages/util/src/cross-spawn-spawner.ts index d0809b11d46f..f583100363b5 100644 --- a/packages/util/src/cross-spawn-spawner.ts +++ b/packages/util/src/cross-spawn-spawner.ts @@ -272,7 +272,7 @@ const makeCrossSpawnSpawner = Effect.gen(function* () { const drain = setTimeout(() => { proc.stdout?.push(null) proc.stderr?.push(null) - }, 1000) + }, 200) drain.unref() proc.once("close", () => clearTimeout(drain)) })