diff --git a/packages/paperclip-runner/src/cli/acpx-runtime-sidecar.test.ts b/packages/paperclip-runner/src/cli/acpx-runtime-sidecar.test.ts index 24bc74d381..b783aaac03 100644 --- a/packages/paperclip-runner/src/cli/acpx-runtime-sidecar.test.ts +++ b/packages/paperclip-runner/src/cli/acpx-runtime-sidecar.test.ts @@ -29,6 +29,21 @@ afterEach(async () => { }); describe("qualified ACPX runtime sidecar", () => { + it("shuts down without using readline after stdin closes", async () => { + const sidecar = startSidecar(); + sidecar.write(initializeRequest(1, "codex")); + await expect( + sidecar.next((frame) => frame.id === 1), + ).resolves.toMatchObject({ + id: 1, + ok: true, + }); + + await sidecar.close(); + + expect(sidecar.stderr()).not.toContain("ERR_USE_AFTER_CLOSE"); + }); + it("keeps session admission closed while any cleanup owner remains", () => { const cleanup = Promise.resolve(); diff --git a/packages/paperclip-runner/src/cli/acpx-runtime-sidecar.ts b/packages/paperclip-runner/src/cli/acpx-runtime-sidecar.ts index 78ee146639..bd178192bf 100644 --- a/packages/paperclip-runner/src/cli/acpx-runtime-sidecar.ts +++ b/packages/paperclip-runner/src/cli/acpx-runtime-sidecar.ts @@ -148,7 +148,7 @@ process.once("SIGINT", () => { function requestShutdown(reason: string): void { if (shutdownRequested) return; shutdownRequested = true; - lines.pause(); + if (!lines.closed) lines.pause(); pendingInput = enqueueAcpxSidecarInput( pendingInput, () => shutdown(reason),