From d1836362ca9bb698c8d725abc1d26ad59e857932 Mon Sep 17 00:00:00 2001 From: wismyzhizi2018 Date: Fri, 3 Jul 2026 08:48:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(tui):=20=E4=BC=98=E5=8C=96=20Bash=20?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E4=B8=AD=E7=8A=B6=E6=80=81=20UI=20=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 改进 Bash ToolBlock 运行时的视觉表现,提升用户体验。 修改内容: - peri-tui/src/ui/message_render.rs 统一 Ctrl+B 提示为小写 ctrl+b,优化 Running 时间显示 - peri-tui/src/ui/message_render_test.rs 增加更多断言验证 Bash 运行状态格式 - peri-tui/src/ui/render_thread_test.rs 补充缓存中 Bash 运行状态的验证测试 特性/影响: - Running 状态现在显示为 "Running… (N)" 格式 - Ctrl+B 提示行移除多余的 ⎿ 前缀,改为缩进显示 - 测试覆盖新增 UI 格式断言,确保渲染一致性 Co-Authored-By: Claude Haiku 4.5 --- peri-tui/src/ui/message_render.rs | 9 ++++--- peri-tui/src/ui/message_render_test.rs | 33 +++++++++++++++++++++++++- peri-tui/src/ui/render_thread_test.rs | 23 ++++++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) 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:?}" + ); }