diff --git a/peri-tui/src/ui/message_render.rs b/peri-tui/src/ui/message_render.rs index c9e414e0..e037c462 100644 --- a/peri-tui/src/ui/message_render.rs +++ b/peri-tui/src/ui/message_render.rs @@ -9,7 +9,7 @@ use super::{ }; use crate::app::tool_display::sanitize_display_text; -pub(crate) const CONTROL_B_BACKGROUND_HINT: &str = "(Ctrl+B to run in background)"; +pub(crate) const CONTROL_B_BACKGROUND_HINT: &str = "(ctrl+b to run in background)"; /// 从 Bash 工具输出中解析 exit code。 /// @@ -944,10 +944,13 @@ pub fn render_view_model( }; lines.push(Line::from(vec![ Span::styled(" ⎿ ", Style::default().fg(theme::DIM)), - Span::styled(elapsed_str, Style::default().fg(theme::MUTED)), + Span::styled( + format!("Running… {}", elapsed_str), + Style::default().fg(theme::MUTED), + ), ])); lines.push(Line::from(vec![ - Span::styled(" ⎿ ", Style::default().fg(theme::DIM)), + Span::styled(" ", Style::default().fg(theme::DIM)), Span::styled(CONTROL_B_BACKGROUND_HINT, Style::default().fg(theme::MUTED)), ])); } diff --git a/peri-tui/src/ui/message_render_test.rs b/peri-tui/src/ui/message_render_test.rs index 0eb511ad..71fe9aea 100644 --- a/peri-tui/src/ui/message_render_test.rs +++ b/peri-tui/src/ui/message_render_test.rs @@ -370,15 +370,46 @@ collapsed: true, color: crate::ui::theme::SAGE, diff_input: None, - started_at: Some(std::time::Instant::now() - std::time::Duration::from_secs(3)), + started_at: Some(std::time::Instant::now() - std::time::Duration::from_secs(39)), content_hash: 0, }; let lines = render_view_model(&vm, Some(1), 80, false, 0); + let rendered_lines: Vec = lines + .iter() + .map(|line| { + line.spans + .iter() + .map(|span| span.content.as_ref()) + .collect::() + }) + .collect(); let text = rendered_text(&lines); assert!( text.contains(crate::ui::message_render::CONTROL_B_BACKGROUND_HINT), "运行超过 2 秒的 Bash ToolBlock 应显示 Ctrl+B 提示: {text:?}" ); + assert!( + rendered_lines[0].contains("● Bash(python wuhan_weather.py)"), + "Bash ToolBlock header 应保留运行中圆点和命令摘要: {rendered_lines:?}" + ); + assert!( + rendered_lines + .iter() + .any(|line| line.contains("⎿ Running… (39s)")), + "Bash 运行状态应显示 Running… 和已运行时间: {rendered_lines:?}" + ); + assert!( + rendered_lines + .iter() + .any(|line| line == " (ctrl+b to run in background)"), + "Ctrl+B 提示应作为缩进行显示,不应重复 ⎿: {rendered_lines:?}" + ); + assert!( + !rendered_lines + .iter() + .any(|line| line.contains("⎿ (ctrl+b to run in background)")), + "Ctrl+B 提示行不应再带 ⎿ 前缀: {rendered_lines:?}" + ); } #[test] diff --git a/peri-tui/src/ui/render_thread_test.rs b/peri-tui/src/ui/render_thread_test.rs index 6151b964..077625f1 100644 --- a/peri-tui/src/ui/render_thread_test.rs +++ b/peri-tui/src/ui/render_thread_test.rs @@ -940,4 +940,27 @@ fn test_refresh_running_bash_toolblock_adds_control_b_hint_after_threshold() { .any(|span| span.content.as_ref().contains(CONTROL_B_BACKGROUND_HINT))), "超过 2 秒后缓存中应出现 Ctrl+B 提示" ); + let rendered_lines: Vec = cache + .read() + .lines + .iter() + .map(|line| { + line.spans + .iter() + .map(|span| span.content.as_ref()) + .collect::() + }) + .collect(); + assert!( + rendered_lines + .iter() + .any(|line| line.contains("⎿ Running…")), + "超过 2 秒后缓存中应出现 Running 状态行: {rendered_lines:?}" + ); + assert!( + rendered_lines + .iter() + .any(|line| line == " (ctrl+b to run in background)"), + "Ctrl+B 提示应作为缩进行缓存: {rendered_lines:?}" + ); }