Much as there is some shame in sharing something that I completely vibe-coded, AsyncLineReader has been very handy in our application. Sharing in case anyone else finds it useful. It supports Darwin, Linux and Windows.
(We are previously using swift-commandlinekit, which was great, but needed some unpleasant workarounds with Dispatch semaphores to workaround its lack of async support.)