From 617e7e0f335e13d08218a339c5d84b863f73dde4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugues=20Clou=C3=A2tre?= <15008125+clouatre@users.noreply.github.com> Date: Tue, 16 Dec 2025 15:37:29 -0500 Subject: [PATCH] fix: display shell output as static text instead of spinner (#6041) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hugues Clouâtre --- crates/goose-cli/src/session/mod.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/crates/goose-cli/src/session/mod.rs b/crates/goose-cli/src/session/mod.rs index 6c206a9a74..5c9ea253b1 100644 --- a/crates/goose-cli/src/session/mod.rs +++ b/crates/goose-cli/src/session/mod.rs @@ -1085,8 +1085,12 @@ impl CliSession { }; (formatted, subagent_id.map(str::to_string), notification_type.map(str::to_string)) } else if let Some(Value::String(output)) = o.get("output") { - // Fallback for other MCP notification types - (output.to_owned(), None, None) + // Extract type if present (e.g., "shell_output") + let notification_type = o.get("type") + .and_then(|v| v.as_str()) + .map(str::to_string); + + (output.to_owned(), None, notification_type) } else if let Some(result) = format_task_execution_notification(data) { result } else { @@ -1121,6 +1125,14 @@ impl CliSession { print!("{}", formatted_message); std::io::stdout().flush().unwrap(); } + } else if notification_type == "shell_output" { + // Hide spinner, print shell output, spinner will resume + if interactive { + let _ = progress_bars.hide(); + } + if !is_json_mode { + println!("{}", formatted_message); + } } } else if output::is_showing_thinking() {