From 3251cd5dc2c988dc2dd8ac7841674b497cbf7d67 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 15:39:57 +0000 Subject: [PATCH 1/4] docs(tui): COR-20 offline + rate-limit lock_v2 scenes Add designer and runtime lock boards for network-offline and HTTP 429 rate-limit at both 40x12 and 120x40. Leave error-unavailable and quota-exhausted unchanged. Co-authored-by: Mathis --- docs/media/tui-lock-v2/120x40/offline.png | Bin 0 -> 29685 bytes docs/media/tui-lock-v2/120x40/rate-limit.png | Bin 0 -> 32158 bytes docs/media/tui-lock-v2/40x12/offline.png | Bin 0 -> 20050 bytes docs/media/tui-lock-v2/40x12/rate-limit.png | Bin 0 -> 19823 bytes docs/media/tui-lock-v2/SPEC.md | 6 +- docs/media/tui-lock-v2/index.md | 4 +- .../tui-lock-v2/runtime/120x40/offline.png | Bin 0 -> 7731 bytes .../tui-lock-v2/runtime/120x40/rate-limit.png | Bin 0 -> 8274 bytes .../tui-lock-v2/runtime/40x12/offline.png | Bin 0 -> 4804 bytes .../tui-lock-v2/runtime/40x12/rate-limit.png | Bin 0 -> 4726 bytes docs/media/tui-lock-v2/runtime/README.md | 4 +- docs/media/tui-lock-v2/tools/boards.py | 34 +++++ docs/media/tui-lock-v2/txt/120x40/offline.txt | 40 ++++++ .../tui-lock-v2/txt/120x40/rate-limit.txt | 40 ++++++ docs/media/tui-lock-v2/txt/40x12/offline.txt | 12 ++ .../tui-lock-v2/txt/40x12/rate-limit.txt | 12 ++ scripts/render-tui-lock-v2.sh | 9 +- src/cortex-tui/src/lib.rs | 1 + src/cortex-tui/src/lock_v2.rs | 6 +- src/cortex-tui/src/lock_v2_ids.rs | 8 +- src/cortex-tui/src/lock_v2_network.rs | 127 ++++++++++++++++++ 21 files changed, 289 insertions(+), 14 deletions(-) create mode 100644 docs/media/tui-lock-v2/120x40/offline.png create mode 100644 docs/media/tui-lock-v2/120x40/rate-limit.png create mode 100644 docs/media/tui-lock-v2/40x12/offline.png create mode 100644 docs/media/tui-lock-v2/40x12/rate-limit.png create mode 100644 docs/media/tui-lock-v2/runtime/120x40/offline.png create mode 100644 docs/media/tui-lock-v2/runtime/120x40/rate-limit.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/offline.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/rate-limit.png create mode 100644 docs/media/tui-lock-v2/txt/120x40/offline.txt create mode 100644 docs/media/tui-lock-v2/txt/120x40/rate-limit.txt create mode 100644 docs/media/tui-lock-v2/txt/40x12/offline.txt create mode 100644 docs/media/tui-lock-v2/txt/40x12/rate-limit.txt create mode 100644 src/cortex-tui/src/lock_v2_network.rs diff --git a/docs/media/tui-lock-v2/120x40/offline.png b/docs/media/tui-lock-v2/120x40/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..68f7df6809072e73aa5a00dc64b1d3e7c5874ccb GIT binary patch literal 29685 zcmeFZcT|&W(=Y7aqGAIS6_IKIR0Osn(u9Z&0Ra{1Z41(+OD|C@Y@`VYNR3F7F1-YZ zN|W9R5FpY!p(TNYBxkbsbKdj4>pkZ?>#X&y@BH&*u@)Hbfrj$o z1E&t`+O_Mj%Dvlt5t3*J@y=48ujwko=%dXyB3SQ zkAD4?@Y+xL<=1zgUQi9}`C@JRZA$w!G9`O$GFvxsaWAzM4?Ok2ae{(r&oCMoc(e5+$D-XW@|EeR*@{*>8`o5?bP84cl`hE^`h7O*ZU*o zcv@(E+LWdj;@n5(N}Udz6Bg1$Z%XpXxg8AnMT|x1*O;wczM}c@xeDfGU4WqH()d2r zcjP-q(a%LI=GHr}Z9NN);l}!}92|FAoifMBKL5J(ItQD{cu%y`eXPr8)0Zi1;-rtF z-%^aH|MJ7<u2G{RXf}w=lS1u?RsGu z8$U1+DXIv+Tu5!P%Hf#R!8lwQq0jMGSB;N*S%;%XVlm})eXuxM{DSQCJObf+B_d#8 zd)Z}UxXs(o+Z^#RF|o)TH)ECTyLHlQ?;%Bxw$}&o{u|S?D6dPb0b_pq)GMbX9WmQI zMGb^&7d0hIYn~Jei-Huc=7h8@sTEKHADrLBiqH$R9Tv^4!otH5j_X45W%ffQPl#*3 z3#Dvi8YRc#SE9L+htWPw&3#`xU!OeKUcq(0 zZ|b?T(bHpaA}pc$$!JSmAY0?d%D2)M!;> z<_2ZqYI&=^E!ewi`PufUToZCY?fxJYI~{S^mz}~QnY>xobv~u3qr*x|r4FCDy-!tb zVZjzQ<(N;hr7cytlDHS{5wGj!rVT%bxNps>*KVzj-#R$cA?IGJ3w$H=N$(eD(^oPF- z!B;!oos<9b9-7VA#CIjgTvrtk$xAD!JW@cuOw$je-iPM)|mV53$9@nI~G^wJ} ztQ_{3?WFI@`|&qo1{nf!&z&Z#vq zUlBFph^OCT=eu5E(M#dndIry9WMnk!uxDRuE5FayZ1@g^VfcrK4qPN&x$f%hOxVYJ zGo{P9HAqO)wS@M?=poatWa0-mGK9~a>xg&W*|*u)Aab42M(|i3?5VvKd%8}!z_>Iw ztzxd;{nUX5;)=9&|9Zo?)98NR>Z+=Ra?BR$0Y`T3bzT-Fb#-Ek1)-s-DLg?YPm_@% z8Y9jc@M+vWfcI)(cPHHFwty9WZPo zKGm=UukRyq^5u?ffpw0xBwr&V>mO;suLPf)QI|(btw6bRbS}w_#|vcT{&idBGaL>M z7A1ciDWZM%KGicy@7WKgXOzmUDw&%%_fFX}Wb*$$+r7DWf@738Le5`zyglx9c#N{t z?y*N{70#L?HY_jV!>fI*XCz3+mrbhXMwM-;3SM`#iqA=fjopo)>diKhZzX zciUuXtTGP{MedRg9K2M*Oi4>{B@ZCJ6k zTYp6PnC}H4A^Xj(gQuuNW3;{fk9F_w}9dqa5az zo!JRp)U_Y}DjYexn)1rkvPRBx>&tJiI@MJ*R8%#%|JWJ

)I%ZLd}zRZGsWr(Ul3 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 NQBl;qjgf!o`yZpP^5Xyi literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/120x40/rate-limit.png b/docs/media/tui-lock-v2/120x40/rate-limit.png new file mode 100644 index 0000000000000000000000000000000000000000..019ed5f08793349ea03908800744d8f822681344 GIT binary patch literal 32158 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

?Y=JW>=ggT5b``N7N?AwO-tf5m!Xb!+!&Y_ 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 tML=w~#q=5gIfsqKzXvUl|GD%^qY2yYXqVp&!/.txt` — the exact character grid of every board (diff a `MockTerminal` capture against these). - Renderer: `tools/render_lock_v2.py` + `tools/boards.py` (Python 3 + Pillow, IBM Plex Mono @@ -414,7 +414,7 @@ Narrow: no bars, `used / total pct%`. | settings-appearance / mouse / row-hover / search / theme-submenu | `settings-appearance`, `settings-mouse`, `settings-row-hover`, `settings-search`, `settings-theme-submenu` | | mode chips (Shift+Tab) | `mode-agent`, `mode-plan`, `mode-ask`, `mode-bash` | | permissions / mcp / plugins / usage-quota / sandbox / cloud | `permission-prompt`, `permission-prompt-hover`, `permissions-picker`, `mcp-servers`, `mcp-drop`, `plugins`, `usage`, `quota-exhausted`, `sandbox`, `sandbox-deny`, `cloud-handoff` | -| diagnostics red/amber · interrupt/stopped | `diagnostics`, `interrupt-stopped`, `error-unavailable` | +| diagnostics red/amber · interrupt/stopped | `diagnostics`, `interrupt-stopped`, `error-unavailable`, `offline`, `rate-limit` | | markdown table · diff hunk · code fence | `md-table`, `diff-hunk`, `edit-collapsed`, `code-fence`, `tool-tiles`, `tool-tiles-collapsed`, `shell-running` | | login / first-run | `login`, `login-waiting`, `login-success`, `login-error`, `first-run-tips` | | compact chat (ref 5) | `compact-chat` | @@ -425,7 +425,7 @@ Narrow (40×12) set: `welcome-cortex`, `welcome-agent`, `first-run-tips`, `sessi `tokens-topright`, `compact-chat`, `slash-palette`, `goal-chip-active`, `goal-chip-paused`, `goal-chip-done`, `goal-chip-budget`, `goal-chip-blocked`, `slash-model-typed`, `model-list`, `model-effort-high`, `settings-appearance`, `settings-mouse`, `settings-row-hover`, `settings-theme-submenu`, `mode-plan`, `mode-ask`, -`permission-prompt`, `mcp-servers`, `usage`, `diagnostics`, `interrupt-stopped`, `diff-hunk`, `login`, `shortcuts-overlay`. +`permission-prompt`, `mcp-servers`, `usage`, `diagnostics`, `interrupt-stopped`, `offline`, `rate-limit`, `diff-hunk`, `login`, `shortcuts-overlay`. --- diff --git a/docs/media/tui-lock-v2/index.md b/docs/media/tui-lock-v2/index.md index e27926f3..8ee26a96 100644 --- a/docs/media/tui-lock-v2/index.md +++ b/docs/media/tui-lock-v2/index.md @@ -88,6 +88,8 @@ Regenerate: `python3 tools/render_lock_v2.py --index` (fetches IBM Plex Mono on | `diagnostics` | Diagnostics tile — error red, warn amber | [120x40](120x40/diagnostics.png) | [40x12](40x12/diagnostics.png) | | `interrupt-stopped` | Esc / Ctrl+c — `× Stopped` | [120x40](120x40/interrupt-stopped.png) | [40x12](40x12/interrupt-stopped.png) | | `error-unavailable` | API down — product-facing error | [120x40](120x40/error-unavailable.png) | — | +| `offline` | Network unreachable — held composer, distinct from API-down | [120x40](120x40/offline.png) | [40x12](40x12/offline.png) | +| `rate-limit` | HTTP 429 rate limited — retry-after, distinct from quota | [120x40](120x40/rate-limit.png) | [40x12](40x12/rate-limit.png) | | `tool-tiles` | Grouped tool calls expanded — Read / Grep / Shell | [120x40](120x40/tool-tiles.png) | — | | `tool-tiles-collapsed` | Grouped tool calls collapsed | [120x40](120x40/tool-tiles-collapsed.png) | — | | `shell-running` | Live Shell tile with output | [120x40](120x40/shell-running.png) | — | @@ -113,4 +115,4 @@ Regenerate: `python3 tools/render_lock_v2.py --index` (fetches IBM Plex Mono on | `config-tree` | `/config` read-only key tree | [120x40](120x40/config-tree.png) | — | | `btw` | `/btw` side note during a running turn | [120x40](120x40/btw.png) | — | -**82** boards at 120x40 · **36** at 40x12 · 118 PNGs. +**84** boards at 120x40 · **38** at 40x12 · 122 PNGs. diff --git a/docs/media/tui-lock-v2/runtime/120x40/offline.png b/docs/media/tui-lock-v2/runtime/120x40/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..72bb247479217d36e6e1ac648eeddacfd3ebd039 GIT binary patch literal 7731 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 Kxx&c#{(k|x_NYGq literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/runtime/40x12/offline.png b/docs/media/tui-lock-v2/runtime/40x12/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..c0dd21ab71a7341bfed4af7cfe176435521a3c92 GIT binary patch literal 4804 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 ZXgxe!=X=eoul%>n@Scfo{awdr{{>*aY%%}< literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/runtime/40x12/rate-limit.png b/docs/media/tui-lock-v2/runtime/40x12/rate-limit.png new file mode 100644 index 0000000000000000000000000000000000000000..9d7eb33c3b1fd0fc21d4e01e3e30d1549b9efb16 GIT binary patch literal 4726 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 keep going on this Cortex session 03:18 PM + + × You're offline + Reconnect when the network is back — your work is saved in this session. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ╭─ Agent ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ > Waiting for network — your work is saved │ + ╰─────────────────────────────────────────────────────────────────────────────────────────── Cortex Mini 1 (medium) ─╯ + + Enter:retry | Ctrl+x:shortcuts diff --git a/docs/media/tui-lock-v2/txt/120x40/rate-limit.txt b/docs/media/tui-lock-v2/txt/120x40/rate-limit.txt new file mode 100644 index 00000000..f4b7119e --- /dev/null +++ b/docs/media/tui-lock-v2/txt/120x40/rate-limit.txt @@ -0,0 +1,40 @@ + 14K / 500K + + > send another follow-up on Cortex Mini 1 03:22 PM + + × Rate limited + Too many requests — try again in 2m (Retry-After: 120s). Follow-ups stay held until the rate limit resets. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ╭─ Agent ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ > Add a follow-up — held until the rate limit resets │ + ╰─────────────────────────────────────────────────────────────────────────────────────────── Cortex Mini 1 (medium) ─╯ + + Enter:retry | /usage:details diff --git a/docs/media/tui-lock-v2/txt/40x12/offline.txt b/docs/media/tui-lock-v2/txt/40x12/offline.txt new file mode 100644 index 00000000..e1841cbe --- /dev/null +++ b/docs/media/tui-lock-v2/txt/40x12/offline.txt @@ -0,0 +1,12 @@ + 14K / 500K + + > keep going on this Cortex session + + × You're offline + Reconnect — your work is saved. + + ╭─ Agent ────────────────────────────╮ + │ > Waiting for network │ + ╰─────────── Cortex Mini 1 (medium) ─╯ + + Enter:retry | Ctrl+x:shortcuts diff --git a/docs/media/tui-lock-v2/txt/40x12/rate-limit.txt b/docs/media/tui-lock-v2/txt/40x12/rate-limit.txt new file mode 100644 index 00000000..3f52e88e --- /dev/null +++ b/docs/media/tui-lock-v2/txt/40x12/rate-limit.txt @@ -0,0 +1,12 @@ + 14K / 500K + + > send another follow-up on Cortex… + + × Rate limited + Too many requests — try again in… + + ╭─ Agent ────────────────────────────╮ + │ > Held until the rate limit resets │ + ╰─────────── Cortex Mini 1 (medium) ─╯ + + Enter:retry | /usage:details diff --git a/scripts/render-tui-lock-v2.sh b/scripts/render-tui-lock-v2.sh index b9006586..6a13db4f 100755 --- a/scripts/render-tui-lock-v2.sh +++ b/scripts/render-tui-lock-v2.sh @@ -59,8 +59,8 @@ for spec in 40x12 120x40; do python3 scripts/ansi-frames-to-gif.py --frames "$frames" --png-only "$pngs" done -unique_pngs "$output_dir/40x12" 36 -unique_pngs "$output_dir/120x40" 82 +unique_pngs "$output_dir/40x12" 38 +unique_pngs "$output_dir/120x40" 84 python3 - "$output_dir" <<'PY' from pathlib import Path @@ -100,8 +100,9 @@ is banner green `#1F4945`; historical violet `#A78BFA` is not the lock. Designer boards (pixel target) live in `docs/media/tui-lock-v2/{40x12,120x40}/`. These runtime frames are what Designer cli signs off against. -SPEC §7: **82** boards at 120×40 and **36** at 40×12. Each filename is one -distinct live state — no two PNGs share a sha256. +SPEC §7: **84** boards at 120×40 and **38** at 40×12. Each filename is one +distinct live state — no two PNGs share a sha256. Includes `/goal` composer +chips (`goal-chip-*`) plus distinct `offline` and `rate-limit` diagnostics. EOF echo "Wrote runtime captures to $output_dir" diff --git a/src/cortex-tui/src/lib.rs b/src/cortex-tui/src/lib.rs index dcd51655..3621ea14 100644 --- a/src/cortex-tui/src/lib.rs +++ b/src/cortex-tui/src/lib.rs @@ -106,6 +106,7 @@ pub mod lock_proof; pub mod lock_v2; mod lock_v2_goal; mod lock_v2_ids; +mod lock_v2_network; pub mod readme_hero; pub mod readme_hero_boards; pub mod splash_chrome; diff --git a/src/cortex-tui/src/lock_v2.rs b/src/cortex-tui/src/lock_v2.rs index 6f6b98ad..0f1292c5 100644 --- a/src/cortex-tui/src/lock_v2.rs +++ b/src/cortex-tui/src/lock_v2.rs @@ -32,6 +32,7 @@ use crate::widgets::SettingsModalState; use crate::widgets::settings_modal::SettingsRowKind; use crate::lock_v2_goal::{apply_goal_chip_scene, show_goal_in_narrow_palette}; +use crate::lock_v2_network::apply_offline_rate_limit_scene; pub use crate::lock_v2_ids::{LOCK_V2_NARROW_IDS, LOCK_V2_WIDE_IDS, lock_v2_scene_ids}; @@ -803,6 +804,7 @@ Tell me what you'd like to do.", state.add_message(Message::system(PRODUCT_ERROR)); state.add_message(Message::system(SERVICE_UNAVAILABLE_NEXT_STEP)); } + id if apply_offline_rate_limit_scene(id, &mut state) => {} "tool-tiles" => { resumed(&mut state); state.group_tool_calls = true; @@ -1148,8 +1150,8 @@ mod tests { #[test] fn lock_v2_wide_count_is_spec() { - assert_eq!(LOCK_V2_WIDE_IDS.len(), 82); - assert_eq!(LOCK_V2_NARROW_IDS.len(), 36); + assert_eq!(LOCK_V2_WIDE_IDS.len(), 84); + assert_eq!(LOCK_V2_NARROW_IDS.len(), 38); } #[test] diff --git a/src/cortex-tui/src/lock_v2_ids.rs b/src/cortex-tui/src/lock_v2_ids.rs index 7e067bfa..8b6274a4 100644 --- a/src/cortex-tui/src/lock_v2_ids.rs +++ b/src/cortex-tui/src/lock_v2_ids.rs @@ -1,7 +1,7 @@ //! Lock v2 scene id lists. Split out of [`crate::lock_v2`] so adding `/goal` //! boards does not grow that file past the source-policy line-count baseline. -/// Narrow (40×12) SPEC §7 set — 36 boards. +/// Narrow (40×12) SPEC §7 set — 38 boards. pub const LOCK_V2_NARROW_IDS: &[&str] = &[ "welcome-cortex", "welcome-agent", @@ -36,12 +36,14 @@ pub const LOCK_V2_NARROW_IDS: &[&str] = &[ "usage", "diagnostics", "interrupt-stopped", + "offline", + "rate-limit", "diff-hunk", "login", "shortcuts-overlay", ]; -/// Wide (120×40) SPEC §7 set — 82 boards. +/// Wide (120×40) SPEC §7 set — 84 boards. pub const LOCK_V2_WIDE_IDS: &[&str] = &[ "welcome-cortex", "welcome-agent", @@ -101,6 +103,8 @@ pub const LOCK_V2_WIDE_IDS: &[&str] = &[ "diagnostics", "interrupt-stopped", "error-unavailable", + "offline", + "rate-limit", "tool-tiles", "tool-tiles-collapsed", "shell-running", diff --git a/src/cortex-tui/src/lock_v2_network.rs b/src/cortex-tui/src/lock_v2_network.rs new file mode 100644 index 00000000..c67b5d1d --- /dev/null +++ b/src/cortex-tui/src/lock_v2_network.rs @@ -0,0 +1,127 @@ +//! Offline and HTTP 429 rate-limit lock v2 scenes. +//! +//! Split out of [`crate::lock_v2`] so the source-policy line-count baseline +//! on that file does not regress. Distinct from API-down (`error-unavailable`) +//! and period-quota (`quota-exhausted`). + +use cortex_core::widgets::Message; + +use crate::app::AppState; + +/// Apply an offline or rate-limit lock scene. Returns `false` when `id` is neither. +pub fn apply_offline_rate_limit_scene(id: &str, state: &mut AppState) -> bool { + match id { + "offline" => { + state.show_launch_splash = false; + state.tokens_used = 14_000; + state.add_message( + Message::user("keep going on this Cortex session").with_timestamp("03:18 PM"), + ); + state.add_message(Message::system("× You're offline")); + state.add_message(Message::system( + "Reconnect when the network is back — your work is saved in this session.", + )); + true + } + "rate-limit" => { + state.show_launch_splash = false; + state.tokens_used = 14_000; + state.add_message( + Message::user("send another follow-up on Cortex Mini 1").with_timestamp("03:22 PM"), + ); + state.add_message(Message::system("× Rate limited")); + state.add_message(Message::system( + "Too many requests — try again in 2m (Retry-After: 120s). Follow-ups stay held until the rate limit resets.", + )); + true + } + _ => false, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::lock_v2::render_lock_v2_scene; + + #[test] + fn offline_and_rate_limit_are_distinct_from_api_and_quota() { + let offline = render_lock_v2_scene("offline", 120, 40).expect("offline"); + let rate = render_lock_v2_scene("rate-limit", 120, 40).expect("rate-limit"); + let unavail = render_lock_v2_scene("error-unavailable", 120, 40).expect("unavail"); + let quota = render_lock_v2_scene("quota-exhausted", 120, 40).expect("quota"); + + assert!( + offline.plain.contains("You're offline"), + "offline title:\n{}", + offline.plain + ); + assert!( + offline.plain.contains("Reconnect") && offline.plain.contains("network"), + "offline body:\n{}", + offline.plain + ); + assert!( + !offline.plain.contains("temporarily unavailable"), + "offline must not reuse the API-down line:\n{}", + offline.plain + ); + + assert!( + rate.plain.contains("Rate limited"), + "rate-limit title:\n{}", + rate.plain + ); + assert!( + rate.plain.contains("Retry-After") || rate.plain.contains("try again in 2m"), + "rate-limit retry-after:\n{}", + rate.plain + ); + assert!( + !rate.plain.contains("Agent quota exhausted") && !rate.plain.contains("500 / 500"), + "rate-limit must not reuse the quota board:\n{}", + rate.plain + ); + assert!( + !rate.plain.contains("upgrade at cortex.foundation/billing"), + "rate-limit must not lead with a billing upgrade CTA:\n{}", + rate.plain + ); + + assert_ne!(offline.ansi, unavail.ansi); + assert_ne!(rate.ansi, quota.ansi); + assert_ne!(offline.ansi, rate.ansi); + + for (width, height) in [(120u16, 40u16), (40u16, 12u16)] { + let a = render_lock_v2_scene("offline", width, height).expect("offline"); + let b = render_lock_v2_scene("rate-limit", width, height).expect("rate-limit"); + assert_ne!( + a.ansi, b.ansi, + "offline and rate-limit collide at {width}x{height}" + ); + assert!( + a.plain.contains("offline") || a.plain.contains("You're offline"), + "offline at {width}x{height}:\n{}", + a.plain + ); + assert!( + b.plain.contains("Rate limited") || b.plain.contains("Too many requests"), + "rate-limit at {width}x{height}:\n{}", + b.plain + ); + } + } + + #[test] + fn apply_rejects_unknown_ids() { + let mut state = AppState::default(); + assert!(!apply_offline_rate_limit_scene( + "error-unavailable", + &mut state + )); + assert!(!apply_offline_rate_limit_scene( + "quota-exhausted", + &mut state + )); + } +} From 72cd82cc06a8b1903aa801fb726d6f5c4f0924ba Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 15:48:45 +0000 Subject: [PATCH 2/4] fix(tui): match lock_v2 offline/rate-limit to designer Hold composer + footer for offline and HTTP 429; paint titles error-red and bodies dim. Re-render runtime PNGs only. Co-authored-by: Mathis --- .../tui-lock-v2/runtime/120x40/offline.png | Bin 7731 -> 7833 bytes .../tui-lock-v2/runtime/120x40/rate-limit.png | Bin 8274 -> 8422 bytes .../tui-lock-v2/runtime/40x12/offline.png | Bin 4804 -> 3939 bytes .../tui-lock-v2/runtime/40x12/rate-limit.png | Bin 4726 -> 4695 bytes src/cortex-tui/src/app/state.rs | 6 + src/cortex-tui/src/lock_v2_network.rs | 134 ++++++++++++++++-- src/cortex-tui/src/ui/chrome.rs | 11 ++ src/cortex-tui/src/ui/consts.rs | 10 ++ .../src/views/minimal_session/rendering.rs | 3 +- .../src/views/minimal_session/view.rs | 17 ++- 10 files changed, 170 insertions(+), 11 deletions(-) diff --git a/docs/media/tui-lock-v2/runtime/120x40/offline.png b/docs/media/tui-lock-v2/runtime/120x40/offline.png index 72bb247479217d36e6e1ac648eeddacfd3ebd039..cb008a8d356841942055b5348487f6315a9b8a61 100644 GIT binary patch literal 7833 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 literal 8274 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 Kxx&c#{(k|x_NYGq diff --git a/docs/media/tui-lock-v2/runtime/40x12/offline.png b/docs/media/tui-lock-v2/runtime/40x12/offline.png index c0dd21ab71a7341bfed4af7cfe176435521a3c92..65c70d3f187eff896495b04349011399f15ffdad 100644 GIT binary patch delta 3808 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 ZXgxe!=X=eoul%>n@Scfo{awdr{{>*aY%%}< diff --git a/docs/media/tui-lock-v2/runtime/40x12/rate-limit.png b/docs/media/tui-lock-v2/runtime/40x12/rate-limit.png index 9d7eb33c3b1fd0fc21d4e01e3e30d1549b9efb16..55cbd11f9016702ab2978ce70625154f9653437f 100644 GIT binary patch literal 4695 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 delta 4571 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, /// Agent quota is exhausted — follow-ups stay in the composer until it resets. pub quota_held: bool, + /// Network is unreachable — follow-ups stay in the composer until reconnect. + pub offline_held: bool, + /// HTTP 429 rate limit — follow-ups stay in the composer until Retry-After. + pub rate_limit_held: bool, /// Launched via the `agent` binary / alias. pub agent_entrypoint: bool, /// Token counter used / window. @@ -342,6 +346,8 @@ impl AppState { update_status: UpdateStatus::default(), update_info: None, quota_held: false, + offline_held: false, + rate_limit_held: false, agent_entrypoint: false, tokens_used: 0, context_window: 500_000, diff --git a/src/cortex-tui/src/lock_v2_network.rs b/src/cortex-tui/src/lock_v2_network.rs index c67b5d1d..d81e704b 100644 --- a/src/cortex-tui/src/lock_v2_network.rs +++ b/src/cortex-tui/src/lock_v2_network.rs @@ -8,31 +8,41 @@ use cortex_core::widgets::Message; use crate::app::AppState; +pub const OFFLINE_TITLE: &str = "× You're offline"; +pub const OFFLINE_BODY: &str = + "Reconnect when the network is back — your work is saved in this session."; +pub const OFFLINE_BODY_NARROW: &str = "Reconnect — your work is saved."; +pub const RATE_LIMIT_TITLE: &str = "× Rate limited"; +pub const RATE_LIMIT_BODY: &str = "Too many requests — try again in 2m (Retry-After: 120s). Follow-ups stay held until the rate limit resets."; + /// Apply an offline or rate-limit lock scene. Returns `false` when `id` is neither. pub fn apply_offline_rate_limit_scene(id: &str, state: &mut AppState) -> bool { + let narrow = state.terminal_size.0 <= 40; match id { "offline" => { state.show_launch_splash = false; state.tokens_used = 14_000; + state.offline_held = true; state.add_message( Message::user("keep going on this Cortex session").with_timestamp("03:18 PM"), ); - state.add_message(Message::system("× You're offline")); - state.add_message(Message::system( - "Reconnect when the network is back — your work is saved in this session.", - )); + state.add_message(Message::system(OFFLINE_TITLE)); + state.add_message(Message::system(if narrow { + OFFLINE_BODY_NARROW + } else { + OFFLINE_BODY + })); true } "rate-limit" => { state.show_launch_splash = false; state.tokens_used = 14_000; + state.rate_limit_held = true; state.add_message( Message::user("send another follow-up on Cortex Mini 1").with_timestamp("03:22 PM"), ); - state.add_message(Message::system("× Rate limited")); - state.add_message(Message::system( - "Too many requests — try again in 2m (Retry-After: 120s). Follow-ups stay held until the rate limit resets.", - )); + state.add_message(Message::system(RATE_LIMIT_TITLE)); + state.add_message(Message::system(RATE_LIMIT_BODY)); true } _ => false, @@ -43,6 +53,27 @@ pub fn apply_offline_rate_limit_scene(id: &str, state: &mut AppState) -> bool { mod tests { use super::*; use crate::lock_v2::render_lock_v2_scene; + use crate::ui::consts::{ + PLACEHOLDER_OFFLINE, PLACEHOLDER_OFFLINE_NARROW, PLACEHOLDER_QUOTA, PLACEHOLDER_RATE_LIMIT, + PLACEHOLDER_RATE_LIMIT_NARROW, + }; + use cortex_core::style::{ERROR, TEXT_DIM}; + use ratatui::style::Color; + + fn first_fg(frame: &crate::lock_proof::LockFrame, needle: &str) -> Option { + let width = frame.buffer.area.width; + let height = frame.buffer.area.height; + for y in 0..height { + let mut row = String::new(); + for x in 0..width { + row.push_str(frame.buffer[(x, y)].symbol()); + } + if let Some(idx) = row.find(needle) { + return Some(frame.buffer[(idx as u16, y)].fg); + } + } + None + } #[test] fn offline_and_rate_limit_are_distinct_from_api_and_quota() { @@ -57,7 +88,7 @@ mod tests { offline.plain ); assert!( - offline.plain.contains("Reconnect") && offline.plain.contains("network"), + offline.plain.contains(OFFLINE_BODY), "offline body:\n{}", offline.plain ); @@ -66,6 +97,21 @@ mod tests { "offline must not reuse the API-down line:\n{}", offline.plain ); + assert!( + offline.plain.contains(PLACEHOLDER_OFFLINE), + "offline held composer:\n{}", + offline.plain + ); + assert!( + offline.plain.contains("Enter:retry") && offline.plain.contains("Ctrl+x:shortcuts"), + "offline footer:\n{}", + offline.plain + ); + assert!( + !offline.plain.contains("Shift+Tab:mode"), + "offline must not use the idle footer:\n{}", + offline.plain + ); assert!( rate.plain.contains("Rate limited"), @@ -87,6 +133,32 @@ mod tests { "rate-limit must not lead with a billing upgrade CTA:\n{}", rate.plain ); + assert!( + rate.plain.contains(PLACEHOLDER_RATE_LIMIT), + "rate-limit held composer:\n{}", + rate.plain + ); + assert!( + !rate.plain.contains(PLACEHOLDER_QUOTA), + "rate-limit must not reuse the quota placeholder:\n{}", + rate.plain + ); + assert!( + rate.plain.contains("Enter:retry") && rate.plain.contains("/usage:details"), + "rate-limit footer:\n{}", + rate.plain + ); + assert!( + !rate.plain.contains("Shift+Tab:mode"), + "rate-limit must not use the idle footer:\n{}", + rate.plain + ); + + assert_eq!(first_fg(&offline, "You're offline"), Some(ERROR)); + assert_eq!(first_fg(&offline, "Reconnect"), Some(TEXT_DIM)); + assert_eq!(first_fg(&rate, "Rate limited"), Some(ERROR)); + assert_eq!(first_fg(&rate, "Too many requests"), Some(TEXT_DIM)); + assert_eq!(first_fg(&unavail, "temporarily unavailable"), Some(ERROR)); assert_ne!(offline.ansi, unavail.ansi); assert_ne!(rate.ansi, quota.ansi); @@ -109,7 +181,48 @@ mod tests { "rate-limit at {width}x{height}:\n{}", b.plain ); + assert_eq!( + first_fg(&a, "You're offline"), + Some(ERROR), + "offline title red at {width}x{height}" + ); + assert_eq!( + first_fg(&b, "Rate limited"), + Some(ERROR), + "rate-limit title red at {width}x{height}" + ); + assert_eq!( + first_fg(&b, "Too many requests"), + Some(TEXT_DIM), + "rate-limit body dim at {width}x{height}" + ); } + + let offline_n = render_lock_v2_scene("offline", 40, 12).expect("offline narrow"); + assert!( + offline_n.plain.contains(OFFLINE_BODY_NARROW), + "narrow offline body:\n{}", + offline_n.plain + ); + assert!( + !offline_n.plain.contains("when the network is back"), + "narrow offline must use the short body:\n{}", + offline_n.plain + ); + assert!( + offline_n.plain.contains(PLACEHOLDER_OFFLINE_NARROW), + "narrow offline placeholder:\n{}", + offline_n.plain + ); + assert_eq!(first_fg(&offline_n, "Reconnect"), Some(TEXT_DIM)); + + let rate_n = render_lock_v2_scene("rate-limit", 40, 12).expect("rate-limit narrow"); + assert!( + rate_n.plain.contains(PLACEHOLDER_RATE_LIMIT_NARROW) + || rate_n.plain.contains("rate limit resets"), + "narrow rate-limit placeholder:\n{}", + rate_n.plain + ); } #[test] @@ -123,5 +236,8 @@ mod tests { "quota-exhausted", &mut state )); + assert!(!state.offline_held); + assert!(!state.rate_limit_held); + assert!(!state.quota_held); } } diff --git a/src/cortex-tui/src/ui/chrome.rs b/src/cortex-tui/src/ui/chrome.rs index 6636302e..c5243863 100644 --- a/src/cortex-tui/src/ui/chrome.rs +++ b/src/cortex-tui/src/ui/chrome.rs @@ -250,6 +250,7 @@ pub enum FooterSet { Resume, Bash, Unavailable, + RateLimit, Palette, } @@ -454,6 +455,16 @@ impl FooterSet { label: "shortcuts", }, ], + Self::RateLimit => &[ + FooterHint { + key: "Enter", + label: "retry", + }, + FooterHint { + key: "/usage", + label: "details", + }, + ], Self::Palette => &[ FooterHint { key: "Enter", diff --git a/src/cortex-tui/src/ui/consts.rs b/src/cortex-tui/src/ui/consts.rs index 80e9885c..659f690f 100644 --- a/src/cortex-tui/src/ui/consts.rs +++ b/src/cortex-tui/src/ui/consts.rs @@ -49,6 +49,16 @@ pub const PLACEHOLDER_QUOTA: &str = "Add a follow-up — held until quota resets /// Narrow (40-column) form of the quota placeholder. pub const PLACEHOLDER_QUOTA_NARROW: &str = "Follow-up — held until quota resets"; +/// Composer placeholder while the session is offline. +pub const PLACEHOLDER_OFFLINE: &str = "Waiting for network — your work is saved"; +/// Narrow (40-column) form of the offline placeholder. +pub const PLACEHOLDER_OFFLINE_NARROW: &str = "Waiting for network"; + +/// Composer placeholder while HTTP 429 holds follow-ups. +pub const PLACEHOLDER_RATE_LIMIT: &str = "Add a follow-up — held until the rate limit resets"; +/// Narrow (40-column) form of the rate-limit placeholder. +pub const PLACEHOLDER_RATE_LIMIT_NARROW: &str = "Held until the rate limit resets"; + /// Sandbox deny title painted in error red. pub const SANDBOX_DENIED_TITLE: &str = "Sandbox denied"; diff --git a/src/cortex-tui/src/views/minimal_session/rendering.rs b/src/cortex-tui/src/views/minimal_session/rendering.rs index 10e99421..5c49a264 100644 --- a/src/cortex-tui/src/views/minimal_session/rendering.rs +++ b/src/cortex-tui/src/views/minimal_session/rendering.rs @@ -127,7 +127,8 @@ pub fn render_message_with_theme( || msg.content.contains("timed out") || msg.content.contains("failed") || msg.content.contains("Invalid") - || msg.content.contains("limit") + || msg.content.contains("You're offline") + || msg.content.contains("Rate limited") || msg.content.contains("Stopped") || msg.content.contains("quota exhausted") || msg.content.contains("Sandbox denied") diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index 51a8c4e6..4b87fd3b 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -306,6 +306,18 @@ impl<'a> MinimalSessionView<'a> { let placeholder = if input_text.is_empty() { Some(if prompt_owns_focus { PLACEHOLDER_PROMPT + } else if self.app_state.offline_held { + if area_is_narrow(self.app_state.terminal_size.0) { + crate::ui::consts::PLACEHOLDER_OFFLINE_NARROW + } else { + crate::ui::consts::PLACEHOLDER_OFFLINE + } + } else if self.app_state.rate_limit_held { + if area_is_narrow(self.app_state.terminal_size.0) { + crate::ui::consts::PLACEHOLDER_RATE_LIMIT_NARROW + } else { + crate::ui::consts::PLACEHOLDER_RATE_LIMIT + } } else if self.app_state.quota_held { crate::ui::consts::PLACEHOLDER_QUOTA } else if self.is_task_running() { @@ -720,9 +732,12 @@ pub const PALETTE_FOOTER_HINT_SHORT: &str = "Enter:send | Ctrl+x:shortcuts"; impl<'a> MinimalSessionView<'a> { fn footer_set(&self, is_task_running: bool, width: u16) -> FooterSet { - if self.app_state.quota_held { + if self.app_state.offline_held || self.app_state.quota_held { return FooterSet::Unavailable; } + if self.app_state.rate_limit_held { + return FooterSet::RateLimit; + } if let Some(state) = self.app_state.get_interactive_state() { if state.effort_focused { return FooterSet::Effort; From 2c94a29c218f63df99cda5b2f491ee9e16e04bfc Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:07:13 +0000 Subject: [PATCH 3/4] fix(tui): keep lock-red copy without rendering.rs line debt Co-authored-by: Mathis --- .../src/views/minimal_session/rendering.rs | 18 +------- .../src/views/minimal_session/text_utils.rs | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/cortex-tui/src/views/minimal_session/rendering.rs b/src/cortex-tui/src/views/minimal_session/rendering.rs index 5c49a264..adacb9fb 100644 --- a/src/cortex-tui/src/views/minimal_session/rendering.rs +++ b/src/cortex-tui/src/views/minimal_session/rendering.rs @@ -120,23 +120,7 @@ pub fn render_message_with_theme( } } MessageRole::System => { - // Detect error messages - show in error color - let is_error = msg.content.contains("Check your") - || msg.content.contains("temporarily unavailable") - || msg.content.contains("Access denied") - || msg.content.contains("timed out") - || msg.content.contains("failed") - || msg.content.contains("Invalid") - || msg.content.contains("You're offline") - || msg.content.contains("Rate limited") - || msg.content.contains("Stopped") - || msg.content.contains("quota exhausted") - || msg.content.contains("Sandbox denied") - || msg.content.contains("dropped") - || msg.content.starts_with("Error:") - || msg.content.contains("provider appears to be overloaded") - || msg.content.contains("internet connection") - || msg.content.contains("proxy is experiencing issues"); + let is_error = super::text_utils::system_message_is_error(&msg.content); // Errors in lock red; other system copy stays dim gray. let text_color = if is_error { diff --git a/src/cortex-tui/src/views/minimal_session/text_utils.rs b/src/cortex-tui/src/views/minimal_session/text_utils.rs index 19282b1f..8167f949 100644 --- a/src/cortex-tui/src/views/minimal_session/text_utils.rs +++ b/src/cortex-tui/src/views/minimal_session/text_utils.rs @@ -2,6 +2,30 @@ use unicode_width::{UnicodeWidthChar, UnicodeWidthStr}; +/// Lock-red system copy: API-down, offline, HTTP 429, quota, sandbox, and similar. +pub(super) fn system_message_is_error(content: &str) -> bool { + content.starts_with("Error:") + || [ + "Check your", + "temporarily unavailable", + "Access denied", + "timed out", + "failed", + "Invalid", + "You're offline", + "Rate limited", + "Stopped", + "quota exhausted", + "Sandbox denied", + "dropped", + "provider appears to be overloaded", + "internet connection", + "proxy is experiencing issues", + ] + .iter() + .any(|needle| content.contains(needle)) +} + /// Wraps text to fit within a maximum width (measured in visual columns). /// /// This function performs word wrapping, breaking lines at word boundaries @@ -140,3 +164,23 @@ fn split_long_word_returning_last( None } } + +#[cfg(test)] +mod tests { + use super::system_message_is_error; + + #[test] + fn lock_red_system_copy_includes_offline_and_rate_limit() { + assert!(system_message_is_error("× You're offline")); + assert!(system_message_is_error("× Rate limited")); + assert!(system_message_is_error( + "The coding service is temporarily unavailable" + )); + assert!(!system_message_is_error( + "Reconnect when the network is back — your work is saved in this session." + )); + assert!(!system_message_is_error( + "Too many requests — try again in 2m (Retry-After: 120s). Follow-ups stay held until the rate limit resets." + )); + } +} From 597264042cf299ebbadaa2184203230883410ed5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:08:05 +0000 Subject: [PATCH 4/4] fix(tui): keep context-limit lock-red without dimming 429 body Co-authored-by: Mathis --- src/cortex-tui/src/views/minimal_session/text_utils.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cortex-tui/src/views/minimal_session/text_utils.rs b/src/cortex-tui/src/views/minimal_session/text_utils.rs index 8167f949..de821f16 100644 --- a/src/cortex-tui/src/views/minimal_session/text_utils.rs +++ b/src/cortex-tui/src/views/minimal_session/text_utils.rs @@ -14,6 +14,7 @@ pub(super) fn system_message_is_error(content: &str) -> bool { "Invalid", "You're offline", "Rate limited", + "context limit", "Stopped", "quota exhausted", "Sandbox denied", @@ -176,6 +177,7 @@ mod tests { assert!(system_message_is_error( "The coding service is temporarily unavailable" )); + assert!(system_message_is_error("context limit reached")); assert!(!system_message_is_error( "Reconnect when the network is back — your work is saved in this session." ));