From 930f81a17b0051404c181a5cfe18c928b0a20121 Mon Sep 17 00:00:00 2001 From: zhao-oai Date: Mon, 10 Nov 2025 17:13:10 -0800 Subject: [PATCH] flip rate limit status bar (#6482) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit flipping rate limit status bar to match chat.com/codex/settings/usage Screenshot 2025-11-10 at 4 53 41 PM --- codex-rs/tui/src/status/card.rs | 5 +++-- codex-rs/tui/src/status/rate_limits.rs | 8 ++++---- ...us__tests__status_snapshot_includes_monthly_limit.snap | 2 +- ...tests__status_snapshot_includes_reasoning_details.snap | 4 ++-- ...tests__status_snapshot_shows_stale_limits_message.snap | 4 ++-- ...sts__status_snapshot_truncates_in_narrow_terminal.snap | 3 +-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/codex-rs/tui/src/status/card.rs b/codex-rs/tui/src/status/card.rs index 11b723fe..977f913d 100644 --- a/codex-rs/tui/src/status/card.rs +++ b/codex-rs/tui/src/status/card.rs @@ -211,10 +211,11 @@ impl StatusHistoryCell { let mut lines = Vec::with_capacity(rows.len().saturating_mul(2)); for row in rows { + let percent_remaining = (100.0 - row.percent_used).clamp(0.0, 100.0); let value_spans = vec![ - Span::from(render_status_limit_progress_bar(row.percent_used)), + Span::from(render_status_limit_progress_bar(percent_remaining)), Span::from(" "), - Span::from(format_status_limit_summary(row.percent_used)), + Span::from(format_status_limit_summary(percent_remaining)), ]; let base_spans = formatter.full_spans(row.label.as_str(), value_spans); let base_line = Line::from(base_spans.clone()); diff --git a/codex-rs/tui/src/status/rate_limits.rs b/codex-rs/tui/src/status/rate_limits.rs index 4c08cdd6..50cbd977 100644 --- a/codex-rs/tui/src/status/rate_limits.rs +++ b/codex-rs/tui/src/status/rate_limits.rs @@ -124,8 +124,8 @@ pub(crate) fn compose_rate_limit_data( } } -pub(crate) fn render_status_limit_progress_bar(percent_used: f64) -> String { - let ratio = (percent_used / 100.0).clamp(0.0, 1.0); +pub(crate) fn render_status_limit_progress_bar(percent_remaining: f64) -> String { + let ratio = (percent_remaining / 100.0).clamp(0.0, 1.0); let filled = (ratio * STATUS_LIMIT_BAR_SEGMENTS as f64).round() as usize; let filled = filled.min(STATUS_LIMIT_BAR_SEGMENTS); let empty = STATUS_LIMIT_BAR_SEGMENTS.saturating_sub(filled); @@ -136,8 +136,8 @@ pub(crate) fn render_status_limit_progress_bar(percent_used: f64) -> String { ) } -pub(crate) fn format_status_limit_summary(percent_used: f64) -> String { - format!("{percent_used:.0}% used") +pub(crate) fn format_status_limit_summary(percent_remaining: f64) -> String { + format!("{percent_remaining:.0}% left") } fn capitalize_first(label: &str) -> String { diff --git a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_monthly_limit.snap b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_monthly_limit.snap index 85e6356c..66484261 100644 --- a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_monthly_limit.snap +++ b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_monthly_limit.snap @@ -18,5 +18,5 @@ expression: sanitized │ │ │ Token usage: 1.2K total (800 input + 400 output) │ │ Context window: 100% left (1.2K used / 272K) │ -│ Monthly limit: [██░░░░░░░░░░░░░░░░░░] 12% used (resets 07:08 on 7 May) │ +│ Monthly limit: [██████████████████░░] 88% left (resets 07:08 on 7 May) │ ╰────────────────────────────────────────────────────────────────────────────╯ diff --git a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_reasoning_details.snap b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_reasoning_details.snap index 123547cb..4dc951db 100644 --- a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_reasoning_details.snap +++ b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_reasoning_details.snap @@ -18,6 +18,6 @@ expression: sanitized │ │ │ Token usage: 1.9K total (1K input + 900 output) │ │ Context window: 100% left (2.25K used / 272K) │ -│ 5h limit: [███████████████░░░░░] 72% used (resets 03:14) │ -│ Weekly limit: [█████████░░░░░░░░░░░] 45% used (resets 03:24) │ +│ 5h limit: [██████░░░░░░░░░░░░░░] 28% left (resets 03:14) │ +│ Weekly limit: [███████████░░░░░░░░░] 55% left (resets 03:24) │ ╰─────────────────────────────────────────────────────────────────────╯ diff --git a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_shows_stale_limits_message.snap b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_shows_stale_limits_message.snap index 3a98ce95..7d548f4b 100644 --- a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_shows_stale_limits_message.snap +++ b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_shows_stale_limits_message.snap @@ -18,7 +18,7 @@ expression: sanitized │ │ │ Token usage: 1.9K total (1K input + 900 output) │ │ Context window: 100% left (2.25K used / 272K) │ -│ 5h limit: [███████████████░░░░░] 72% used (resets 03:14) │ -│ Weekly limit: [████████░░░░░░░░░░░░] 40% used (resets 03:34) │ +│ 5h limit: [██████░░░░░░░░░░░░░░] 28% left (resets 03:14) │ +│ Weekly limit: [████████████░░░░░░░░] 60% left (resets 03:34) │ │ Warning: limits may be stale - start new turn to refresh. │ ╰─────────────────────────────────────────────────────────────────────╯ diff --git a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_truncates_in_narrow_terminal.snap b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_truncates_in_narrow_terminal.snap index 5bbaaef7..ea5444d6 100644 --- a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_truncates_in_narrow_terminal.snap +++ b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_truncates_in_narrow_terminal.snap @@ -1,6 +1,5 @@ --- source: tui/src/status/tests.rs -assertion_line: 257 expression: sanitized --- /status @@ -20,6 +19,6 @@ expression: sanitized │ │ │ Token usage: 1.9K total (1K input + │ │ Context window: 100% left (2.25K used / │ -│ 5h limit: [███████████████░░░░░] │ +│ 5h limit: [██████░░░░░░░░░░░░░░] │ │ (resets 03:14) │ ╰────────────────────────────────────────────╯