From 017eb1b4101baecfd25258c072670cf5a6405fc2 Mon Sep 17 00:00:00 2001 From: Stefano Fiorini Date: Wed, 20 May 2026 13:47:32 -0500 Subject: [PATCH] fix: pipe and close stdin for codex to prevent hang on stdin read When codex exec receives a prompt as a positional argument, it still tries to read additional input from stdin (prints 'Reading additional input from stdin...'). With stdio stdin set to 'ignore' or default, codex blocks indefinitely waiting for stdin that never comes. Fix: use stdio ['pipe', 'pipe', 'pipe'] and immediately close stdin via child.stdin.end() in both execute.ts (sync) and jobs.ts (async). This signals EOF to codex so it proceeds with the positional prompt. --- tools/ai-cli-dispatch/src/execute.ts | 4 ++++ tools/ai-cli-dispatch/src/jobs.ts | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/ai-cli-dispatch/src/execute.ts b/tools/ai-cli-dispatch/src/execute.ts index 626acf4..56d10e3 100644 --- a/tools/ai-cli-dispatch/src/execute.ts +++ b/tools/ai-cli-dispatch/src/execute.ts @@ -77,8 +77,12 @@ export async function executePrompt( const child = spawnImpl(command, args, { shell: false, + stdio: ["pipe", "pipe", "pipe"], }); + // Close stdin immediately so clients like codex don't hang waiting for input + child.stdin?.end(); + child.stdout?.on("data", (chunk: Buffer | string) => { stdout += chunk.toString(); }); diff --git a/tools/ai-cli-dispatch/src/jobs.ts b/tools/ai-cli-dispatch/src/jobs.ts index a027cff..c5bfc36 100644 --- a/tools/ai-cli-dispatch/src/jobs.ts +++ b/tools/ai-cli-dispatch/src/jobs.ts @@ -118,9 +118,12 @@ export async function startJob( const child = spawnImpl(command, args, { detached: true, shell: false, - stdio: ["ignore", "pipe", "pipe"], + stdio: ["pipe", "pipe", "pipe"], }); + // Close stdin immediately so clients like codex don't hang waiting for input + child.stdin?.end(); + record.pid = child.pid ?? undefined; writeJobFile(jobDir, record, fs);