From 476ca3d877b5c25da4a427b6c09b86d3a6d95ba4 Mon Sep 17 00:00:00 2001 From: Dotta Date: Wed, 2 Sep 2026 18:45:12 -0500 Subject: [PATCH] fix(runner): close ACPX sidecar stdin cleanly --- .../src/cli/acpx-runtime-sidecar.test.ts | 15 +++++++++++++++ .../src/cli/acpx-runtime-sidecar.ts | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) 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),