fix(qwen): inherit stdin for Device Code flows to enable interactive prompts

Device Code flows (Qwen, GHCP) may require interactive terminal input
before generating the device code. For example, Qwen prompts for email.

Previously, all auth processes used piped stdin which blocked user input.
Now Device Code flows use 'inherit' for stdin, allowing users to respond
to prompts directly in the terminal.

Authorization Code flows (Gemini, Codex) still use piped stdin for
programmatic project selection.

Closes #188
This commit is contained in:
kaitranntt
2025-12-24 04:04:22 -05:00
parent a99b6eb93f
commit c811fdfc79
+8 -4
View File
@@ -112,8 +112,8 @@ async function handleStdout(
log(`Parsed ${state.parsedProjects.length} projects`);
}
// Handle project selection prompt
if (!state.projectPromptHandled && isProjectSelectionPrompt(output)) {
// Handle project selection prompt (Authorization Code flows only - Device Code has no stdin pipe)
if (!isDeviceCodeFlow && !state.projectPromptHandled && isProjectSelectionPrompt(output)) {
state.projectPromptHandled = true;
await handleProjectSelection(output, state, options, authProcess, log);
}
@@ -258,8 +258,13 @@ export function executeOAuthProcess(options: OAuthProcessOptions): Promise<Accou
};
return new Promise<AccountInfo | null>((resolve) => {
// Device Code flows (Qwen, GHCP) may need interactive stdin for email/prompts
// Authorization Code flows need piped stdin for project selection
const isDeviceCodeFlow = callbackPort === null;
const stdinMode = isDeviceCodeFlow ? 'inherit' : 'pipe';
const authProcess = spawn(binaryPath, args, {
stdio: ['pipe', 'pipe', 'pipe'],
stdio: [stdinMode, 'pipe', 'pipe'],
env: { ...process.env, CLI_PROXY_AUTH_DIR: tokenDir },
});
@@ -291,7 +296,6 @@ export function executeOAuthProcess(options: OAuthProcessOptions): Promise<Accou
});
// Show waiting message after delay
const isDeviceCodeFlow = callbackPort === null;
setTimeout(() => {
if (isDeviceCodeFlow) {
// Device Code Flow: show polling message