Skip to content

Commit 077b037

Browse files
committed
fix(tui): critical fixes for mouse garble, spinner verbs, logo, tokens
Critical fixes: - Remove EnableMouseCapture — mouse events were being interpreted as keyboard input, causing garbled text in input box - Remove EnableFocusChange — extra escape sequences caused issues - Keep EnableBracketedPaste only (safe, useful for multi-line paste) Spinner verbs: - Replace spinner.start("Thinking...") with start_with_random_verb() - Use clear_override() after tool result to return to random verb - Tool execution shows "Running {name}..." as override Logo: - Replace Unicode block chars (inconsistent terminal widths) with ASCII-safe crab art: /| o o |\ for reliable alignment Token display: - Remove inline token counts from conversation content buffer - Tokens only shown in status bar (total_input/output_tokens fields)
1 parent 0ef07c0 commit 077b037

2 files changed

Lines changed: 14 additions & 45 deletions

File tree

crates/tui/src/app.rs

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ impl App {
477477
if !self.input.is_empty() {
478478
let text = self.input.submit();
479479
self.state = AppState::Processing;
480-
self.spinner.start("Thinking...");
480+
self.spinner.start_with_random_verb();
481481
return AppAction::Submit(text);
482482
}
483483
return AppAction::None;
@@ -536,7 +536,7 @@ impl App {
536536
self.permission_dialog = None;
537537
self.state = AppState::Processing;
538538
if allowed {
539-
self.spinner.start("Executing tool...");
539+
self.spinner.start_with_random_verb();
540540
}
541541
return AppAction::PermissionResponse {
542542
request_id,
@@ -568,31 +568,18 @@ impl App {
568568
self.spinner.stop();
569569
self.current_tool = None;
570570
self.state = AppState::Idle;
571-
// Accumulate token usage
571+
// Accumulate token usage (displayed in status bar, not inline)
572572
self.total_input_tokens += usage.input_tokens;
573573
self.total_output_tokens += usage.output_tokens;
574-
// Show token usage summary
575-
let total = usage.input_tokens + usage.output_tokens;
576-
if total > 0 {
577-
let _ = write!(
578-
self.content_buffer,
579-
"\n[tokens: {}in/{}out",
580-
usage.input_tokens, usage.output_tokens
581-
);
582-
if usage.cache_read_tokens > 0 {
583-
let _ = write!(self.content_buffer, " cache:{}r", usage.cache_read_tokens);
584-
}
585-
let _ = writeln!(self.content_buffer, "]");
586-
}
587574
}
588575
Event::ToolUseStart { name, .. } => {
589576
self.current_tool = Some(name.clone());
590-
self.spinner.set_message(format!("Running {name}..."));
577+
self.spinner.set_message(format!("Running {name}"));
591578
let _ = write!(self.content_buffer, "\n[tool] {name}\n");
592579
}
593580
Event::ToolResult { output, .. } => {
594581
let tool_name = self.current_tool.take().unwrap_or_default();
595-
self.spinner.set_message("Thinking...".to_string());
582+
self.spinner.clear_override();
596583
// Show tool result summary in content area
597584
let text = output.text();
598585
if output.is_error {
@@ -804,26 +791,19 @@ fn render_header(model_name: &str, working_dir: &str, area: Rect, buf: &mut Buff
804791
let fg = Style::default().fg(CRAB_COLOR);
805792
let fg_bg = Style::default().fg(CRAB_COLOR).bg(CRAB_BG);
806793

807-
// Crab art — 3 rows: claws + eyes on top, shell in middle, legs below
794+
// Crab art — 3 rows, ASCII-safe characters for consistent width
808795
// All elements use CRAB_COLOR (#DA7756) matching the project logo
809796
let art_lines: [Line<'_>; 3] = [
810-
// Row 1: claws and eyes
811-
Line::from(vec![
812-
Span::styled(" ╱▔╲", fg),
813-
Span::styled(" ● ● ", fg),
814-
Span::styled("╱▔╲ ", fg),
815-
]),
816-
// Row 2: claws wrapping the shell
797+
Line::from(Span::styled(r" /| o o |\ ", fg)),
817798
Line::from(vec![
818-
Span::styled(" ╲▂╱", fg),
819-
Span::styled("╲███╱", fg_bg),
820-
Span::styled("╲▂╱ ", fg),
799+
Span::styled(r" \_", fg),
800+
Span::styled("^^^^^", fg_bg),
801+
Span::styled(r"_/ ", fg),
821802
]),
822-
// Row 3: legs
823-
Line::from(Span::styled(" ╱╱ ███ ╲╲ ", fg)),
803+
Line::from(Span::styled(r" // ||| \\ ", fg)),
824804
];
825805

826-
let art_width = 15u16;
806+
let art_width = 13u16;
827807

828808
// Info text beside the art (mirrors CC's CondensedLogo text)
829809
let text_budget = area.width.saturating_sub(art_width) as usize;

crates/tui/src/runner.rs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@ use std::path::PathBuf;
1212
use std::pin::Pin;
1313
use std::sync::Arc;
1414

15-
use crossterm::event::{
16-
DisableBracketedPaste, DisableFocusChange, EnableBracketedPaste, EnableFocusChange,
17-
};
18-
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
15+
use crossterm::event::{DisableBracketedPaste, EnableBracketedPaste};
1916
use crossterm::execute;
2017
use crossterm::terminal::{
2118
EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
@@ -156,13 +153,7 @@ pub async fn run(config: TuiConfig) -> anyhow::Result<()> {
156153
// Set up terminal
157154
enable_raw_mode()?;
158155
let mut stdout = io::stdout();
159-
execute!(
160-
stdout,
161-
EnterAlternateScreen,
162-
EnableBracketedPaste,
163-
EnableMouseCapture,
164-
EnableFocusChange
165-
)?;
156+
execute!(stdout, EnterAlternateScreen, EnableBracketedPaste)?;
166157
let term_backend = CrosstermBackend::new(stdout);
167158
let mut terminal = Terminal::new(term_backend)?;
168159

@@ -194,8 +185,6 @@ pub async fn run(config: TuiConfig) -> anyhow::Result<()> {
194185
disable_raw_mode()?;
195186
execute!(
196187
terminal.backend_mut(),
197-
DisableFocusChange,
198-
DisableMouseCapture,
199188
DisableBracketedPaste,
200189
LeaveAlternateScreen
201190
)?;

0 commit comments

Comments
 (0)