{"record":{"id":"ab7f7ce8b6ee5003","repo":"aaif-goose/goose","slug":"elicitation-requested-but-no-interactive-terminal","errorCode":null,"errorMessage":"Elicitation requested but no interactive terminal is available to collect user input","messagePattern":"Elicitation requested but no interactive terminal is available to collect user input","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/goose-cli/src/session/mod.rs","lineNumber":1533,"sourceCode":"                                    ));\n                                    self.messages.push(response_message);\n                                    cancel_token_clone.cancel();\n                                    drop(stream);\n                                    break;\n                                }\n                                self.agent.handle_confirmation(id, PermissionConfirmation {\n                                    principal_type: PrincipalType::Tool,\n                                    permission,\n                                }).await;\n                            } else if let Some((elicitation_id, elicitation_message, schema)) = find_elicitation_request(&message) {\n                                if !interactive {\n                                    // Non-interactive/headless mode: cannot collect user input\n                                    tracing::warn!(\n                                        \"Elicitation requested in non-interactive mode, cancelling\"\n                                    );\n                                    cancel_token_clone.cancel();\n                                    drop(stream);\n                                    return Err(anyhow::anyhow!(\n                                        \"Elicitation requested but no interactive terminal is available to collect user input\"\n                                    ));\n                                }\n\n                                output::hide_thinking();\n                                let _ = progress_bars.hide();\n\n                                match elicitation::collect_elicitation_input(&elicitation_message, &schema) {\n                                    Ok(input) => {\n                                        match &input.action {\n                                            ElicitationAction::Decline => {\n                                                output::render_text(\"Information request declined.\", Some(Color::Yellow), true);\n                                            }\n                                            ElicitationAction::Cancel => {\n                                                output::render_text(\"Information request cancelled.\", Some(Color::Yellow), true);\n                                            }\n                                            ElicitationAction::Accept => {}\n                                            _ => {}","sourceCodeStart":1515,"sourceCodeEnd":1551,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/crates/goose-cli/src/session/mod.rs#L1515-L1551","documentation":"An MCP extension sent an elicitation request (a structured input form). In non-interactive mode there is no terminal to present the form or collect answers, so goose cancels the token, drops the stream, and returns this error instead of fabricating input.","triggerScenarios":"Headless or piped sessions (goose run, execute, stream-json output) where an enabled extension issues an elicitation request during the reply loop.","commonSituations":"Automation reusing a desktop-oriented configuration; extensions that ask for credentials or parameters mid-flight.","solutions":["Run the session interactively when the workflow needs elicitation","Provide required values via extension config or KEY=VALUE env so the extension never elicits","Disable the eliciting extension for headless profiles"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"let interactive = std::io::IsTerminal::is_terminal(&std::io::stdin());\nif !interactive {\n    // ensure no enabled extension sends elicitation in this run\n    disable_eliciting_extensions(&mut config);\n}","typeGuard":null,"tryCatchPattern":"match session_reply().await {\n    Err(e) if e.to_string().contains(\"no interactive terminal\") => {\n        eprintln!(\"this extension needs user input; run interactively or pre-configure its values\");\n        return Err(e);\n    }\n    other => other,\n}","preventionTips":["Pre-supply extension parameters via config or env vars in automation","Keep elicitation-capable extensions out of headless profiles","Detect non-TTY stdin early and warn before work starts"],"tags":["elicitation","mcp","headless","cli"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}