aaif-goose/goose · error
Elicitation requested but no interactive terminal is availab
Error message
Elicitation requested but no interactive terminal is available to collect user input
What it means
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.
Source
Thrown at crates/goose-cli/src/session/mod.rs:1533
));
self.messages.push(response_message);
cancel_token_clone.cancel();
drop(stream);
break;
}
self.agent.handle_confirmation(id, PermissionConfirmation {
principal_type: PrincipalType::Tool,
permission,
}).await;
} else if let Some((elicitation_id, elicitation_message, schema)) = find_elicitation_request(&message) {
if !interactive {
// Non-interactive/headless mode: cannot collect user input
tracing::warn!(
"Elicitation requested in non-interactive mode, cancelling"
);
cancel_token_clone.cancel();
drop(stream);
return Err(anyhow::anyhow!(
"Elicitation requested but no interactive terminal is available to collect user input"
));
}
output::hide_thinking();
let _ = progress_bars.hide();
match elicitation::collect_elicitation_input(&elicitation_message, &schema) {
Ok(input) => {
match &input.action {
ElicitationAction::Decline => {
output::render_text("Information request declined.", Some(Color::Yellow), true);
}
ElicitationAction::Cancel => {
output::render_text("Information request cancelled.", Some(Color::Yellow), true);
}
ElicitationAction::Accept => {}
_ => {}View on GitHub (pinned to 3810898a74)
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
Defensive patterns
Strategy: validation
Validate before calling
let interactive = std::io::IsTerminal::is_terminal(&std::io::stdin());
if !interactive {
// ensure no enabled extension sends elicitation in this run
disable_eliciting_extensions(&mut config);
} Try / catch
match session_reply().await {
Err(e) if e.to_string().contains("no interactive terminal") => {
eprintln!("this extension needs user input; run interactively or pre-configure its values");
return Err(e);
}
other => other,
} Prevention
- 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
When it happens
Trigger: Headless or piped sessions (goose run, execute, stream-json output) where an enabled extension issues an elicitation request during the reply loop.
Common situations: Automation reusing a desktop-oriented configuration; extensions that ask for credentials or parameters mid-flight.
Related errors
- no text provided for prompt in headless mode
- No user message
- Resource '${fallbackUri}' returned no contents
- Unsupported extension type for ACP: ${config.type}
- Job name must start with a letter or number and contain only
AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16).
Data as JSON: /api/errors/ab7f7ce8b6ee5003.
Report an issue: GitHub.