diff options
| author | Michelle Tilley <michelle@michelletilley.net> | 2026-04-21 15:30:46 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-21 15:30:46 -0700 |
| commit | 8dec33f5f9a972a38978b5600fde5bc292fb6401 (patch) | |
| tree | 19708731284c8ba810a5acede4720d3396f9e5a2 /crates/atuin-ai/src/tui/view | |
| parent | fix: shell tool preview stuck as Running after completion (#3436) (diff) | |
| download | atuin-8dec33f5f9a972a38978b5600fde5bc292fb6401.zip | |
feat: shell tool execution timeouts (#3437)
Diffstat (limited to 'crates/atuin-ai/src/tui/view')
| -rw-r--r-- | crates/atuin-ai/src/tui/view/mod.rs | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/crates/atuin-ai/src/tui/view/mod.rs b/crates/atuin-ai/src/tui/view/mod.rs index d40a44d4..2061ec38 100644 --- a/crates/atuin-ai/src/tui/view/mod.rs +++ b/crates/atuin-ai/src/tui/view/mod.rs @@ -431,7 +431,7 @@ const MAX_SHELL_PREVIEW_LINES: u16 = 5; /// Render a shell command execution with live VT100 output viewport. fn shell_tool_view(tool_key: &str, command: &str, preview: Option<&ToolPreview>) -> Elements { - let preview_done = preview.is_some_and(|p| p.exit_code.is_some() || p.interrupted); + let preview_done = preview.is_some_and(|p| p.exit_code.is_some() || p.interrupted.is_some()); element! { #(if let Some(preview) = preview { @@ -468,10 +468,16 @@ fn shell_tool_view(tool_key: &str, command: &str, preview: Option<&ToolPreview>) } fn shell_tool_footer(preview: &ToolPreview, preview_done: bool) -> Elements { - if preview.interrupted { + use crate::fsm::tools::InterruptReason; + + if let Some(reason) = &preview.interrupted { + let text = match reason { + InterruptReason::User => "Interrupted".to_string(), + InterruptReason::Timeout(secs) => format!("Timed out ({secs}s)"), + }; return element! { Text { - Span(text: "Interrupted", style: Style::default().fg(Color::Red).add_modifier(Modifier::BOLD)) + Span(text: text, style: Style::default().fg(Color::Red).add_modifier(Modifier::BOLD)) } }; } |
