diff --git a/packages/coding-agent/src/modes/print-mode.ts b/packages/coding-agent/src/modes/print-mode.ts index 7c0efb10b..54425749e 100644 --- a/packages/coding-agent/src/modes/print-mode.ts +++ b/packages/coding-agent/src/modes/print-mode.ts @@ -99,15 +99,14 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti // tail before dispose/exit. Same truncation class as issue #5309 (issue #7635). let stdoutTail: Promise = Promise.resolve(); const writeStdoutLine = (text: string): void => { - stdoutTail = stdoutTail.then( - () => - new Promise(resolve => { - process.stdout.write(text, err => { - if (err) logger.warn("print-mode stdout write failed", { error: err.message }); - resolve(); - }); - }), - ); + stdoutTail = stdoutTail.then(() => { + const { promise, resolve, reject } = Promise.withResolvers(); + process.stdout.write(text, err => { + if (err) reject(err); + else resolve(); + }); + return promise; + }); }; // Emit session header for JSON mode diff --git a/packages/coding-agent/test/print-mode-json-flush.test.ts b/packages/coding-agent/test/print-mode-json-flush.test.ts index a21e8cd40..0e5d4d398 100644 --- a/packages/coding-agent/test/print-mode-json-flush.test.ts +++ b/packages/coding-agent/test/print-mode-json-flush.test.ts @@ -127,7 +127,9 @@ describe("print-mode JSON flush (#7635)", () => { // them all. The pre-fix fire-and-forget path settles and disposes here; // the fix must still be blocked on the undrained agent_end write. await agentEndWriteIssued; - await new Promise(resolve => setImmediate(resolve)); + const { promise: nextTask, resolve: resolveNextTask } = Promise.withResolvers(); + setImmediate(resolveNextTask); + await nextTask; expect(releaseAgentEnd).toBeDefined(); expect(settled).toBe(false); expect(harness.disposed()).toBe(false);