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

  1. Run the session interactively when the workflow needs elicitation
  2. Provide required values via extension config or KEY=VALUE env so the extension never elicits
  3. 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

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


AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16). Data as JSON: /api/errors/ab7f7ce8b6ee5003. Report an issue: GitHub.