Node reaps children only from its event loop, which a synchronous
compile never returns to, so every replaced or closed tsc-ts process
stayed a zombie until the compile ended: 797 on a pi build, most of
them syntax parsers replaced every 256 K of source. On Linux and macOS
a shell that spawnSync runs and reaps now creates two FIFOs, starts the
server in the background on them and exits; init reaps the server.
The compiler opens the FIFOs with openSync, as it already opens the
Windows named pipe, and closing them ends the session: the server reads
end of file and exits, and is never signaled. This also removes the
dependency on Node's private stream handles. Windows is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>