From 535f11e9bf7dc678d44589c48a9de85d2f98cb20 Mon Sep 17 00:00:00 2001 From: olcan Date: Thu, 22 May 2025 12:25:37 -0700 Subject: [PATCH] disable/save/restore listeners on process.stdin --- .../cli/src/ui/hooks/shellCommandProcessor.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/cli/src/ui/hooks/shellCommandProcessor.ts b/packages/cli/src/ui/hooks/shellCommandProcessor.ts index 45b7162999..a51c615f38 100644 --- a/packages/cli/src/ui/hooks/shellCommandProcessor.ts +++ b/packages/cli/src/ui/hooks/shellCommandProcessor.ts @@ -129,13 +129,37 @@ export const useShellCommandProcessor = ( setPendingHistoryItem({ type: 'info', text: output }); }); + // disable & save all stdin listeners to be restored onExit + const origStdinListeners = new Map< + string | symbol, + Array<(...args: unknown[]) => void> + >(); + process.stdin.eventNames().forEach((eventName) => { + const listeners = process.stdin + .listeners(eventName) + .slice() as Array<(...args: unknown[]) => void>; + if (listeners.length > 0) { + origStdinListeners.set(eventName, listeners); + listeners.forEach((listener) => { + process.stdin.off(eventName, listener); + }); + } + }); + const stdinListener = (data: Buffer) => { child.write(data.toString()); }; process.stdin.on('data', stdinListener); child.onExit(({ exitCode, signal }) => { + // restore original stdin listeners process.stdin.removeListener('data', stdinListener); + origStdinListeners.forEach((listeners, eventName) => { + listeners.forEach((listener) => + process.stdin.on(eventName as string, listener), + ); + }); + setPendingHistoryItem(null); output = output.trim() || '(Command produced no output)';