From 6ed5eef2d2f5705f03d88a4aaff0fad0d5d1a886 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:06:12 +0000 Subject: [PATCH 01/15] feat(tui): residual lock chrome for shortcuts, goal, composer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Interactive /shortcuts sheet, /goal status polish, composer hover and Alt+Enter, denser diff/markdown locks, and distinct thinking/stop/todos question states. COR-7/9/10/14/15 only — not offline or 429 chrome. Co-authored-by: Mathis --- design/cli-lock-board-index.md | 13 +- docs/reference/keyboard.md | 3 +- docs/reference/slash-commands.md | 1 + src/cortex-cli/src/verify_mcp/tui.rs | 18 ++ src/cortex-engine/src/goal/types.rs | 26 +- src/cortex-tui/src/actions/mapper.rs | 18 +- src/cortex-tui/src/app/checklist.rs | 72 +++++ src/cortex-tui/src/app/mod.rs | 3 + src/cortex-tui/src/app/sheet.rs | 80 +++++ src/cortex-tui/src/app/state.rs | 17 +- .../src/commands/executor/dispatch.rs | 1 + src/cortex-tui/src/commands/executor/tests.rs | 13 + .../src/commands/registry/builtin.rs | 9 + src/cortex-tui/src/lib.rs | 1 + src/cortex-tui/src/lock_v2_boards.rs | 142 ++++++--- src/cortex-tui/src/lock_v2_residual.rs | 159 ++++++++++ src/cortex-tui/src/lock_v2_scenes.rs | 52 ++-- .../src/runner/event_loop/commands.rs | 13 +- src/cortex-tui/src/runner/event_loop/core.rs | 1 + src/cortex-tui/src/runner/event_loop/input.rs | 8 +- src/cortex-tui/src/runner/event_loop/mouse.rs | 16 + src/cortex-tui/src/runner/event_loop/tools.rs | 62 ++-- src/cortex-tui/src/ui/chrome.rs | 13 + .../src/views/minimal_session/checklist.rs | 83 ++++++ .../src/views/minimal_session/mod.rs | 1 + .../src/views/minimal_session/rendering.rs | 4 + .../src/views/minimal_session/view.rs | 9 +- src/cortex-tui/src/views/tool_call.rs | 5 +- .../src/widgets/shortcuts_overlay.rs | 275 +++++++++++++++--- 29 files changed, 965 insertions(+), 153 deletions(-) create mode 100644 src/cortex-tui/src/app/checklist.rs create mode 100644 src/cortex-tui/src/app/sheet.rs create mode 100644 src/cortex-tui/src/lock_v2_residual.rs create mode 100644 src/cortex-tui/src/views/minimal_session/checklist.rs diff --git a/design/cli-lock-board-index.md b/design/cli-lock-board-index.md index 18877f75..3d3e178c 100644 --- a/design/cli-lock-board-index.md +++ b/design/cli-lock-board-index.md @@ -18,13 +18,12 @@ Verifier tools are the hidden `cortex mcp-server --verify` surface `lock.palette_audit`, `lock.diff_txt`, `tui.*`, `login.run`, `api.*`, `mcp.*`, `report.finish`. Guide: [Verification MCP](../docs/guides/development.md). -`tui.key` (`verify_mcp/tui.rs` `apply_key`) only applies composer **Clear**, -**NewLine** (`Shift+Enter` in the production mapper), **Backspace**, and -**single-character insert**. `F2`, `Shift+Tab`, `Alt+Enter`, and `Ctrl+x` -parse as keys and return success but are no-ops: they do not open Settings -or Shortcuts, cycle mode, or insert a newline. Designer lock copy still -shows those chords; cover those boards with `lock.render`, -`cargo test -p cortex-tui`, or `tui.type` / `tui.slash`, not `tui.key`. +`tui.key` (`verify_mcp/tui.rs` `apply_key`) applies composer **Clear**, +**NewLine** (`Shift+Enter` and `Alt+Enter`), **Backspace**, **single-character +insert**, and **Ctrl+x** / **Esc** / **Up** / **Down** on the shortcuts sheet. +`F2` and `Shift+Tab` still do not open Settings or cycle mode via `tui.key`. +Cover those boards with `lock.render`, `cargo test -p cortex-tui`, or +`tui.type` / `tui.slash`. **Flow** in the tables is a named interactive scenario on that verify server (or the matching `cargo test -p cortex-tui` case), not a separate spec: diff --git a/docs/reference/keyboard.md b/docs/reference/keyboard.md index 47821da5..00d1c388 100644 --- a/docs/reference/keyboard.md +++ b/docs/reference/keyboard.md @@ -29,7 +29,8 @@ or `F1` at any time for the in-app version. | Key | Action | |-----|--------| | `Enter` | Send | -| `Shift+Enter` | Insert a newline | +| `Shift+Enter` or `Alt+Enter` | Insert a newline | +| `Ctrl+x` | Open or close the shortcuts sheet | | `Up` / `Down` | Previous / next prompt in history | | `Ctrl+U` or `Ctrl+L` | Clear the composer | | `Ctrl+V` | Paste | diff --git a/docs/reference/slash-commands.md b/docs/reference/slash-commands.md index d7131e7c..d5e55009 100644 --- a/docs/reference/slash-commands.md +++ b/docs/reference/slash-commands.md @@ -44,6 +44,7 @@ ordinary message. | `/install-github-app` | | Install the Cortex GitHub App | | `/bug` | | `/bug [description]` | | `/goal` | | `/goal [objective\|status\|pause\|resume\|clear]` — persisted long-horizon objective | +| `/shortcuts` | `keys` | Open the shortcuts sheet (also `Ctrl+x`) | ## Authentication and billing diff --git a/src/cortex-cli/src/verify_mcp/tui.rs b/src/cortex-cli/src/verify_mcp/tui.rs index 12a7f4a6..477e4e1d 100644 --- a/src/cortex-cli/src/verify_mcp/tui.rs +++ b/src/cortex-cli/src/verify_mcp/tui.rs @@ -307,6 +307,24 @@ pub fn stop(state: &mut VerifyState, args: &Value) -> Result { } fn apply_key(session: &mut TuiSession, name: &str) -> Result<()> { + if name.eq_ignore_ascii_case("Ctrl+x") { + session.app_state.toggle_shortcuts_sheet(); + return Ok(()); + } + if session.app_state.shortcuts_open { + if name.eq_ignore_ascii_case("Esc") || name.eq_ignore_ascii_case("F2") { + session.app_state.close_shortcuts_sheet(); + return Ok(()); + } + if name.eq_ignore_ascii_case("Down") { + session.app_state.shortcuts_move(1); + return Ok(()); + } + if name.eq_ignore_ascii_case("Up") { + session.app_state.shortcuts_move(-1); + return Ok(()); + } + } let event = parse_key_string(name).ok_or_else(|| anyhow::anyhow!("unknown key {name}"))?; let action = session.mapper.get_action(event, ActionContext::Input); match action { diff --git a/src/cortex-engine/src/goal/types.rs b/src/cortex-engine/src/goal/types.rs index 0f79d6f6..00710ffb 100644 --- a/src/cortex-engine/src/goal/types.rs +++ b/src/cortex-engine/src/goal/types.rs @@ -254,9 +254,19 @@ impl Goal { ) } - /// Pause / resume / set acknowledgement that repeats the chip. + /// Pause / resume / set acknowledgement that repeats the chip and next step. pub fn action_text(&self, action: &str) -> String { - format!("{action} {}", self.chip()) + format!("{action} {}\n next: {}", self.chip(), self.next_step()) + } + + /// Compact TUI card for `/goal` and `/goal status`. + pub fn status_card(&self) -> String { + format!( + "{}\n {}\n next: {}\n /goal pause · /goal resume · /goal clear", + self.chip(), + self.objective, + self.next_step() + ) } pub fn turns_remaining(&self) -> u32 { @@ -325,6 +335,18 @@ mod tests { assert!(text.starts_with("Goal · 7/8"), "{text}"); assert!(text.contains("wrap-up"), "{text}"); assert!(text.contains("write out.txt"), "{text}"); + let card = goal.status_card(); + assert!(card.contains("Goal · 7/8"), "{card}"); + assert!(card.contains("/goal pause"), "{card}"); + assert!(card.contains("/goal resume"), "{card}"); + assert!(card.contains("/goal clear"), "{card}"); + let paused = { + let mut g = goal.clone(); + g.state = GoalState::Paused; + g.action_text("Goal paused.") + }; + assert!(paused.contains("Goal · paused"), "{paused}"); + assert!(paused.contains("next:"), "{paused}"); } #[test] diff --git a/src/cortex-tui/src/actions/mapper.rs b/src/cortex-tui/src/actions/mapper.rs index 2702d5c1..a36cc441 100644 --- a/src/cortex-tui/src/actions/mapper.rs +++ b/src/cortex-tui/src/actions/mapper.rs @@ -159,12 +159,17 @@ impl ActionMapper { KeyAction::Submit, "Submit message", ), - // New line (Shift+Enter) + // New line (Shift+Enter or Alt+Enter — lock footer) KeyBinding::input( KeyEvent::new(KeyCode::Enter, KeyModifiers::SHIFT), KeyAction::NewLine, "Insert new line", ), + KeyBinding::input( + KeyEvent::new(KeyCode::Enter, KeyModifiers::ALT), + KeyAction::NewLine, + "Insert new line", + ), // History navigation KeyBinding::input( KeyEvent::new(KeyCode::Up, KeyModifiers::NONE), @@ -552,6 +557,17 @@ mod tests { KeyAction::Submit ); + let alt_enter = KeyEvent::new(KeyCode::Enter, KeyModifiers::ALT); + assert_eq!( + mapper.get_action(alt_enter, ActionContext::Input), + KeyAction::NewLine + ); + let shift_enter = KeyEvent::new(KeyCode::Enter, KeyModifiers::SHIFT); + assert_eq!( + mapper.get_action(shift_enter, ActionContext::Input), + KeyAction::NewLine + ); + // Test global fallback let help_key = KeyEvent::new(KeyCode::Char('?'), KeyModifiers::NONE); assert_eq!( diff --git a/src/cortex-tui/src/app/checklist.rs b/src/cortex-tui/src/app/checklist.rs new file mode 100644 index 00000000..a3be9e94 --- /dev/null +++ b/src/cortex-tui/src/app/checklist.rs @@ -0,0 +1,72 @@ +//! Session working checklist (lock `todos`). + +use super::subagent::{SubagentTodoItem, SubagentTodoStatus}; + +/// Live turn checklist painted above the composer — distinct from subagent tiles. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct WorkingChecklist { + pub elapsed_secs: u32, + pub tokens: u64, + pub items: Vec, +} + +impl WorkingChecklist { + pub fn new(items: Vec, elapsed_secs: u32, tokens: u64) -> Self { + Self { + elapsed_secs, + tokens, + items, + } + } + + pub fn done(&self) -> usize { + self.items + .iter() + .filter(|t| matches!(t.status, SubagentTodoStatus::Completed)) + .count() + } + + pub fn header(&self) -> String { + format!( + "⠇ Working {}/{} · {}s · {}", + self.done(), + self.items.len(), + self.elapsed_secs, + compact_tokens(self.tokens) + ) + } +} + +fn compact_tokens(n: u64) -> String { + if n >= 1_000 { + let k = n as f64 / 1_000.0; + if (k - k.round()).abs() < 0.05 { + format!("{}k tokens", k as u64) + } else { + format!("{k:.1}k tokens") + } + } else { + format!("{n} tokens") + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn header_matches_lock_copy() { + let board = WorkingChecklist::new( + vec![ + SubagentTodoItem::new("a", SubagentTodoStatus::Completed), + SubagentTodoItem::new("b", SubagentTodoStatus::Completed), + SubagentTodoItem::new("c", SubagentTodoStatus::InProgress), + SubagentTodoItem::new("d", SubagentTodoStatus::Pending), + SubagentTodoItem::new("e", SubagentTodoStatus::Pending), + ], + 38, + 6_100, + ); + assert_eq!(board.header(), "⠇ Working 2/5 · 38s · 6.1k tokens"); + } +} diff --git a/src/cortex-tui/src/app/mod.rs b/src/cortex-tui/src/app/mod.rs index afe99f92..16e46f9b 100644 --- a/src/cortex-tui/src/app/mod.rs +++ b/src/cortex-tui/src/app/mod.rs @@ -4,8 +4,10 @@ mod approval; mod autocomplete; +mod checklist; mod methods; mod session; +mod sheet; mod state; mod streaming; mod subagent; @@ -15,6 +17,7 @@ mod update_status; // Re-export all public types pub use approval::{ApprovalState, PendingToolResult}; pub use autocomplete::{AutocompleteItem, AutocompleteState}; +pub use checklist::WorkingChecklist; pub use session::{ActiveModal, SessionSummary}; pub use state::AppState; pub use streaming::StreamingState; diff --git a/src/cortex-tui/src/app/sheet.rs b/src/cortex-tui/src/app/sheet.rs new file mode 100644 index 00000000..ca896976 --- /dev/null +++ b/src/cortex-tui/src/app/sheet.rs @@ -0,0 +1,80 @@ +//! `/shortcuts` sheet open / navigate / dismiss. + +use ratatui::layout::Rect; + +use crate::widgets::ShortcutsOverlay; + +use super::state::AppState; + +impl AppState { + pub fn open_shortcuts_sheet(&mut self) { + self.settings_modal = None; + self.shortcuts_open = true; + self.shortcuts_selected = 0; + self.shortcuts_hovered = None; + } + + pub fn close_shortcuts_sheet(&mut self) { + self.shortcuts_open = false; + self.shortcuts_hovered = None; + } + + pub fn toggle_shortcuts_sheet(&mut self) { + if self.shortcuts_open { + self.close_shortcuts_sheet(); + } else { + self.open_shortcuts_sheet(); + } + } + + pub fn shortcuts_move(&mut self, delta: i32) { + let (w, h) = self.terminal_size; + let area = Rect::new(0, 0, w.max(40), h.max(12)); + let n = ShortcutsOverlay::row_count(area).max(1) as i32; + let next = (self.shortcuts_selected as i32 + delta).rem_euclid(n); + self.shortcuts_selected = next as usize; + } + + pub fn shortcuts_hover_at(&mut self, x: u16, y: u16) { + let (w, h) = self.terminal_size; + let area = Rect::new(0, 0, w.max(1), h.max(1)); + self.shortcuts_hovered = ShortcutsOverlay::row_at(area, x, y); + } + + pub fn shortcuts_close_hit(&self, x: u16, y: u16) -> bool { + let (w, h) = self.terminal_size; + let area = Rect::new(0, 0, w.max(1), h.max(1)); + ShortcutsOverlay::close_hit(area, x, y) + } + + pub fn shortcuts_select_at(&mut self, x: u16, y: u16) -> bool { + let (w, h) = self.terminal_size; + let area = Rect::new(0, 0, w.max(1), h.max(1)); + if let Some(idx) = ShortcutsOverlay::row_at(area, x, y) { + self.shortcuts_selected = idx; + true + } else { + false + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn open_navigate_dismiss() { + let mut state = AppState::default(); + state.terminal_size = (120, 40); + state.toggle_shortcuts_sheet(); + assert!(state.shortcuts_open); + assert_eq!(state.shortcuts_selected, 0); + state.shortcuts_move(1); + assert_eq!(state.shortcuts_selected, 1); + state.shortcuts_move(-1); + assert_eq!(state.shortcuts_selected, 0); + state.toggle_shortcuts_sheet(); + assert!(!state.shortcuts_open); + } +} diff --git a/src/cortex-tui/src/app/state.rs b/src/cortex-tui/src/app/state.rs index 328422eb..316446b5 100644 --- a/src/cortex-tui/src/app/state.rs +++ b/src/cortex-tui/src/app/state.rs @@ -223,8 +223,16 @@ pub struct AppState { pub footer_hover: Option, /// Settings modal (F2 / `/settings`). pub settings_modal: Option, - /// Ctrl+x shortcuts overlay. + /// Ctrl+x / `/shortcuts` overlay. pub shortcuts_open: bool, + /// Focused binding in the shortcuts sheet. + pub shortcuts_selected: usize, + /// Hovered binding in the shortcuts sheet. + pub shortcuts_hovered: Option, + /// Session working checklist (lock `todos`). + pub working_checklist: Option, + /// Last turn was interrupted — composer uses the stopped placeholder. + pub last_turn_stopped: bool, /// Show the Help improve Cortex banner. pub opt_in_banner: bool, /// Hovered opt-in button: 0 = Opt out, 1 = Opt in. @@ -364,6 +372,10 @@ impl AppState { footer_hover: None, settings_modal: None, shortcuts_open: false, + shortcuts_selected: 0, + shortcuts_hovered: None, + working_checklist: None, + last_turn_stopped: false, opt_in_banner: false, opt_in_hover: None, show_thinking_blocks: true, @@ -526,6 +538,7 @@ impl AppState { pub fn add_message(&mut self, message: Message) { if message.role == cortex_core::widgets::MessageRole::User { self.show_launch_splash = false; + self.last_turn_stopped = false; } let mut message = message; if self.timestamps_enabled && message.timestamp.is_none() { @@ -643,7 +656,7 @@ impl AppState { let mut modal = crate::widgets::SettingsModalState::default(); modal.values = self.settings_values(); self.settings_modal = Some(modal); - self.shortcuts_open = false; + self.close_shortcuts_sheet(); } /// Copy modal values back onto the session. diff --git a/src/cortex-tui/src/commands/executor/dispatch.rs b/src/cortex-tui/src/commands/executor/dispatch.rs index b43b2341..1b5a5ae3 100644 --- a/src/cortex-tui/src/commands/executor/dispatch.rs +++ b/src/cortex-tui/src/commands/executor/dispatch.rs @@ -13,6 +13,7 @@ impl CommandExecutor { "version" | "v" => self.cmd_version(), "upgrade" | "update" => CommandResult::OpenModal(ModalType::Upgrade), "settings" | "prefs" => CommandResult::OpenModal(ModalType::Settings), + "shortcuts" | "keys" => CommandResult::Toggle("shortcuts".to_string()), "reload-config" | "reload" => CommandResult::Async("config:reload".to_string()), "theme" => self.cmd_theme(cmd), "compact" => CommandResult::Toggle("compact".to_string()), diff --git a/src/cortex-tui/src/commands/executor/tests.rs b/src/cortex-tui/src/commands/executor/tests.rs index 4141781d..c893ba56 100644 --- a/src/cortex-tui/src/commands/executor/tests.rs +++ b/src/cortex-tui/src/commands/executor/tests.rs @@ -310,6 +310,19 @@ fn test_goal_commands() { )); } +#[test] +fn test_shortcuts_command() { + let executor = CommandExecutor::new(); + assert!(matches!( + executor.execute_str("/shortcuts"), + CommandResult::Toggle(ref s) if s == "shortcuts" + )); + assert!(matches!( + executor.execute_str("/keys"), + CommandResult::Toggle(ref s) if s == "shortcuts" + )); +} + #[test] fn test_add_command() { let executor = CommandExecutor::new(); diff --git a/src/cortex-tui/src/commands/registry/builtin.rs b/src/cortex-tui/src/commands/registry/builtin.rs index 43bbeb06..954a3312 100644 --- a/src/cortex-tui/src/commands/registry/builtin.rs +++ b/src/cortex-tui/src/commands/registry/builtin.rs @@ -57,6 +57,15 @@ pub fn register_builtin_commands(registry: &mut CommandRegistry) { false, )); + registry.register(CommandDef::new( + "shortcuts", + &["keys"], + "Open the shortcuts sheet", + "/shortcuts", + CommandCategory::General, + false, + )); + registry.register(CommandDef::new( "mode", &[], diff --git a/src/cortex-tui/src/lib.rs b/src/cortex-tui/src/lib.rs index 3e94a5c6..f30fee56 100644 --- a/src/cortex-tui/src/lib.rs +++ b/src/cortex-tui/src/lib.rs @@ -111,6 +111,7 @@ mod lock_v2_goal; mod lock_v2_ids; mod lock_v2_network; mod lock_v2_parity; +mod lock_v2_residual; mod lock_v2_scenes; mod lock_v2_share; pub mod readme_hero; diff --git a/src/cortex-tui/src/lock_v2_boards.rs b/src/cortex-tui/src/lock_v2_boards.rs index 61ae180c..cce4260c 100644 --- a/src/cortex-tui/src/lock_v2_boards.rs +++ b/src/cortex-tui/src/lock_v2_boards.rs @@ -6,9 +6,7 @@ use cortex_core::widgets::Message; use std::time::{Duration, Instant}; -use crate::app::{ - AppState, SubagentDisplayStatus, SubagentTaskDisplay, SubagentTodoItem, SubagentTodoStatus, -}; +use crate::app::{AppState, SubagentTodoItem, SubagentTodoStatus}; use crate::interactive::builders::{ JobRow, SkillListItem, build_clear_confirm, build_jobs_picker, build_mcp_selector, build_permissions_picker, build_plan_confirm, build_question_prompt, build_sandbox_deny_prompt, @@ -146,11 +144,15 @@ Tell me what you'd like to do.", } "composer-typing" => { resumed(&mut state); - state.input.set_text("hello"); + state + .input + .set_text("add retry with backoff to the api client"); } "composer-typing-blink" => { resumed(&mut state); - state.input.set_text("hello"); + state + .input + .set_text("add retry with backoff to the api client"); state.caret_visible = false; } "composer-hover" => { @@ -159,7 +161,9 @@ Tell me what you'd like to do.", } "composer-multiline" => { resumed(&mut state); - state.input.set_text("first line\nsecond line\nthird line"); + state.input.set_text( + "add retry with backoff to the api client:\n- max 3 attempts, jitter\n- surface the final error as product copy", + ); } "footer-shortcuts" => { resumed(&mut state); @@ -479,7 +483,30 @@ Tell me what you'd like to do.", } "interrupt-stopped" => { resumed(&mut state); - state.add_message(Message::user("rewrite the whole crate").with_timestamp("09:33 AM")); + state.last_turn_stopped = true; + state.add_message( + Message::user("run the tui tests and fix whatever fails") + .with_timestamp("09:14 AM"), + ); + state.add_message( + Message::assistant("") + .with_timestamp("09:14 AM") + .with_thought_secs(2.1) + .with_worked_secs(12.0), + ); + let mut sh = tool( + "sh", + "shell", + serde_json::json!({"command": "cargo test -p cortex-tui"}), + ToolStatus::Failed, + "", + "stopped", + 1, + ); + if let Some(result) = sh.result.as_mut() { + result.success = false; + } + state.tool_calls = vec![sh]; state.add_message(Message::system("× Stopped")); } "error-unavailable" => { @@ -581,15 +608,24 @@ Tell me what you'd like to do.", "diff-hunk" => { resumed(&mut state); state.add_message( - Message::user("raise the rate limit to 60").with_timestamp("10:40 AM"), + Message::user("move the model chip into the composer border") + .with_timestamp("04:11 PM"), + ); + state.add_message( + Message::assistant("Moving the chip into the composer hairline.") + .with_timestamp("04:11 PM") + .with_thought_secs(2.6), ); state.tool_calls = vec![tool( "ed", "edit", - serde_json::json!({"path": "src/config/rateLimits.ts"}), + serde_json::json!({ + "path": "src/cortex-tui/src/composer.rs", + "file_path": "src/cortex-tui/src/composer.rs" + }), ToolStatus::Completed, DIFF_HUNK, - "Edit src/config/rateLimits.ts · +4 -2", + "Edit src/cortex-tui/src/composer.rs · +2 -1", 1, )]; } @@ -611,18 +647,23 @@ Tell me what you'd like to do.", } "md-table" => { resumed(&mut state); + state.add_message(Message::user("compare the models").with_timestamp("05:00 PM")); state.add_message( - Message::user("Compare the three models for this project") - .with_timestamp("03:11 PM"), + Message::assistant(MD_TABLE) + .with_timestamp("05:00 PM") + .with_thought_secs(0.8), ); - state.add_message(Message::assistant(MD_TABLE).with_timestamp("03:11 PM")); } "code-fence" => { resumed(&mut state); state.add_message( - Message::user("Show me the middleware you wrote").with_timestamp("03:12 PM"), + Message::user("show me a minimal retry helper").with_timestamp("05:12 PM"), + ); + state.add_message( + Message::assistant(MD_FENCE) + .with_timestamp("05:12 PM") + .with_thought_secs(1.0), ); - state.add_message(Message::assistant(MD_FENCE).with_timestamp("03:12 PM")); } "shortcuts-overlay" => { resumed(&mut state); @@ -739,36 +780,65 @@ Tell me what you'd like to do.", "todos" => { resumed(&mut state); state.add_message( - Message::user("work through the capture checklist").with_timestamp("09:41 AM"), + Message::user("move the model chip into the composer border") + .with_timestamp("04:11 PM"), ); - let mut task = SubagentTaskDisplay::new("sub-1", "tool-1", "lock v2 captures", "code"); - task.status = SubagentDisplayStatus::ExecutingTool("edit".into()); - task.todos = vec![ - SubagentTodoItem::new("Expand lock_v2 scene ids", SubagentTodoStatus::Completed), - SubagentTodoItem::new( - "Make every frame a unique state", - SubagentTodoStatus::Completed, - ), - SubagentTodoItem::new("Recapture 120×40 and 40×12", SubagentTodoStatus::InProgress), - SubagentTodoItem::new("Verify sha256 uniqueness", SubagentTodoStatus::Pending), - SubagentTodoItem::new("Keep the PR drafted", SubagentTodoStatus::Pending), - ]; - state.active_subagents = vec![task]; + state.add_message( + Message::assistant("") + .with_timestamp("04:11 PM") + .with_thought_secs(2.6), + ); + state.start_streaming(None, true); + state.streaming.thinking = false; + state.streaming.prompt_started_at = Some(Instant::now() - Duration::from_secs(38)); + state.tokens_used = 6_100; + state.working_checklist = Some(crate::app::WorkingChecklist::new( + vec![ + SubagentTodoItem::new( + "Read composer.rs and footer.rs", + SubagentTodoStatus::Completed, + ), + SubagentTodoItem::new("Locate the chip painter", SubagentTodoStatus::Completed), + SubagentTodoItem::new( + "Move the chip into the bottom hairline", + SubagentTodoStatus::InProgress, + ), + SubagentTodoItem::new( + "Drop the model from the footer", + SubagentTodoStatus::Pending, + ), + SubagentTodoItem::new( + "Run the TUI snapshot tests", + SubagentTodoStatus::Pending, + ), + ], + 38, + 6_100, + )); } "question" => { resumed(&mut state); state.add_message( - Message::assistant("Which capture size should we lock first?") - .with_timestamp("09:44 AM"), + Message::user("add retry with backoff to the api client") + .with_timestamp("11:20 AM"), + ); + state.add_message( + Message::assistant("Which failures should be retried?") + .with_timestamp("11:20 AM") + .with_thought_secs(1.9), ); state.enter_interactive_mode(build_question_prompt( - "Question", + "Which failures should be retried?", &[ - ("wide", "1 120×40 first", "wide boards"), - ("narrow", "2 40×12 first", "narrow boards"), - ("both", "3 Both together", "full SPEC §7 set"), + ( + "5xx", + "1 Timeouts and 5xx only (recommended)", + "recommended", + ), + ("all", "2 Every network error", "every error"), + ("site", "3 Let me decide per call site", "per call site"), ], - 2, + 0, )); } "sudo" => { diff --git a/src/cortex-tui/src/lock_v2_residual.rs b/src/cortex-tui/src/lock_v2_residual.rs new file mode 100644 index 00000000..457f1c28 --- /dev/null +++ b/src/cortex-tui/src/lock_v2_residual.rs @@ -0,0 +1,159 @@ +//! Residual lock v2 proofs for `/shortcuts`, composer, density, and live states. +//! +//! Permission-prompt radios are untouched. + +#[cfg(test)] +mod tests { + use crate::lock_v2::render_lock_v2_scene; + use cortex_core::style::{ACCENT, BORDER_FOCUS, HAIRLINE}; + + #[test] + fn shortcuts_sheet_opens_at_both_sizes() { + for (w, h) in [(120u16, 40u16), (40u16, 12u16)] { + let frame = render_lock_v2_scene("shortcuts-overlay", w, h).expect("sheet"); + assert!( + frame.plain.contains("Shortcuts"), + "{w}x{h}:\n{}", + frame.plain + ); + assert!( + frame.plain.contains("Ctrl+x") || frame.plain.contains("Esc"), + "{w}x{h}:\n{}", + frame.plain + ); + let mut accent = false; + for y in 0..h { + for x in 0..w { + if frame.buffer[(x, y)].fg == ACCENT { + accent = true; + } + } + } + assert!(accent, "selected binding uses #1F4945 at {w}x{h}"); + } + } + + #[test] + fn composer_hover_lifts_hairline() { + let idle = render_lock_v2_scene("composer-empty", 120, 40).expect("empty"); + let hover = render_lock_v2_scene("composer-hover", 120, 40).expect("hover"); + let mut hover_focus = false; + let mut idle_hair = false; + for y in 0..40u16 { + for x in 0..120u16 { + if hover.buffer[(x, y)].fg == BORDER_FOCUS + && hover.buffer[(x, y)].symbol().contains('─') + { + hover_focus = true; + } + if idle.buffer[(x, y)].fg == HAIRLINE && idle.buffer[(x, y)].symbol().contains('─') + { + idle_hair = true; + } + } + } + assert!(idle_hair, "idle composer keeps hairline gray"); + assert!(hover_focus, "hover lifts hairline to #525252"); + assert_ne!(idle.ansi, hover.ansi); + } + + #[test] + fn composer_placeholder_typing_multiline() { + let empty = render_lock_v2_scene("composer-empty", 120, 40).expect("empty"); + assert!( + empty.plain.contains("Plan, search, build anything"), + "{}", + empty.plain + ); + let typing = render_lock_v2_scene("composer-typing", 120, 40).expect("typing"); + assert!( + typing + .plain + .contains("add retry with backoff to the api client"), + "{}", + typing.plain + ); + assert!(typing.plain.contains("Alt+Enter"), "{}", typing.plain); + let multi = render_lock_v2_scene("composer-multiline", 120, 40).expect("multi"); + assert!(multi.plain.contains("max 3 attempts"), "{}", multi.plain); + assert!(multi.plain.contains("Alt+Enter"), "{}", multi.plain); + let blink = render_lock_v2_scene("composer-typing-blink", 120, 40).expect("blink"); + assert_ne!(typing.ansi, blink.ansi); + } + + #[test] + fn code_diff_markdown_density() { + let fence = render_lock_v2_scene("code-fence", 120, 40).expect("fence"); + assert!(fence.plain.contains("rust"), "{}", fence.plain); + assert!(fence.plain.contains("with_retry"), "{}", fence.plain); + assert!( + fence.plain.contains('─'), + "language tag hairline:\n{}", + fence.plain + ); + let table = render_lock_v2_scene("md-table", 120, 40).expect("table"); + assert!(table.plain.contains("Cortex Mini 1"), "{}", table.plain); + assert!(table.plain.contains("Cortex Max 1"), "{}", table.plain); + let diff = render_lock_v2_scene("diff-hunk", 120, 40).expect("diff"); + assert!(diff.plain.contains("Edit"), "{}", diff.plain); + assert!( + diff.plain.contains('+') && diff.plain.contains('-'), + "{}", + diff.plain + ); + let narrow = render_lock_v2_scene("diff-hunk", 40, 12).expect("diff-narrow"); + assert!( + narrow.plain.contains("Edit") || narrow.plain.contains('+'), + "{}", + narrow.plain + ); + } + + #[test] + fn streaming_states_are_distinct() { + let thinking = render_lock_v2_scene("session-thinking-live", 120, 40).expect("think"); + let interrupt = render_lock_v2_scene("interrupt-stopped", 120, 40).expect("stop"); + let todos = render_lock_v2_scene("todos", 120, 40).expect("todos"); + let question = render_lock_v2_scene("question", 120, 40).expect("q"); + assert!(thinking.plain.contains("Thinking"), "{}", thinking.plain); + assert!(interrupt.plain.contains("Stopped"), "{}", interrupt.plain); + assert!( + interrupt.plain.contains("Reply, or") || interrupt.plain.contains("Stopped"), + "{}", + interrupt.plain + ); + assert!(todos.plain.contains("Working 2/5"), "{}", todos.plain); + assert!(todos.plain.contains('✓'), "{}", todos.plain); + assert!(todos.plain.contains('›'), "{}", todos.plain); + assert!(todos.plain.contains('○'), "{}", todos.plain); + assert!( + question.plain.contains("Which failures should be retried?"), + "{}", + question.plain + ); + assert!( + question.plain.contains("Timeouts and 5xx"), + "{}", + question.plain + ); + let frames = [ + thinking.ansi.as_str(), + interrupt.ansi.as_str(), + todos.ansi.as_str(), + question.ansi.as_str(), + ]; + for i in 0..frames.len() { + for j in (i + 1)..frames.len() { + assert_ne!( + frames[i], frames[j], + "states {i} and {j} must stay distinct" + ); + } + } + let think_n = render_lock_v2_scene("session-thinking-live", 40, 12).expect("think-n"); + let stop_n = render_lock_v2_scene("interrupt-stopped", 40, 12).expect("stop-n"); + assert_ne!(think_n.ansi, stop_n.ansi); + assert!(think_n.plain.contains("Thinking"), "{}", think_n.plain); + assert!(stop_n.plain.contains("Stopped"), "{}", stop_n.plain); + } +} diff --git a/src/cortex-tui/src/lock_v2_scenes.rs b/src/cortex-tui/src/lock_v2_scenes.rs index c5b723bc..26fe4b96 100644 --- a/src/cortex-tui/src/lock_v2_scenes.rs +++ b/src/cortex-tui/src/lock_v2_scenes.rs @@ -203,36 +203,34 @@ pub(crate) fn tool( call } -pub(crate) const DIFF_HUNK: &str = r#"@@ -20,6 +20,10 @@ - import Redis from "ioredis"; - import type { FastifyRequest } from "fastify"; --const limit = 30; -+const limit = 60; -+const windowSec = 60; - - export function rateLimit(opts: RateLimitOpts) { -- const redis = new Redis(); -+ const redis = new Redis(process.env.REDIS_URL); +pub(crate) const DIFF_HUNK: &str = r#"@@ -41,7 +41,8 @@ + let chip = model_chip(state); +- footer.push(chip); ++ border.push_right(chip); ++ footer.push(hints); + Ok(()) "#; pub(crate) const MD_TABLE: &str = r#"Here is how the three models compare: -| Model | Effort | Billing | -|---|---|---| -| Mini 1 | Medium | per request | -| Cortex 1 | High | per request | -| Max 1 | MAX | per token | - -Mini 1 is the default; switch with /model when a change needs deeper reasoning."#; - -pub(crate) const MD_FENCE: &str = r#"The limiter is a sliding window over a Redis sorted set: +| Model | Default effort | Context | Billing | +|---|---|---|---| +| Cortex Mini 1 | Medium | 500K | per request | +| Cortex 1 | High | 500K | per request | +| Cortex Max 1 | High | 1M | per token | +"#; -```ts -export async function rateLimit(key: string, limit = 60) { - const now = Date.now(); - await redis.zadd(key, now, String(now)); - return count <= limit; +pub(crate) const MD_FENCE: &str = r#"```rust +pub async fn with_retry(mut op: F) -> Result +where F: FnMut() -> Fut>, +{ + for attempt in 0..3 { + match op().await { + Ok(v) => return Ok(v), + Err(e) if attempt == 2 => return Err(e), + Err(_) => sleep(backoff(attempt)).await, + } + } + unreachable!() } -``` - -It fails open when Redis is unreachable."#; +```"#; diff --git a/src/cortex-tui/src/runner/event_loop/commands.rs b/src/cortex-tui/src/runner/event_loop/commands.rs index 936aa95f..8f8dd160 100644 --- a/src/cortex-tui/src/runner/event_loop/commands.rs +++ b/src/cortex-tui/src/runner/event_loop/commands.rs @@ -137,6 +137,9 @@ impl EventLoop { .toasts .info(format!("Sandbox mode: {}", state)); } + "shortcuts" => { + self.app_state.toggle_shortcuts_sheet(); + } "auto" => { let is_yolo = matches!( self.app_state.permission_mode, @@ -799,7 +802,7 @@ impl EventLoop { match command { GoalCommand::Status => { if let Some(goal) = &self.app_state.goal { - self.add_system_message(&goal.status_text()); + self.add_system_message(&goal.status_card()); } else { self.add_system_message("No goal. Set one with /goal ."); } @@ -813,13 +816,13 @@ impl EventLoop { } GoalCommand::Resume => { if let Some(goal) = &self.app_state.goal { - self.add_system_message( - &goal.action_text(&format!("Goal is {}.", goal.state)), - ); + self.add_system_message(&goal.action_text("Goal resumed.")); } } GoalCommand::Clear => { - self.add_system_message("Goal cleared."); + self.add_system_message( + "Goal cleared. Set a new one with /goal .", + ); } GoalCommand::Set { objective } => { if let Some(goal) = &self.app_state.goal { diff --git a/src/cortex-tui/src/runner/event_loop/core.rs b/src/cortex-tui/src/runner/event_loop/core.rs index 8c5136ac..f1ee43b7 100644 --- a/src/cortex-tui/src/runner/event_loop/core.rs +++ b/src/cortex-tui/src/runner/event_loop/core.rs @@ -633,6 +633,7 @@ impl EventLoop { if already { return; } + self.app_state.last_turn_stopped = true; let secs = self.app_state.streaming.prompt_elapsed_seconds(); self.add_system_message(&format!( "{} {}", diff --git a/src/cortex-tui/src/runner/event_loop/input.rs b/src/cortex-tui/src/runner/event_loop/input.rs index 8ec97933..aa57a24c 100644 --- a/src/cortex-tui/src/runner/event_loop/input.rs +++ b/src/cortex-tui/src/runner/event_loop/input.rs @@ -189,7 +189,11 @@ impl EventLoop { || (key_event.code == KeyCode::Char('x') && key_event.modifiers.contains(KeyModifiers::CONTROL)); if close { - self.app_state.shortcuts_open = false; + self.app_state.close_shortcuts_sheet(); + } else if matches!(key_event.code, KeyCode::Down | KeyCode::Char('j')) { + self.app_state.shortcuts_move(1); + } else if matches!(key_event.code, KeyCode::Up | KeyCode::Char('k')) { + self.app_state.shortcuts_move(-1); } self.render(terminal)?; return Ok(()); @@ -205,7 +209,7 @@ impl EventLoop { if key_event.code == KeyCode::Char('x') && key_event.modifiers.contains(KeyModifiers::CONTROL) { - self.app_state.shortcuts_open = true; + self.app_state.toggle_shortcuts_sheet(); self.render(terminal)?; return Ok(()); } diff --git a/src/cortex-tui/src/runner/event_loop/mouse.rs b/src/cortex-tui/src/runner/event_loop/mouse.rs index 3c9d2ede..0a5f3727 100644 --- a/src/cortex-tui/src/runner/event_loop/mouse.rs +++ b/src/cortex-tui/src/runner/event_loop/mouse.rs @@ -19,6 +19,16 @@ impl EventLoop { ) -> Result<()> { match action { MouseAction::Click { x, y, button } => { + if self.app_state.shortcuts_open { + if self.app_state.shortcuts_close_hit(x, y) { + self.app_state.close_shortcuts_sheet(); + } else { + let _ = self.app_state.shortcuts_select_at(x, y); + } + self.render(terminal)?; + return Ok(()); + } + // Handle interactive mode clicks if self.app_state.is_interactive_mode() && let Some((action, item_id, item_ids)) = self.handle_interactive_click(x, y) @@ -98,6 +108,12 @@ impl EventLoop { } MouseAction::Move { x, y } => { + if self.app_state.shortcuts_open { + self.app_state.shortcuts_hover_at(x, y); + self.render(terminal)?; + return Ok(()); + } + // Handle hover effects for interactive mode if self.app_state.is_interactive_mode() && let Some(state) = self.app_state.get_interactive_state_mut() diff --git a/src/cortex-tui/src/runner/event_loop/tools.rs b/src/cortex-tui/src/runner/event_loop/tools.rs index 4243c825..f187a898 100644 --- a/src/cortex-tui/src/runner/event_loop/tools.rs +++ b/src/cortex-tui/src/runner/event_loop/tools.rs @@ -510,31 +510,45 @@ impl EventLoop { todos.len() ); - self.app_state.update_subagent(&session_id, |task| { - task.todos = todos - .iter() - .map(|(content, status)| { - let status = match status.as_str() { - "in_progress" => SubagentTodoStatus::InProgress, - "completed" => SubagentTodoStatus::Completed, - _ => SubagentTodoStatus::Pending, - }; - SubagentTodoItem { - content: content.clone(), - status, - } - }) - .collect(); + let items: Vec = todos + .iter() + .map(|(content, status)| { + let status = match status.as_str() { + "in_progress" => SubagentTodoStatus::InProgress, + "completed" => SubagentTodoStatus::Completed, + _ => SubagentTodoStatus::Pending, + }; + SubagentTodoItem { + content: content.clone(), + status, + } + }) + .collect(); - // Update activity based on in-progress item - if let Some(in_progress) = task - .todos - .iter() - .find(|t| matches!(t.status, SubagentTodoStatus::InProgress)) - { - task.current_activity = in_progress.content.clone(); - } - }); + let matched = self + .app_state + .active_subagents + .iter() + .any(|t| t.session_id == session_id); + if matched { + self.app_state.update_subagent(&session_id, |task| { + task.todos = items.clone(); + if let Some(in_progress) = task + .todos + .iter() + .find(|t| matches!(t.status, SubagentTodoStatus::InProgress)) + { + task.current_activity = in_progress.content.clone(); + } + }); + } else { + let elapsed = self.app_state.streaming.prompt_elapsed_seconds().max(1) as u32; + self.app_state.working_checklist = Some(crate::app::WorkingChecklist::new( + items, + elapsed, + self.app_state.tokens_used, + )); + } } /// Checks for crashed background tool tasks (panics or cancelled). diff --git a/src/cortex-tui/src/ui/chrome.rs b/src/cortex-tui/src/ui/chrome.rs index 7e1338fb..62dbbeff 100644 --- a/src/cortex-tui/src/ui/chrome.rs +++ b/src/cortex-tui/src/ui/chrome.rs @@ -807,6 +807,19 @@ mod tests { assert_eq!(buf[(1, 0)].style().fg, Some(HAIRLINE)); } + #[test] + fn composer_hover_uses_focus_hairline() { + let area = Rect::new(0, 0, 40, 3); + let mut idle = Buffer::empty(area); + fill_inky(area, &mut idle); + paint_composer_box(area, &mut idle, "Agent", "Cortex Mini 1", false, true, None); + let mut hover = Buffer::empty(area); + fill_inky(area, &mut hover); + paint_composer_box(area, &mut hover, "Agent", "Cortex Mini 1", true, true, None); + assert_eq!(idle[(1, 0)].style().fg, Some(HAIRLINE)); + assert_eq!(hover[(1, 0)].style().fg, Some(BORDER_FOCUS)); + } + #[test] fn composer_box_paints_goal_chip_in_accent() { let area = Rect::new(0, 0, 48, 3); diff --git a/src/cortex-tui/src/views/minimal_session/checklist.rs b/src/cortex-tui/src/views/minimal_session/checklist.rs new file mode 100644 index 00000000..3777baea --- /dev/null +++ b/src/cortex-tui/src/views/minimal_session/checklist.rs @@ -0,0 +1,83 @@ +//! Working checklist rows for the live session (lock `todos`). + +use ratatui::style::Style; +use ratatui::text::{Line, Span}; + +use crate::app::{AppState, SubagentTodoStatus}; +use crate::ui::colors::AdaptiveColors; +use crate::ui::text_utils::wrap_or_drop; + +/// Paint `⠇ Working n/m` plus ✓ / › / ○ rows. Empty when no session checklist. +pub fn render_working_checklist( + app_state: &AppState, + width: u16, + colors: &AdaptiveColors, +) -> Vec> { + let Some(board) = app_state.working_checklist.as_ref() else { + return Vec::new(); + }; + if board.items.is_empty() { + return Vec::new(); + } + let indent = if app_state.compact_mode { 0 } else { 3 }; + let inner = (width as usize).saturating_sub(indent + 2).max(8); + let mut lines = Vec::new(); + let header = format!("{}{}", " ".repeat(indent), board.header()); + lines.push(Line::from(Span::styled( + header, + Style::default().fg(colors.text_dim), + ))); + for todo in &board.items { + let (mark, color) = match todo.status { + SubagentTodoStatus::Completed => ("✓", colors.success), + SubagentTodoStatus::InProgress => ("›", colors.text), + SubagentTodoStatus::Pending => ("○", colors.text_muted), + }; + let prefix = format!("{} {} ", " ".repeat(indent), mark); + let room = inner.saturating_sub(mark.len() + 2); + let body = wrap_or_drop(&todo.content, room) + .into_iter() + .next() + .unwrap_or_default(); + lines.push(Line::from(vec![ + Span::styled(prefix, Style::default().fg(color)), + Span::styled(body, Style::default().fg(colors.text_dim)), + ])); + } + lines.push(Line::from("")); + lines +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::app::{SubagentTodoItem, WorkingChecklist}; + + #[test] + fn paints_marks_and_counts() { + let mut state = AppState::default(); + state.working_checklist = Some(WorkingChecklist::new( + vec![ + SubagentTodoItem::new( + "Read composer.rs and footer.rs", + SubagentTodoStatus::Completed, + ), + SubagentTodoItem::new( + "Move the chip into the bottom hairline", + SubagentTodoStatus::InProgress, + ), + SubagentTodoItem::new("Run the TUI snapshot tests", SubagentTodoStatus::Pending), + ], + 38, + 6_100, + )); + let colors = AdaptiveColors::default_dark(); + let lines = render_working_checklist(&state, 80, &colors); + let text: String = lines.iter().map(|l| l.to_string()).collect(); + assert!(text.contains("Working 1/3"), "{text}"); + assert!(text.contains("✓"), "{text}"); + assert!(text.contains("›"), "{text}"); + assert!(text.contains("○"), "{text}"); + assert!(text.contains("Read composer.rs"), "{text}"); + } +} diff --git a/src/cortex-tui/src/views/minimal_session/mod.rs b/src/cortex-tui/src/views/minimal_session/mod.rs index 848d0e13..9009411a 100644 --- a/src/cortex-tui/src/views/minimal_session/mod.rs +++ b/src/cortex-tui/src/views/minimal_session/mod.rs @@ -7,6 +7,7 @@ //! - Simple input line with prompt //! - Contextual key hints at the bottom +mod checklist; mod layout; mod rendering; mod text_utils; diff --git a/src/cortex-tui/src/views/minimal_session/rendering.rs b/src/cortex-tui/src/views/minimal_session/rendering.rs index 5c007839..a5b8c2f0 100644 --- a/src/cortex-tui/src/views/minimal_session/rendering.rs +++ b/src/cortex-tui/src/views/minimal_session/rendering.rs @@ -20,6 +20,7 @@ use crate::ui::text_utils::wrap_or_drop; use crate::views::tool_call::{ContentSegment, ToolCallDisplay, ToolStatus}; use super::VERSION; +use super::checklist::render_working_checklist; use super::text_utils::wrap_text; /// Renders the "← Back to main conversation" hint when viewing a subagent. @@ -747,6 +748,9 @@ pub fn generate_message_lines( )); } + // Session working checklist (lock `todos`) — distinct from subagent tiles. + all_lines.extend(render_working_checklist(app_state, width, colors)); + // Render active subagents for task in &app_state.active_subagents { all_lines.extend(render_subagent(task, width, colors)); diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index 03bcf703..ae7bd3d4 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -32,8 +32,9 @@ pub const PLACEHOLDER_IDLE: &str = "Plan, search, build anything"; /// Composer placeholder while a run is live — stdin stays alive and a /// submitted follow-up is queued. pub const PLACEHOLDER_RUNNING: &str = "Add a follow-up — Enter to queue"; -/// Composer placeholder while a SPEC §3.10 prompt owns focus. pub const PLACEHOLDER_PROMPT: &str = crate::interactive::builders::PERMISSION_PROMPT_PLACEHOLDER; +/// Composer placeholder after Esc / Ctrl+c interrupt. +pub const PLACEHOLDER_STOPPED: &str = "Reply, or ↑ to edit your last message"; /// Paint the composer input row (after `> `) to the lock: /// empty = block cursor at input col 0, dim placeholder after that cell; @@ -329,6 +330,8 @@ impl<'a> MinimalSessionView<'a> { } else { crate::ui::consts::PLACEHOLDER_DISCONNECTED } + } else if self.app_state.last_turn_stopped { + PLACEHOLDER_STOPPED } else if self.is_task_running() { PLACEHOLDER_RUNNING } else if self.app_state.agent_entrypoint { @@ -739,6 +742,10 @@ impl<'a> Widget for MinimalSessionView<'a> { } if self.app_state.shortcuts_open { crate::widgets::ShortcutsOverlay::new(self.app_state.cli_version.clone()) + .with_selection( + self.app_state.shortcuts_selected, + self.app_state.shortcuts_hovered, + ) .render(area, buf); } diff --git a/src/cortex-tui/src/views/tool_call.rs b/src/cortex-tui/src/views/tool_call.rs index 4bf1386c..4e54af3e 100644 --- a/src/cortex-tui/src/views/tool_call.rs +++ b/src/cortex-tui/src/views/tool_call.rs @@ -158,7 +158,10 @@ pub fn tool_tile_label(name: &str) -> String { pub fn format_tool_summary(name: &str, args: &Value) -> String { match name.to_lowercase().as_str() { "read" | "edit" | "write" | "delete" => { - if let Some(path) = args.get("file_path").or_else(|| args.get("filePath")) + if let Some(path) = args + .get("file_path") + .or_else(|| args.get("filePath")) + .or_else(|| args.get("path")) && let Some(path_str) = path.as_str() { return shorten_path(path_str); diff --git a/src/cortex-tui/src/widgets/shortcuts_overlay.rs b/src/cortex-tui/src/widgets/shortcuts_overlay.rs index 1e13b44f..47f4907b 100644 --- a/src/cortex-tui/src/widgets/shortcuts_overlay.rs +++ b/src/cortex-tui/src/widgets/shortcuts_overlay.rs @@ -1,6 +1,9 @@ -//! Ctrl+x shortcuts overlay — lock v2 §3.12. +//! `/shortcuts` interactive sheet — lock v2 Ctrl+x overlay. +//! +//! Open, navigate (↑↓), dismiss (Esc / Ctrl+x / `[x]`). Selected key uses +//! banner green `#1F4945`. Chrome hairlines stay inky gray. -use cortex_core::style::{HAIRLINE, TEXT, TEXT_DIM, TEXT_MUTED, VOID}; +use cortex_core::style::{ACCENT, HAIRLINE, TEXT, TEXT_DIM, TEXT_MUTED, VOID}; use ratatui::buffer::Buffer; use ratatui::layout::Rect; use ratatui::style::Style; @@ -30,15 +33,29 @@ const RIGHT: &[(&str, &str)] = &[ ("Ctrl+x", "this overlay"), ]; +const NARROW: &[(&str, &str)] = &[ + ("Shift+Tab", "cycle Agent / Plan / Ask"), + ("@", "mention files"), + ("!", "bash mode"), + ("&", "hand off to Cortex Cloud"), + ("Ctrl+c", "stop"), + ("F2", "settings"), + ("Esc", "interrupt / close"), +]; + /// Two-column shortcuts overlay. pub struct ShortcutsOverlay { pub version: String, + pub selected: usize, + pub hovered: Option, } impl Default for ShortcutsOverlay { fn default() -> Self { Self { version: VERSION.to_string(), + selected: 0, + hovered: None, } } } @@ -47,16 +64,82 @@ impl ShortcutsOverlay { pub fn new(version: impl Into) -> Self { Self { version: version.into(), + selected: 0, + hovered: None, } } - fn modal_rect(area: Rect) -> Rect { - let w = 84u16.min(area.width.saturating_sub(4)).max(40); - let h = 14u16.min(area.height.saturating_sub(2)).max(8); + pub fn with_selection(mut self, selected: usize, hovered: Option) -> Self { + self.selected = selected; + self.hovered = hovered; + self + } + + pub fn row_count(area: Rect) -> usize { + if compact(area) { + NARROW.len() + } else { + LEFT.len() + RIGHT.len() + } + } + + pub fn wrap_index(area: Rect, index: usize) -> usize { + let n = Self::row_count(area).max(1); + index % n + } + + pub fn modal_rect(area: Rect) -> Rect { + let w = 84u16 + .min(area.width.saturating_sub(4)) + .max(40.min(area.width)); + let h = 14u16 + .min(area.height.saturating_sub(2)) + .max(8.min(area.height)); let x = area.x + (area.width.saturating_sub(w)) / 2; let y = area.y + (area.height.saturating_sub(h)) / 2; Rect::new(x, y, w, h) } + + /// True when `(x, y)` is on the `[x]` close control. + pub fn close_hit(area: Rect, x: u16, y: u16) -> bool { + let modal = Self::modal_rect(area); + if modal.width < 6 || y != modal.y { + return false; + } + let close_x = modal.right().saturating_sub(6); + x >= close_x && x < close_x.saturating_add(3) + } + + /// Binding under `(x, y)`, if any. + pub fn row_at(area: Rect, x: u16, y: u16) -> Option { + let modal = Self::modal_rect(area); + let inner = Rect::new( + modal.x + 2, + modal.y + 2, + modal.width.saturating_sub(4), + modal.height.saturating_sub(4), + ); + if y < inner.y { + return None; + } + let idx = (y - inner.y) as usize; + if compact(area) { + return (idx < NARROW.len()).then_some(idx); + } + let col2 = inner.x + inner.width / 2; + if x >= col2 { + let i = LEFT.len() + idx; + (i < LEFT.len() + RIGHT.len()).then_some(i) + } else if idx < LEFT.len() { + Some(idx) + } else { + None + } + } +} + +fn compact(area: Rect) -> bool { + area.width < 80 || area.height < 16 } impl Widget for ShortcutsOverlay { @@ -100,54 +183,113 @@ impl Widget for ShortcutsOverlay { modal.width.saturating_sub(4), modal.height.saturating_sub(4), ); - let col2 = inner.x + inner.width / 2; - for (i, (key, label)) in LEFT.iter().enumerate() { - let y = inner.y + i as u16; - if y >= inner.bottom().saturating_sub(3) { - break; - } - buf.set_string(inner.x, y, format!("{key:<12}"), Style::default().fg(TEXT)); + if compact(area) { + paint_column( + buf, + inner.x, + inner.y, + inner.width, + inner.bottom().saturating_sub(2), + NARROW, + self.selected, + self.hovered, + 0, + ); + } else { + let col2 = inner.x + inner.width / 2; + let stop = inner.bottom().saturating_sub(3); + paint_column( + buf, + inner.x, + inner.y, + col2.saturating_sub(inner.x), + stop, + LEFT, + self.selected, + self.hovered, + 0, + ); + paint_column( + buf, + col2, + inner.y, + inner.right().saturating_sub(col2), + stop, + RIGHT, + self.selected, + self.hovered, + LEFT.len(), + ); + let hair_y = inner.bottom().saturating_sub(3); + buf.set_string(inner.x, hair_y, "─".repeat(inner.width as usize), rule); + let docs = format!( + "Docs & guides: cortex.foundation/docs · Cortex CLI v{}", + self.version + ); buf.set_string( - inner.x + 13, - y, - first_fitting_line(label, (col2.saturating_sub(inner.x + 14)) as usize), - Style::default().fg(TEXT_DIM), + inner.x, + hair_y + 1, + first_fitting_line(&docs, inner.width as usize), + Style::default().fg(TEXT_MUTED), ); + let close = "Ctrl+x/Esc close"; + let cx = inner.x + (inner.width.saturating_sub(close.len() as u16)) / 2; + buf.set_string(cx, hair_y + 2, close, Style::default().fg(TEXT_DIM)); + return; } - for (i, (key, label)) in RIGHT.iter().enumerate() { - let y = inner.y + i as u16; - if y >= inner.bottom().saturating_sub(3) { - break; - } - buf.set_string(col2, y, format!("{key:<12}"), Style::default().fg(TEXT)); + let close = "Ctrl+x/Esc close"; + let cy = modal.bottom().saturating_sub(2); + let cx = inner.x + (inner.width.saturating_sub(close.len() as u16)) / 2; + buf.set_string(cx, cy, close, Style::default().fg(TEXT_DIM)); + } +} + +fn paint_column( + buf: &mut Buffer, + x: u16, + y0: u16, + width: u16, + stop_y: u16, + rows: &[(&str, &str)], + selected: usize, + hovered: Option, + base: usize, +) { + for (i, (key, label)) in rows.iter().enumerate() { + let y = y0 + i as u16; + if y >= stop_y { + break; + } + let idx = base + i; + let active = idx == selected || hovered == Some(idx); + let key_style = if active { + Style::default().fg(ACCENT) + } else { + Style::default().fg(TEXT) + }; + let key_w = 12u16.min(width); + buf.set_string(x, y, format!("{key:<12}"), key_style); + if width > key_w + 1 { buf.set_string( - col2 + 13, + x + key_w, y, - first_fitting_line(label, inner.right().saturating_sub(col2 + 13) as usize), + first_fitting_line(label, width.saturating_sub(key_w) as usize), Style::default().fg(TEXT_DIM), ); } - let hair_y = inner.bottom().saturating_sub(3); - buf.set_string(inner.x, hair_y, "─".repeat(inner.width as usize), rule); - let docs = format!( - "Docs & guides: cortex.foundation/docs · Cortex CLI v{}", - self.version - ); - buf.set_string( - inner.x, - hair_y + 1, - first_fitting_line(&docs, inner.width as usize), - Style::default().fg(TEXT_MUTED), - ); - let close = "Ctrl+x/Esc close"; - let cx = inner.x + (inner.width.saturating_sub(close.len() as u16)) / 2; - buf.set_string(cx, hair_y + 2, close, Style::default().fg(TEXT_DIM)); } } #[cfg(test)] mod tests { use super::*; + use cortex_core::style::ACCENT; + + fn line(buf: &Buffer, y: u16, width: u16) -> String { + (0..width) + .map(|x| buf[(x, y)].symbol().chars().next().unwrap_or(' ')) + .collect() + } #[test] fn overlay_paints_title_and_docs() { @@ -157,17 +299,62 @@ mod tests { let mut found_title = false; let mut found_docs = false; for y in 0..20 { - let line: String = (0..120) - .map(|x| buf[(x, y)].symbol().chars().next().unwrap_or(' ')) - .collect(); - if line.contains("Shortcuts") { + let row = line(&buf, y, 120); + if row.contains("Shortcuts") { found_title = true; } - if line.contains("cortex.foundation/docs") { + if row.contains("cortex.foundation/docs") { found_docs = true; } } assert!(found_title); assert!(found_docs); } + + #[test] + fn selected_key_uses_banner_green() { + let area = Rect::new(0, 0, 120, 24); + let mut buf = Buffer::empty(area); + ShortcutsOverlay::new("0.1.7") + .with_selection(0, None) + .render(area, &mut buf); + let mut accent = false; + for y in 0..24 { + for x in 0..120 { + if buf[(x, y)].fg == ACCENT && buf[(x, y)].symbol().contains('S') { + accent = true; + } + } + } + assert!(accent, "selected Shift+Tab must use #1F4945"); + } + + #[test] + fn close_hit_and_row_at() { + let area = Rect::new(0, 0, 120, 40); + let modal = ShortcutsOverlay::modal_rect(area); + let close_x = modal.right().saturating_sub(6); + assert!(ShortcutsOverlay::close_hit(area, close_x, modal.y)); + assert!(!ShortcutsOverlay::close_hit(area, modal.x, modal.y)); + assert_eq!( + ShortcutsOverlay::row_at(area, modal.x + 3, modal.y + 2), + Some(0) + ); + assert_eq!(ShortcutsOverlay::row_count(area), LEFT.len() + RIGHT.len()); + } + + #[test] + fn narrow_sheet_fits_40x12() { + let area = Rect::new(0, 0, 40, 12); + let mut buf = Buffer::empty(area); + ShortcutsOverlay::new("0.1.7").render(area, &mut buf); + let mut found = false; + for y in 0..12 { + if line(&buf, y, 40).contains("Shortcuts") { + found = true; + } + } + assert!(found); + assert_eq!(ShortcutsOverlay::row_count(area), NARROW.len()); + } } From b58606d820ce10d49768d014fb05ee054c7ce303 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:07:44 +0000 Subject: [PATCH 02/15] chore(tui): recapture lock v2 runtime pngs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Regenerate 36×40×12 and 82×120×40 unique hashes via scripts/render-tui-lock-v2.sh for COR-7/9/10/14/15 chrome. Co-authored-by: Mathis --- .../runtime/120x40/clear-confirm.png | Bin 15929 -> 15771 bytes .../tui-lock-v2/runtime/120x40/code-fence.png | Bin 11354 -> 12977 bytes .../runtime/120x40/composer-multiline.png | Bin 6043 -> 6887 bytes .../runtime/120x40/composer-typing-blink.png | Bin 5698 -> 6142 bytes .../runtime/120x40/composer-typing.png | Bin 5719 -> 6170 bytes .../tui-lock-v2/runtime/120x40/diff-hunk.png | Bin 13121 -> 11408 bytes .../runtime/120x40/first-run-tips.png | Bin 10941 -> 10928 bytes .../runtime/120x40/goal-chip-active.png | Bin 6947 -> 6881 bytes .../runtime/120x40/goal-chip-blocked.png | Bin 6970 -> 6892 bytes .../runtime/120x40/goal-chip-budget.png | Bin 6969 -> 6879 bytes .../runtime/120x40/goal-chip-done.png | Bin 6908 -> 6830 bytes .../runtime/120x40/goal-chip-paused.png | Bin 6939 -> 6880 bytes .../runtime/120x40/interrupt-stopped.png | Bin 6623 -> 8322 bytes .../tui-lock-v2/runtime/120x40/md-table.png | Bin 10473 -> 10360 bytes .../120x40/permission-prompt-hover.png | Bin 11338 -> 11322 bytes .../runtime/120x40/permission-prompt.png | Bin 11267 -> 11219 bytes .../runtime/120x40/plan-confirm.png | Bin 8603 -> 8157 bytes .../tui-lock-v2/runtime/120x40/question.png | Bin 8391 -> 9659 bytes .../runtime/120x40/sandbox-deny.png | Bin 9284 -> 9127 bytes .../runtime/120x40/shortcuts-overlay.png | Bin 13604 -> 13656 bytes .../runtime/120x40/slash-palette.png | Bin 23019 -> 22349 bytes .../tui-lock-v2/runtime/120x40/todos.png | Bin 9753 -> 10236 bytes .../runtime/120x40/tokens-topright.png | Bin 10021 -> 10017 bytes .../runtime/120x40/tool-tiles-collapsed.png | Bin 8561 -> 8390 bytes .../tui-lock-v2/runtime/120x40/tool-tiles.png | Bin 11088 -> 10921 bytes .../runtime/120x40/welcome-agent.png | Bin 7369 -> 7356 bytes .../runtime/120x40/welcome-cortex.png | Bin 7085 -> 7072 bytes .../runtime/40x12/composer-typing.png | Bin 2332 -> 2668 bytes .../tui-lock-v2/runtime/40x12/diff-hunk.png | Bin 5198 -> 5077 bytes .../runtime/40x12/goal-chip-active.png | Bin 3800 -> 3719 bytes .../runtime/40x12/goal-chip-blocked.png | Bin 3819 -> 3732 bytes .../runtime/40x12/goal-chip-budget.png | Bin 3824 -> 3719 bytes .../runtime/40x12/goal-chip-done.png | Bin 3763 -> 3672 bytes .../runtime/40x12/goal-chip-paused.png | Bin 3785 -> 3719 bytes .../runtime/40x12/interrupt-stopped.png | Bin 3375 -> 4110 bytes .../runtime/40x12/permission-prompt.png | Bin 5314 -> 5221 bytes .../runtime/40x12/shortcuts-overlay.png | Bin 3912 -> 4140 bytes .../runtime/40x12/slash-palette.png | Bin 4442 -> 4315 bytes .../runtime/40x12/welcome-agent.png | Bin 3600 -> 3586 bytes .../runtime/40x12/welcome-cortex.png | Bin 3524 -> 3510 bytes 40 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/media/tui-lock-v2/runtime/120x40/clear-confirm.png b/docs/media/tui-lock-v2/runtime/120x40/clear-confirm.png index d78bad90ef73bd3f84818bcb450c5a23a6f567fb..1ebfff093b51666c4109d57ecd87c818f7df606e 100644 GIT binary patch delta 12836 zcmaiadpy(c|Mw(`!lx5CS3)^!g~_2$Iph#Im-AT;Gc3nplqhqEp<&U%DRMT47$S$| zup(!TnJlM=aT+{UWZ;SM6GsYh*BV;W~r+Cn(j_4zI{*J1HK%f|#b!Oi#U3;dr zRrMrAN!*STco-0OaROm$%;Z1QK}B`SG7a43^_ZE2=FWQu~g|O>EafhUb42cZ?{Tz9fMKf!fP{lLrYk%5g@% zBu5D>5_rOZ7CGj!M^Ow)xn9_Bh>Q{TvQV-G@&kTmC%L3SptU8bi3QJ;&=y=|7)Dlj zyp+6$E&2hx=ZDpr76Ie6s;8hCbIJrb!@-&JCq?+8#oPjw;80v#A!l9habSUVEpLNK z(t0=1iNx0jleM}`J_-Vrl=uvdGb?ohbIebGK=v~l3?Xg7D?uAe@PT%i?Pyi_u;;c* zZEotj^2z_~8#E$09|Yk$>a*YYrnq604Y(eA>(A8TytGp$Xl1!FWMf`KO;^;`&rpvO z!18a-XdkfX6%1|5M0Q|j0@8=?e8YWs9+1^tHQ?tZb8gF^MCM{~zJJ41v1z_7Cvc>e zEF^R5;QRrTs=cRN^|@zP+WfStwRV(L(S^o~J17YMX++T;|tM~p(t z*N}>xE~~tX%h!s^DTw4k`}I7NOF{Y^%Q6|Awo(LvZnfKPst@?2flj*-;JnGgF?)!>CP+?a^b}oz^_}9t82WA9+lxqyVkcG;mxwVb{xNEFV4TAN0&&|$z9d4uzb;RHnOr|Q*8cpL>+SOg=ck(LW;lKp zR-PI(Z7VSgnn%Ts0j3%B&vP8jMeSPGH_}>nEBs>hg^p=U0?rG9|JSO!LWky@y>=OU z(6c55ocQ5u90|Iv&o2hKxQ6Dbp6OZGu1-o ztW$0qdK*XCIu1k`hOeCc!6vg0aUr4L;x4e+=YOk%K_}uf7U-|GdQVlY`;;F83j^-D z{w!APv7g6r)dNf)?_WSfX#SQZXV|qi zG7DTGKuln5oVcjaEVx+qlX!UUK%wY<$Rm81&)@E_GftX-V{`lsoRR%`lIpMRmuq=bZv>?)s0P$Eg zMk)Zp);`(bEwFXd(}PD`#TvPR?Bb*T+WZ7yFCW2MX0USh?aUrZVDryETf5uDb=hLD zw;B30+K^KU89kA%ii&D&t+%xkx8(%2lo;%Df$ooJETf!kTS#?FN9;yW+QU6SW~g-4 z3TFeoQKfwE08$P`|3oKyQYY%hwNC%qfvLsQgUsM1`solYkG~j$g3gsMfx)rP3m2jF zk6LZrQ5|D{eHnULg1@P^2n35Fx1I1>Qdc2lPXt*DHPIe>1bcIi&|`HQPgwwgL>8yU zwr)l6n<(}OOPSj7aQ;*AHz~qcZLC6v-KM0Iu}oS2J>OmBz_bfQ)DGOu-HVLmug;2M zywS5HtU644Ao{M3ywlne00ltFXO-!#J=?p|#JpR7g1;ivXj_Q+>6YG)iWj8v)_r_) zzaV=wlKhiZn^M2T)jfcjSmxp^Wy0l(^2bJe{j?1gP42sdRJM!8QQ2PTlX}QcFjBJt7Z*CpgkZYc-`SUwW z9d+YX^^;tn3v`8nF8AP#TuE<^Jb!06@STT-g@m}SbNLYwRSTkOY6#QTl;{*eP>gO@ zZR2|F6Lr&5ed>FfSoBybUlDpzUDrb2rsK_EZ%;ls)Xk`DS1H(WKP{1<%a!D`rVcFUlBGLSZ= zRyS9dfqG6q5V)#Q{4&t2*-%(T@azkBo5E%vztccM2v7#x_|`dk(mDo;{>ZI>OdsQ( zxjx~;@>=JY7a|&vWbdbO9fnQPpVNaeans&`_Wq70jq?!}#zweD3fk=U%^W}C>_DIk zLsw~J)+R$!Q2j~qRB$-NeN@Syc9X)dQE>ns* zZp#IcFLkNTBJ?hKngX@xu|P%ue<)t3grG)^^j~F>ek=#y0D)dsqQA&W=ttxqsMzGf z7_2rL5als37A7C$gW1WE3Xk|w%jDC$%73=p);zwY$C5fs%O}>jNniPaIz5vqkG^|S1=&n+u7QSmH=N#iTeflYRMVDp8OP{R z&}{ntubBfk7B&CiZ%_LWlY9NwEBWx+aq6;fS(j1=P!V7H=P|kzA?G zstt&Mkd#~|eT+e5!{tR~a-_`7$qDMVyNP9a{XLcWGVQ&;!*l-fVk7s>8t1iAd4RHZ z342LO`ladmmZ=!})}N6vO)OBtd2&*}>kfK~z;?Ya-|s>{=P?ztMWb|Xc`vaYLEq#RV#A}Yc@>e+!HQflS%%(chpMv5 z(?{4rvp3|mda3o-e+5HbSHqt8I)4dLzL;DIy$Ypa*bFS36E3H$MHYCe*Li*`ChlOX%}IP{&v ziug~=*!RUdPa9>zfqLA+D}e=U?S65QWXpNKo2p3jMFE9P+&XOk;I1-b;fo4vn+@7u z`S=R@7KZ}zdWgnjk+x$0cvUvgtjFV50oJ0oa?fg+S_r%{xi%i&T6Z4)W-YL^zH!h~ ziobT%6E&LEU6LWIl6?^fMa!YZjLFZ+XVl<6i||D6+m;Ab1K%*`uv%gsfDzIenE?t# zA|CXYFsGSLw-~ZZdvChiQdH};7B$wx5M#wwd^7SS*!xWVr{wOivD=0u0FB<#{*-HO zXQkHkmGE~dQ$#^2veSnpTE#UHTxc0E_QMrGl3r2C0Sf8CA{Sgrz+OrrP(OI9tt}Jy zDc_Ev+OI4{f2|J>1_2+Xj@WdB=l;U#7rh}*d&0dF+C*&?^Mvrqq%SsnKoVfnBz4+B zrp3b|M^ClJ1_XM4XcmxnU>t3{zz1K#>dZ|&SwnCF%zgI(}tW$Y&-s(Ny#mRbzN0!W6)s!-c z6Uq$(?WNF+Y9m1LUMWwH9!K zV)`)u!OF=0g5`*HubpxA7$?DWg0&NIh87y`X{V=D@;NX#X>L!0c^?$Ro}_<58yTJ| zE`O3wiC1y7_hj>c$|1re92vWWP>kV+54Oim;YvGy9aTXpAZk>2|9d|a=G4xx3Ietty0^I?M4&I0hA zhDd5dZme+4J5rky=poIT^lF?g`XHk`bc~y>Mr*^s8n<08~Sr<_@Bft+27E)uH15t zFuL1mkZT;g!`#3jpWwoCdaz=o@tfSB?qy#?QDM4j2OAx!K@nY(ikhgD2hBQXhk7eW zm7!1pw;G!zLK_YZ_@31K$vw^3OqIqmHzmwr4Nia0pW)BM< zi-3D0tpskmF5|b@!ma{9;(u{OtDc$wJxii8(Z^m?f%N-^w`C-OZuWZK@oS43idGix z=bQS;fdww|X2Mh1w`RLC?5j5M&DWq)_+*)F6=MYz$U_Gfz3Pk+3-LDWZfu9|%-Ni8 zMBNkuZx5dBchB6@NPi;>$1$nV6r^-xijxx}{@Wait25UM*;%V1fo+%?r8{>T$&TD? zs_?l+4Kcgz^sGU?kZ|VdlBn>QMT=d;GL>mzN3qfB4^JJpILZa`7#QvY4|YZQih>^Q zV7^eRq z_K9(BiZxr;rA_u;yrkV(KHO4cQR*SkCp_0VaAH4t?5ofcxO9P^PdX}Cb1z?24RdF1 z(h+*lYKumZ;^+TXb7;nle>< zm0sSh%*Q#;>azRtxpsmyfI$~`7rq_Lhx5dm4`-6!*!jZCiQ@HXSd`FXfQ5tbt3 z<(*PPExW{!@^f4=ZY&#``g#i2Fy9Y$DJ*1Yl`GJ!ihlgjoH=I}{P!c_`LrjBH>H&B zLg-q{5lPIox}GXy54*6?qu5<(>iFWLWRRIV0W!6afvuHYUi}@H?zS0i#T6BNi?e=G zztS2B!!I3Scsha$py&2KDLJi!&FNdW^QY>E$h##=Lvba8jds3`wjB^`~vK#`%+ zuLOC!_bjvs1f89En!W0;c#@S_jBN;2-F=v<<`bv(K zDYV=+hMlc!Af{8;d#9fwp4vw~{bFfDk-1V-*IS4xFA;!0pi@c@BBb*Nv#XJkEvYK0 z$*kH(uzYLH=E>t;Im|zb`wye>G^L8MOA(awD9fd?ztQuN;nRlrk{v(A^|`ItFr0*G z45vNEIpsfu+Aqdey=m`@BYL_8waatD%1;f(Fx3c@^^(90ds=U^BPtPNy83&ywyI2Y z>*T_$0yixKj|eE&ZeF6+J0b&4pDKXtYX*&5-T&9h%|Ey`C{OMZeY{E_5do~!KHU*P zU+2X*-nu{*37;0Z?(=81Yy`~VZ z@XrHx1ZCzbLRDj-aWc5IRDixtEt_Lh@C+Be<~p;ad27EqtsWXgSeN{}dBd>CMv!d0 zn^Lv?l_NE;>)pcGx584?NeO#5{C5h5^jvOfRig9D9I{ z%<(p?R%@fJX0=@RaqquD1|hx&Civ8j&ttxmu7u)0gt@_SVXq`Xg%7|`t^I?;MmPJL zQf9cD@-n}jy=|o<$S^$fDvrm2cA|b6_dG)6a$4+pq`==W4U?_m=Uz#Wgv}1$4Mz~~ zLfxG+|CwM=5zgD>R+DI2;QH(EL?;0e{piFPSh%ujO1??ldmmh?EyHSk(}a|VU){Sw z)hrWvg9am8nT}!&kJj-4LzL_ouo#iU?GGIe>9(DxLcfk7f6o-uem=P zpj$PP;-;OTmJ40_qY{_PK@%tF;k9o&@#i=bB9w5?gv!k4k;P)^+}kqMiCWw_xg zMSwnbCee_DJ|?P#lz|kJo;D=QttIV=j8X;FYF=&^4iMw8CaGN1qTM~Q{Yj~{0mHDV zhz_$Zn6MyyPoT@l@hs^C&MnU`Onl;;6-z5|A_QF8yBWW_N@d^iu@8H*6cFdjND;3H{P+_T2A`RsXGvYnS7S@Kv<*>_FAY5JYh?q4z4=5I zu4YYAk9Q$_Mg$w6;0m82JX(^0hd{TSIO!_hL;no6G*fg{S|A+I~F z7?=Plq;#FNiOo(@Vs(Uga`V?k`0ed4xKt`r`fvzUMTl|?5MPODFtAy5csze0OLdWyZ9$|b!g%P4Grc-@bN`WuiWbrj*^xQOl&yNnE)GQ_&@S$NY@6@~H= zZ36Au*glZfbYZj%O7hl%E$lk-y6(t(g?~5FEMUiMrB&Hq;l_!|`hJ?6{cBDdle^PT zea&z`^<5yE6H7^T4;{*gH56i8_7v%fGIeE!q*d@}E<*y#*(NNYJ@qxOEpcYBdNbT! zW<^Lk#ax+F9SMf44Df`OuO<1^;*~=U-TyoniaKX8ChvXF9alH;F0SEL$KX#pPg}p( zcA@Axs!s5&?x3kp0y{Cj!`oZ8CvRS_$uEoEwQgZ;!+5wy?bePqH_S&+%OY~ecH2&7uFSoW8b0tf>)<(=j0yRZmBXE8Kq?TkMdDvPb+f7mr5nWx%6P1;{{Rw?gxf(mVJ8d}i zznIP?ux%zawcw*y^Qh1@f5wFHR0v=EZWA>SS6OHU}dk>S_Mp`I-ji9-P@;$MZ85*U@3myKbaI<6XZ~egdf+Vqz zt0i5K?&z@<9qFvhP}p?DZ<*oWYf^=-(mz$0G6p>%j0Hct`gyeMB{AeH``z7wp1UK7 z-8ZBZ%WYsLu@K2EW|T`=iAmko3H5zV%$t$#Voe74+D9GPZByVo7cLqc_k=-W8LB;| zOQH}4H^g%a4?%v2=<~O$oM)A&H|eR*=2SUqZ!xvLLdtQUQZ%1|lLL6W^HWlL+{T#K zTc9keKfo2hr7w9&AmiS1*FD-kf}rV}OoeulfKlxGYggT21TKA(LVW(Pu=i?mIA4|w z6SEaPs3j9@yh#_EM&zxKSt1HRzQmHAe`p{f0_;~<2kVkOv}gE)sC<2s4-w0vL<)Um z%`m8cJ!p`arjOVVR0~?1qej1Z7sygBvoc>Y#I2C{#*r&jbJ`wGi2i<3(mrUzEHs2_ zqy`T$p0D5fuJax*Deag0FsT2&{LCQ6eTDFiH3;=SQ-Y5>7YV<}OoFl1u8xj~`ea;T7*@d%fb4wnGca@xr|YYP7Vz*+CC{V!6zGQ}5gi5i#5+ z7C}*>3X}aLJ!AF_)wNNXH)fhRq#-SnX?KuU6&Yf2N>t)`E5uc5?Z-~y=YHaz7Lmx< zfi%sRj@b~Fbk8X?5lL#@zR3ZjH;0q?UKe*7@*)}LDj0UZ5a;#EzuhB@&3eUXwR7K< z^5*g4DNPMx{<5{I>LSr6^L0`EzV{Gi^-E=I`g*q64NeIeU@mBFR=`LCK_e(=5V@MR z%43RXjj!Wpu$siJX+E{_m}rHdV-*4;6{g7n1ghpz;&0zLcwj0&Q6c_-CKFDtBH=os z79Hnt?8;1A<~Hnp(B`bB|GUWB+CAfT!O;XVUVK8h*=GiE@@W0QRTVF~dA@NP-SN`Q z+ia^>R`YVUOH~tPq%I5A!@4r$rd}&2eC0JeKa55lw8bk+cb2~T=|POs9b838CYj!k zH9Z)>j9HiLjVc5sKOW~a%$cK7w{^3FD$-;e>N&VmAwk!OG6ZRAZ$#y*wARt%UOc`t z^`i<+j(8r9IqgQg=3jR{W#c;T#o16nuAogb8?Wz|B)6KNw+WmX!#| z?3$Jlb&{FHQYEx>gvdIfmDppMo zr}Yfm1XOhnu9AL!Ydhhz!njeGC7^oXLydqng+;K>MqsC6ZQKmy57FDLn?U^S(;ot0 zN-n}zwEdLSL)S?~xzrPoUD$Q)sq}A&mo&pKRgO9WT<7xt)wHU0C@E!vFOL2mEx&J? z*IR}Y0D-JIhklg?qju#PzS6zzhIuQ_Mx3feQomWIvR3}9x8e7*cf%p~1Gs#^INz<`bg)Wp^L$hZ!< z!3NWB-wXnQoXr5XQi5iLb((RaCAPVs(rLW+QXrmLu;d7E13&@r2dj59g)y|F6NzgF zJ(N@1uhYAZdP1M|Qr{P8UI^W27H#&cFG(K|k^AQX9@8mF{b9%I1qexjvBOpcjh7Z+ z>qd`AS0XRI*GQ=tdE zmq#efm-MEzSmrxlhKZw7uA$I#ALSU#rb#RE>iEr(+9A~=%?p+^A6R4|3UQGd#=AAL zPCE+%VQvm*OltK=`|4!AB%ZB|C}%|=-X`qbOnpn-{4)SBp4Jw{YvAcQVKxU>FD9k-wCor6>>ZwoD42+ckozfP>og;8AjLK2Z2&TYc5^I znMOIPOBZmbg&XnxA9?IS*e2=)B7G&MnI7PWHAmDnJyPDt{{RGXNfmYgePmwX^cdRNnt?b9jP z0nE2wV7(2Yw?`Wq39POFg7<`lXOg)*cjZGB;g4g&z~^1qt7MVL-5oKpi%G`S3uT!y z;gxd?lbQj52|jae#HADWvg2tr@I}<}Bg570>^kyDx{)3B$ESJ#grIWc^3!sM(Rs3h z?7{a8(Vt}H*&@)tWyLPl`#O4;RRGySfpSy=dq=_2M*|v|@|%s(tuypA0QLoTq*hrD zd?f897ZQhG{W-fHcG+fgZ)-*xc1S1KA@`P@Ldy@{nu`ESw5a{xDwNv*lhwYub-+rP zIiQQ%>Q@s5-QsPAXW#ydWcE2NDC*_-HCr!`T-iX56Kc@i{DXbs)8*G=jhj1>uZwGx z0mK{gmds3hJoHZYHSL+hAo4u?7LAW5$16U2YT+yp+_yBv&(t%Ek-K96C)swuIQSZW znzl=8a}t)yL>>XH1b0`z0(YNOydp`C^vMkwgb&^$dpE=u`ku?iod7-d$MmV@B{Xdx zkTaPJXDGo7vR~$7(dDC3Jr!O2DNX1S71e%w+s?=u|DgU{e6=95lSRbfs|4YVr1qPV z_8S$Of0n3EQ_F;ADDx&C_73;qwIF!70mbyvr~?!xvvWA`-Y5si@!p4j25xLTVj6Gdf>ct0r?=>?N0tIt#+*Ry~iwNH2^0Gcq@XvvqwpX%}=AvI>p% zyFAvc+JT8s?aPKeD9{B^$Mr=EpL__FL>^e^pk$E?Ywm$&?HACVXB4ieD!!5B$(+Az z!^m?H&NtEF4ah84{p{%^$rn6|YT8y7WSS5rkh|n)Ud4e$Lg429E^_})|JlDaHAO%2 z6s7=5b26nZk5^}opr2e|i(OCB`y&*Ft<*rymIs=EV(2+U zK6{bz#d{;($$#bO&sSN!27+X)doJBho$n=6C%=v5x)IUQ31b79T!c_2TM}1&uF#N& zuEeyswVO6=W2KK*$$udf&N-{o$&#jGPWoYn-{GQDAg(Bl2frVFU*9@bJkuF&Bs798 zh7)Z<9sRkyDeNcI zbUBvtK7o11zNr!Qp)d<&;ThF7Tue-o8{o zvAq6xNrLKzww3jGK_+~PEksc&%mJv7qTD7QfOYsNe<rsv3h%`fLL`Z*SeA6_JoQ~& z;Te=$U@Q;0(VS5M&AbnDKj%G#re9NHGelnoOS3W1#$Z5>_Ct8mRxX@X@(OR{=BIT} z>SAdWxd#Ox=H&5orDjQoY&4jC={E2I3$Wfr?txK0nlZlTUi|&j4y#!@{8EqUBChIsSsL84FD<1$mmwuY0C2#q4gi~f7|IM%k3W+-^^rD#fv9t>C zp-F|2F|vSUtKGj-5iiDKuOvq7mC6ALtbnha{jRF}q0Juu{_>yXsd*C^wGc`c+@CDZ zVW?Guk>1YVtF9}h_(TBia;rU9PpuQ|H_!$E6}9o6$#bl=PQEnX{cTEWns4;(&c5*l zfM(3+1IO!2^%zleiLXrb{_R;lKyEg)?fs-h3kZUNRcz)gs@#Lm3~u|?W(;^&a1{6M zFQ~Rn;Ix3xwDXv@BXzZ|9T0*FJy&@?@pXUd-qg%~NV^T-s2~neh{A&?!`0Q7vA{7w zt|z%B!E_cmL42vuZ{*D23;KJU%I0>D*io3nBWMKh@BZaQfClhpr-w<+xAm{Fi;Y&V;-My|wHoIM z@7D8Cvi%hAp?6*9TsOb3?Pwr-Z;fw2ftUI~3hS5P9zg6O_fbg&grTa4*TX*B4Mcv9 zdLHS{YzCl3`X%~0U=ZE@RNPCQ*E!Hn2D*5;?WbK(ON}HgIee&}Ok~P>EZ?&TIPjM_ z2bj~|AonV++`smu^lgX{6>Y>Wdo}}%02kvS3io0CmM#FNKY`4c?6ZH?5>=*xIPK;FW_&k$;-3;tF(mHei0#%Ix*#p&}H7eUSTOZrg{pE5)mt9UJ ziINhuR9+^@tt)uogv9yaQ|I!(&^!6Gr~Mnmk*sP*z-ZvzHik2)NK4qXS{nx-`y!or*h>db^rhLf#o4(*fEzcBx0%j0-^Uw9~rgt_Z1ihY8 zU%ya)(C3W`1IU!71ORo0V3If;Z@rO+a7}Tf;~kc8TT^2y;5bxCUcf#O-ku{zKmk0l z1(%e_AJ@ma!^zb@%C`=Y2}WfqOfP3_0EwzRU#{Q62f+Ug(f*i~fJvE?EMCBCzxZrF%I1+HipW9Q3B3 zFGYiF(MS(q2da6DI+PNsPr4Uo~Rd zIMUT4-1va3rE4ijj{G!3^L}VJ-){3^z1rb@rJ`gwUq$97D|H(1K}Q{AR~((c{{ero zhZOM>7S@Q-lq$|pj^&WbQBdHX)_@qNV=KXV+Jdcn*IJ+j1hMHAD(>fNCAx~n3)LXp zXHS^1_3& zSs0^qaH{!9PM?hWkzyaA=~jPMfzjOEag`u+*GS@u8sC#6fI2-`Uk%n);7EV$5x52p zAN>^>R<8G?4)Xj}mKU#^HT`p$%d;uPhhG5Y6#8vx*LqzqbZc^i*yT0vsTK0*+K#{< z0=5t}!V#g>!Z|iNBNtu^sJZXkG2`IM%3-|0-5&+7gk14KZhS53~qgjYK^923Bo+;9s8&JtjuTWj%l2pTO?Ho5QH(WQY6rRLX7Asfq`f z@|;m&hTicWF0$GnHiA9{6fxbiVq}qGcdn+dw&te}`mpp#u-9gHLy4n5f2$ynYkl0r zQZt5$OyDr2*&EpgZVSM4XMnOb>k4F7jNY9Spj+@?`f37aVod%}HC7geE?LcMbbAJR zyXROU_~KEv)B0%YoY*%!!bbL7`?lb1PD@VU9{VB>1L@XP+#m8$z>oFL$Jif;Lk-(? V(W#3i21xh8zh>dcjhV`t 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/code-fence.png b/docs/media/tui-lock-v2/runtime/120x40/code-fence.png index 832f2f17b814204a1daaf18dc99a70fbfb8104de..35e947d846b599e869d9bcca439e5e6d8031eb09 100644 GIT binary patch literal 12977 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 Vmk?hC>Yos#t*(EwL_wtq5ow`V=uLqDkq%Nq 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 F`x~q9D&GJA diff --git a/docs/media/tui-lock-v2/runtime/120x40/composer-typing.png b/docs/media/tui-lock-v2/runtime/120x40/composer-typing.png index 22c297f2681ea09796e2ed923f1744ae2c2496af..e568d26cc58f9598a974da36431797c3a16fba94 100644 GIT binary patch delta 3232 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 delta 2779 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 H4$uA%^KY96 literal 13121 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%0Aru@Av@p=THUJpc)Do-vH^FXK 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/goal-chip-active.png b/docs/media/tui-lock-v2/runtime/120x40/goal-chip-active.png index 45693059077e826f674628ee70df5a125d387091..734db9726791327473297dc87760e3740610a632 100644 GIT binary patch literal 6881 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 U9$nt~2LxO+w?1F>n`h$x0HK!000000 literal 6970 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 JEBp`~94#y9ga_E+`iO0Ni)} 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 L5VuP;?Lz+z&&9Zb literal 6969 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 xt&lPX9`Dt02`X6*|v;> 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 OzfnMlm7#_SeS$W literal 6908 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/goal-chip-paused.png b/docs/media/tui-lock-v2/runtime/120x40/goal-chip-paused.png index fa5cf8e77f8fb1691230f1fa9a7dbe846fcd0e9f..5b5f84852a2d2eed0eb10de3fb9250628509627f 100644 GIT binary patch literal 6880 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 V7UWa9+p}GNSB=as63)BC{troq*2Dk+ literal 6939 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 c9xZloWX)+vDNkBtFDj!1?6ep$p8QV diff --git a/docs/media/tui-lock-v2/runtime/120x40/interrupt-stopped.png b/docs/media/tui-lock-v2/runtime/120x40/interrupt-stopped.png index f28135d018591097120a689119d036cd5ad8525e..38100bfea37d1f96081a3ebb7bb853c6a519f678 100644 GIT binary patch literal 8322 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 literal 6623 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 GhW!t+%YC{4 literal 10473 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/permission-prompt-hover.png b/docs/media/tui-lock-v2/runtime/120x40/permission-prompt-hover.png index e4ea44e60d47d4edffe43701cecbcb312cad1ce6..2962c1ea430bc27f9688e87f4de4d93f56e4d503 100644 GIT binary patch literal 11322 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 LJ3VFLi9-t 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 KFTUdR_4_L*vc}- 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
OLsM;JYdby1S7rI)evKjA0?Z9^b8bPN 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 aZ<`w#yg=kmf8nz`ozYcOy~4|mkN*p7cy{yv diff --git a/docs/media/tui-lock-v2/runtime/120x40/question.png b/docs/media/tui-lock-v2/runtime/120x40/question.png index 049625ccc848daec8f0d87640f33856144a2c690..cb4639e3198a391a491f58c1c4ecb3198385971b 100644 GIT binary patch literal 9659 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 z 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 NqhWBj^!B5W{{b}TqsssQ literal 8391 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 w=@P!Tzdj(hxYt-OVO%(pqAtl+h^0t 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 rbSE*q?BS_eT~!|qGTpyr=Tw)f~ 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/shortcuts-overlay.png b/docs/media/tui-lock-v2/runtime/120x40/shortcuts-overlay.png index 48e6c64006bce61113d382f5c02d305785e6e5aa..457a56ec6d33bbb2b97f5079c2b79eee52cf7d18 100644 GIT binary patch delta 10915 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 delta 10799 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/slash-palette.png b/docs/media/tui-lock-v2/runtime/120x40/slash-palette.png index 1c15b3fbe02dd9d767ea8ff050e5800c5129bcae..0aa4e04636e8785fdfb9ffc78686869ab388ac62 100644 GIT binary patch literal 22349 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

KJ4c|~k}eO-woMf1v;_55q` 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 ev;UKFWebGuOiw7Y9 diff --git a/docs/media/tui-lock-v2/runtime/120x40/todos.png b/docs/media/tui-lock-v2/runtime/120x40/todos.png index 309561372229671127f010564b12ab083fca5123..1b644aa1b688276c53b21066c0c91af5194c4460 100644 GIT binary patch literal 10236 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 delta 7134 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 RJ*QIsmuK~TUDAVO$T6h#G83{nhDj}$2Z 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

5~>* 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 TInI!?0DzsX)4BSy{(t=sK}!!M delta 3153 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/welcome-cortex.png b/docs/media/tui-lock-v2/runtime/120x40/welcome-cortex.png index e01678b032189a431bb2b399350c87bd1f5512fb..94eb6ab0e7686df6233079d065cc3ff49a980bdf 100644 GIT binary patch delta 3143 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 Ui}^AIX&tb!wEf@9(_Xj#4_Hex2mk;8 delta 3130 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 H^!EP&ySySN diff --git a/docs/media/tui-lock-v2/runtime/40x12/composer-typing.png b/docs/media/tui-lock-v2/runtime/40x12/composer-typing.png index 3b975e9ad530d59d439280302b2ac245b53c5deb..6f453d4ce02b0770d598249156ba3d1462c41ee2 100644 GIT binary patch delta 2421 zcmV-*35xcd66_R^BSs1{Nkl7-&G!0c01zc_wbkF4ilc50^f3P3lwr&8hUoWrM=8yNc z>xRv!=Ev3z0LHb!s4*InMgvy!Vf#sXP>U?sYw%RVRxHiFM^nD%tq#ayG`Lijw+-Ri z_OQPf86q54OrlhO%sacGW`(9hR-L2c)6 zBN{Tp9t}f7_sL1*;IvsY@J?R|vy+D5hsCpxl8f$<8VnH_u_D%_JTTe(aZ1CFI{^Q= zw_kJUks$(;p#i3oumK8xr}S;>1}ygSdTsuAf4kP-Zsm;vHGSW@0qeDq5g>~L2Sk9p z4mM=&Wre)~>}bx|t}|R3Skx{JetwQz^W)h^3=pZysW$8Bw^`cz zy!+456-F1e8;T$1wtdX8=Zj%Z9I%lyjz#)Ot#oxK4Kvocc@5cRnbg1i z)?GS(oVU%j-EuZ;Rf#k9ve$l&wAqk325M;Dw$-Z4OkMczk8x(#iRA!g4C8(Y0n8=k5!y`lRN-_MbcQ#Q9%tE!!` zM^yEH-Al>N?)HG~^F|6otDnWk{~luL|8>uQcbNgc2#C8TJ%pN0`}1GtAP#aMCpcYY zhyY)zW{4-afdJXn{BNYfWQYJ?1Vn%@9;(1Dyu4m7m&^Oxb=zj7Xm;UpikSvJM_w!6vhWKs2-D%3PQDKp-;>!&ll>|-<;>F)B*p1HlG5x&_2=q; ztC(%&t+wTxDy%Vji$3msyJtT;lHQVTv^wrcvo#fSvuL7WQRWa&u9r`pKww`|0?G-3 z(IVyc_x){~8GtN`2gK*+XQSq=1Wx+EfO_<79u2Icv{_jezbE2E64MW~AE9@l>fp9Qdb9l1tf#DiXszi_C7;B|%fKbc|lHbsRc>6`c}z zb>=Ah`|$7(zjEo2QhdlPCZ524F0K8vgj_y9Klc+QJY~KM`SRw_?Uiw3iNYI-zFZH;~rKS;>pFw#Jpdz2)`NLos5rsejVSE%fgH}W7+nT72lIt zJy*MQY2^Nv{?5rh$q>(J^bBq=KP>uE?$n3rult?bqO7Xi@y&R1I^rST%kMJ6-8xM! zc7l7J3=uYV#J~}Dj_+jylc515f9YOcuP?9Hty=;2?nm|-Z@1g%=Z}w%ON&PqIgmE$ zy}w;!)*p6ew@=pfRk+R#HJuaLGrOw4bjzvc`_>I$(&(*a>V5;H%by{(c9M6Tz~kd% z#yHp>7qJz33I@bcqZeUwi4GUFp9HSq*~>d}j5(ab>yCf|OGoGa!ev+Jf5pVvzDk_9 z7*;skZf`?b`gyoQ`cddD>i#oOytin$=KEWJ+IMNq?9eWT%#o=|xglgYW~D^5jE_nl zf6GEiq9QeecLfB0CYaz9VydQ%OHKSq%?&+ae#QG3YTwfaI0mkNi5K*7at<8=N0==aLD}FQEn?)3{O*ooq*K` zv}QlQzpYQiQp)z~>3!n7+PN(=#MNRh$fXzUa29-TLz~%5Eg-(gfAAsIux!czeEV8oqJjb-|R8G$e_VbENU`*ZpB&DAN%4JyHfHnN$(7NrW z?=O{AdZ==VPExuPi&IHTq3AGs(r@*+Iq(k6Y+o&^fAv`ScDu!wO$=&@Q*wdg@h=<9 zPBCYH?}|E(lp&5@E^_52D7&-lfu)g^tWbJ?!&QyW|Ms41XK74@o?KCL_~>Wf9Pl4M n?f`pmqzn<0p#c~eIKTe^OwC<+YK01X00000NkvXXu0mjfQqk!# delta 2082 zcmV+-2;KMW6r2)}BSi?~Nkl3nJJAKqFOJ|h_-tk)W5?(&Wy+}q;kD?@}e8VwDj ziBhu&oe*e$CfBg7`M%yArfp3;qZk4rY)>m1j>e$*4aMua77nypa6VDV476pOr;AxD zkK8%~86s?0Aem|=kMrnF28VW=uyuwrk|DzWO$#EA=4+?(Ww!WR=s*G@@IOU^+RC3s zR5HUFbwfjQ=q(&(Fv`Ki)65 z0CzfHx@lTCvukecHt%k2Ws%MOUteF}-rgd|3?zyV5tEe-h=1|XFqhFXHe(6=^78V~ z{y>UbJSiF$3kJkiG)zB@I+m@Z{{8y;n&B%8p4^;yRq>L!nkCT%_Nopbx5#)r9?ON4 z;sLRAG;GZSjwX+zYsbLTnj=HZYv@^-dZi^SF%&kNd+Y{wW;2i71fC)cyb|6dqQQpD zF!@&S!R#59gnt5-`pGj;PU)z!y^=W~CW{0ZvYC<@ptN0Oi1I-og$xnkZq^L(dc96= zdpI02js&1%F+-+$N@wO&2VRfaonA7SZ zycKvJGDLv8xiiE+e*LVf>hC}Qn)9G_(%1XkPk1ZvJb#ucnNz}Ipu+7&v|ROXxt@Xb zSh8gPM5)Hf2ExbcaCy`s_gYXRe zmKoqqKm@oG5CQH4M1Z?l7ghGRG~s_E1$!bx1h^9r0q(Z+|5Sk;JDo38Reii)mK{cl z+bL9AJ_{KlyK*{T>f3V8wkh^^+(k|&i-Kzc$A9Cos;bY=&vJ(#p!=cB_`N-UI@8KN zdXtgnDL*>4$!%NLdBQbG8TLc{=ekxg$I9Dnt#nk8A?{P}SM+wjw_Db8BIzS(Myu^s znzf;ro5d{}7G(}`=UVyH4g}66C7|pe7(Jxi`F^}FGXs!C@qlGXTolUWhvA=hqz}8PQ6DyRrloaG5z}~aGg`GZQ}c~-M3YSxO4F_FPBO%O>iq=QFBW|$cj(3R z$Nl#0p{%Oh`EY6{CICq z`##z;E3}G|IWko#S3-tkR!T(6xKwiZSFR4HjiLVc^?H5u;?H~~Bb)T@mgSAJP_{V* zGsN(ef42e&1?L0>7Tm5vtw7$%n8Ar<2bn(}!Do}BMCoap(e4U4Ky`h1{ zzekZhkDf2X8{pB5GG^jp^bjf6Im?yo*0V89 zCbtb6{ampg1xw~bL%E}5(fybzb^<29p>tm6kN4?`SW4SgKdo1Mu2ycz3~{oU8}iYc zwmS>Hw$f%aQwxZHZ_-_)>b6ZOz}J7B^Ln=P-MUpQs!VhJ*MugmR?Q!Zgy)#1eU#Jl zg7rKi6R4@1ucTb(fN~jDGhlUpI5h3J>F3MLW?EFKqLY;7#NtqrQYbo%e(0B4ZVo&{ zGkUEa>VI-Ae7#=d+a?CJ#3{Kz^Z17iMyHswKX=7Ewv-_-_TF;kCMcV;?18P3olH>r ze8XM!&i}U7wX+OnhATOt=kU9q{cym4{BZ|ZgDquqI_*5m3O8@`> M07*qoM6N<$f`C&RH2?qr diff --git a/docs/media/tui-lock-v2/runtime/40x12/diff-hunk.png b/docs/media/tui-lock-v2/runtime/40x12/diff-hunk.png index d3868918d13043e162e64ac9dc58cfec10a544cb..7e8015f1ceb5f843e77c076e4a6a9acf90274b70 100644 GIT binary patch literal 5077 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%0A`%%sxA-d3s`I5|0$jsgu|aZ@0QQUeC;S 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 diff --git a/docs/media/tui-lock-v2/runtime/40x12/goal-chip-active.png b/docs/media/tui-lock-v2/runtime/40x12/goal-chip-active.png index 1424b151b5971d87e15acd624de493c6c21f3af8..467bc76645c926dc6c2557c152270b523aebff24 100644 GIT binary patch delta 3541 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 P00000NkvXXu0mjfYnvn9 delta 3618 zcmV+-4&CvG9oQX^BvqeDL_t(|obBB`Zsx`r0N`&8SKb>e3}m|nd<69=(z)<0)ae8| z!FGF#6zN=~SGi>ZA&mm~3Ieus3Mw?spZSLKLk{^p4;BkaB!@FY^5qQw=5hg(5d|54 zpgHgM&H&J^`-jKwhcBNWcg)6SzTZ0oz`Q;fU6$j~>^$8cN56*C35#56xT4v`r!x#w z4oodxq9p<%v}h@~{z>Cc>XV+ zAG?3uucIP_r)Fj>hJXmo=@0e5F&}e(b+6?sfLG(@?B8pbNS7H}lz+fy#*XCv^0d)6 z{Nrq{!c(WS)r;?1h;TfsLPO5w$bxaXpc-j*v=HH_>NS+oBF-p3vx%hjlsBV=2nQ1% zts?JETwOfPaPd-cFtbEgX(7TS;L^;irfyIo0TB*n8W%=Dk!Un? zH+2*)12P+5#pB>eLW$z(GDC~*A0E4Zv%jvA*3B#xYr>BZMNVD%d-0C5cbS1dwEXDe z2DA`?vD=J>lMw|Ue;m)dvdR7UQ_O5Ja~2VqtJCPKx3g66oUO3&7TnBP%QdxcNpB?}?(2wwuSTBx z)JBnU8%Nv<3~jIl1;jsbw6q{+E7*cZx9=8gDea|@QzRzUpp=~G|Ywbu(~H*;iQP1p-#QV#4! zk*i2s?8v@~66P@x+TF8fA{sUm=dM!P6>5YJk}?7{71`9 z`*2f--ZvTzh-v4;=~6rPP)ezt|Frmi^je*2v!0uE^{VbcH5U+*FV){+dXj{Y%1k5HFi4ZtLI9~UJcfV-Z$C` zh`o(Zf6hxc%VO@ JHgXZO5>5=E|e_VU7X*;2W>OzJsdD@3NeG-phS5^C~lR(EMJ zMV4sQ_MP5NskCn_%~`xAeIWL_4Q}>BLH5|555xi_5)c92=rRMRrOOPENI(R5BOn62 z5fB012#5f01Vn&0jlQ~9Pr?i5p8JOzp@sN|f9L1tO7Eo~F=erZ>747cedukKC9*;x9y|I29ES%HxZ623__yLk9>NlR1nQ-)ix_SL=fcbR7glbg

r7oUvWN1v)1ZaxMOdo>cn!v+ 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 literal 5314 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 diff --git a/docs/media/tui-lock-v2/runtime/40x12/shortcuts-overlay.png b/docs/media/tui-lock-v2/runtime/40x12/shortcuts-overlay.png index c568037ea153051ebf64d7dbea206fa53e883ed4..efa53921b9117b9f1f6b5c17fc2d05169d1ae362 100644 GIT binary patch delta 3818 zcmV%*us8%eW))xFrik{@b`3yvzhRIwdXi*M1Af0Qi_C}K8T zPFA)K@zPq@-kTO8Tvtj%>HI$L>WaD3aEX3+VT^1AN}N0zF1K2et$ z7%O<5F6CNz;?xspA;N`48dJl@<2hyPu~$%Pa4KA7O!4PK7VwJv=D(AJF+I{f=Ttu zDIE`Y0RHc*JV^Qx@5=mVL7oX}4;%N0n68g5i#gw_0 zlb0QpGd<6^TKJD2KT7RtxU?TXev~b+%te(_$LANkUvGMK<)D86aDwx1sp-R~Yo9$H zkDNFvaDP#ycxxr+Qp0hVDTaa7_i!`UJ1j>C@_Jgn<#1NJSDAN5TV~2U2R7Aeb-ha^ zFRc!)W%kPQwKB1-K%C8yaB&Z z-f#n#Ginb`6EHsJa+}&}Ap%q+5CKXkawjA}5d`^(q=l2*3tE4_)ULoDzyIr>x7+Q% z|Nc+yiooBzy?=DSeE;@Qu^I)v-WJ7G2*fVVhWcnrNxFXV-~aW`>70?m6U$#MaJJ<5 z;xCik{o&C$;vlJY1a|8!veLvtMmux3>D1xx|NZxWMhlLnPA6@Rym&u-wdMzz9!sO{*z~B29Ea(BnX=2SPEDzEdgpXD zl{VSk>HGfeV^jR?+uj}a^_LT;E)`zu%t^JY%zgB9KSh5^tD?=50JERV(P^5c&u(Pd zed{e^M^>IGzXF+QSX}W{q!(E6-8?%GM?KK)XLhz}!*F+cju!0yJg%iS+h$y9>K^L* zw~xgCvD4YomyNG?>*ss5r4y-De7)1D-7Ecz{hy~bOy1rzttlovfks4 zu7dr$f|blE>bM?j{G>$wDT_>Xy3C^nTARJj7c<-HNsO&?T1=}M{qm~cbdo9l4(|T= zo$2fr;;UY$y?VG`{ZMSd$roX6Yv&g775`LBEBt@{w;4^HnFJq%tI-6sKqZX?^|yv2d%4OC~sZ$zWYzBzi}f!T;1|SfK0D(XR2m~TPAP@lpfyjR$N3n<{ z=s1i|-L%HUBYaclMrPi(pMNv!JnC=m=zi}0m$O={rAp2&d%m*+v2PeYpHG2UOW8y_ zXW8QvtktF`PR>evGI@H*nJ42mE%gGQjhg2Wb(v4Fd(^$vWpkcQedgGBqu~SlKW9hI zI;d7#_he?BtGBsw_GH~>o}b!6j9*dFU@R`@gLT|ly!gXhXRoWqr+*evYaGGhZ2MZ2 zDW#nmF~@!CPEh9@;`EA&G=%DLK!rf;vd>lK>Z*6FUQflrxkgI8r|oRfIVyZpMGn4z z7dU-Ba@-ajy1j{K+_u)C*50W8*{D3~-tZN@=96W9_(~l!6~BfNxhTA~R_Vw2j_ut# zbmFjCw|ivm)%SPzo-oWARq<%2wh*V0Cj>9&(x=R49e07~)O%+xtiN%lB^|6{`V>1Y* z+>FXRA*%XSOgHDWIxIPVZ_qMb=621-$5N&==t5P6juzqtbj_Ah`LfzxJ3%`Qu@?3Q z?GT8qo6U~V(L4MzlAc>*XtqB-IxV<*mN2I~KU#eC1j6o;bCx}>&YVvmUVldZf%NwN zQTAwzq+z_lHBInMiws{(*`ngh7MV(e1mY!)LL_ovm+fwM1$Lz!bhM8)Z5mrSTU2V< zQLQ%Bx%j^&3KEE4LZ4zOmipuUVLU1=(mdR8+Lg3At%|J`k($oE4w zZR}P#dopp-zV*@wEyQ*$ooG9>{Lu{YBmbZie6!``?2VLVi`+*!S}Nq|caY+K%31jF zc-(Hc&(F_7mErQ*Inl`%l%Ggihya0eh?JyZ$fao^lYj^plQ0Ygf3KkX-d-kw2oMwq z#3I2AP+gf8qD%y8c|0C{1Z6&aE9>!JH&F<*Br_0mTZkTp2sA<*0RR910000000000 z0000000519d;fTQ|EOIHXvHr_6#9HVN3Y!P_tB*OmH6V**-{FRm%m!zrb1G-=mdSP zegF26Us_}*-^%Uhf4Y0D*X_C@`|afNkFNO_RDO`D*?ftF4z2MH@?{;;LhRh{_kBlE zV#A?S`(jh;^-J0P4lb3}{UTdw)`5X|iyl$4-LBoes_BBW>9#xaQYsedNX|}*oV@Eh zLDPAL{iFElzxc9=M(^P2eqMUJcl4~|o%F=ndaHY5G(&tpe@EV+e(Gq_@XwU@chnso zo)XC{nTP|&Wqv-N&*$_0m-w8CrHu~G(JKep(Sfovp|l=R(k}e?`OeaGGsA?(S7hng z3brmA*`hP$TzpSoB;`HI+4Iw@4X@pW{A$}<%25|py3g*5Wyfk7MlPxEz66wc@g%d+ z(at*<=~EA1ncdIBFXZgo8^^V05MMV0Oe$1|4^~Ipy+E&VJ5+k7mzJFUbtG%u{la#na!x+4U~Xpqsoy`4-~r2egs% ziKm_1EV7E6)BLkj6A$B~-@$lMv+vR9y7mdXck67WDlojpa>D9>|MPGM7&`FAY>{yj gk$?ml0D#T@2Yw535?QXhkpKVy07*qoM6N<$g0GzAJpcdz delta 3624 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 dMOxMmMc)8Rd828k literal 4442 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 E-}i>J-2eap diff --git a/docs/media/tui-lock-v2/runtime/40x12/welcome-agent.png b/docs/media/tui-lock-v2/runtime/40x12/welcome-agent.png index 6f369dccebb4249d60eb71700311645452ee88cd..8bbf2fb737b77662778cc158cf62a8a8837bf647 100644 GIT binary patch delta 2517 zcmV;`2`cuG9D*E>Bmv2>C13-89(v5b%kzEo&+!A0^Ice6ee&`7qkqn09O=gFy1hh6soB4DX%+lW_%fe*gf0 z%jI&peA>GLtG&M69)Em$ziq$WjW-Hx>6g7Lkgki207V=)AOe(iuqN{$D;zXnCv(Pb znep7ftZr@~57m5zlQ~a@7;ZspUjvJNt-XPlmzT&TzkmN8x#YL^+atiezTL)YS~#=o z&mFHmo;%1Q`^$g%^5yH-uaR{Ie=@~~h-7sGVth0#Ww9AsunGM6^XFB|134b?q-t2K z7!U{1Fn>3?Sk_4U_s5SP8~kL!liM<{s@`P2Y?9~#XVnFeM`V0?d8rptst3f{(Qt4b za4~sY>^laY))pCJS#$TwbUiI$nW3=1y4!BxWDaxNP2euVz?AST5e*Jxe}ju}6>rSm zpi3xVuScGNdTK|N<29KBVzNkpIfrR71Jrh^3{gG^t3(df;9mc zJ4}=L-+%uN%>DG~VDB*l8l=e#@IgQX_#hx|0${y0a z&fu0~Og@R-n#{XIf5SQ9FYV;=;bh@yKW%G|tXQpFv|xRW;7NxNq|iwPw>%_i|nk z``d571?GAmBF`-T7Wbnw>K-s5=NTC0c)0_>2N@z9l6&D0r0WlRGEE&Ee691aJ$xTn5vS%2OV2cbu09>^GLH29t^b@%#7h-EM5q_1qtycN+<;&NvUo#6SrEaH+#IR*+N4#5Q?v{?pZ|pV> zor=y0+&XiV{r&v;bNs@!LrV1~vzT}S?R>S`sR^b0`0=BiD5016DYSFJuEAz0blit{ zW;U@G?^ED7=N#LDqf;G=4DsaRS7Tz?M=Zj3hW9VV7a4Uga&*Jm>vmHT zo|8$wR=aj?k&z(JN``n&;c?fh-jq8xG5>bIb6b^F)jPihf1HkZiVao=J3CD-c7oqL z86xcLh=C*Q9M5F~lW_$kf5-Luc6)uh?Oh9K#jiCAz2EPHDc9?DFsqvqUVXe+OyS}3 z7YkffNX#B>po?qY-f#J(1rGA1+;QIbh;<%^uE=rQxcu5Re?q?$FL5%y1cDB&aRzx> zRWihf>-C!UEs9JWO63=;ve&1Qd$FR zSfC*}IV*7Su4@F1m+7~U!k7QT>qZ)!!Nub|ce)c=*5O8aO z)&Do<{0^GK{YxU5B@#nuxI2UhmXLidBvZwHo%$Ym6xxkSRpTW817fW8;U&hJ@ z#K{ltBUOx9GEi(+)L_b@$Od&nIRkThloOr9AL7N2_+H6EfBr>@#d9?Ii3)6DGFkC=N8aRPEbBWocw?` zay@agin=OatG+Ecw;t` faRnF{z-s>i*XM7Y&5Hs{00000NkvXXu0mjf^;;1` delta 2533 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 au-bpL;{-%&m>Kf`0000HeEPy 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 From 70cba350fcd5a1b4043d74707ed5b658d2b6fab8 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:16:21 +0000 Subject: [PATCH 03/15] feat(tui): lock /model effort radios and custom labels Align /model list and High/Medium/Low effort rows with lock v2 copy, gutter, and footers. Enter chooses then applies; custom providers stay Cortex-safe. COR-13 residual only. Co-authored-by: Mathis --- .../src/commands/executor/dispatch.rs | 2 +- src/cortex-tui/src/commands/executor/tests.rs | 8 +- src/cortex-tui/src/commands/forms.rs | 4 +- .../src/interactive/builders/model.rs | 167 ++++++++++++++---- src/cortex-tui/src/interactive/handlers.rs | 22 +++ src/cortex-tui/src/interactive/renderer.rs | 85 ++++++--- src/cortex-tui/src/interactive/state.rs | 3 + src/cortex-tui/src/lock_v2.rs | 6 + src/cortex-tui/src/lock_v2_residual.rs | 49 +++++ src/cortex-tui/src/lock_v2_scenes.rs | 1 - src/cortex-tui/src/providers/manager.rs | 33 +--- .../src/runner/event_loop/commands.rs | 8 +- src/cortex-tui/src/runner/event_loop/mouse.rs | 26 ++- src/cortex-tui/src/ui/chrome.rs | 26 +++ src/cortex-tui/src/ui/text_utils.rs | 37 +++- .../src/views/minimal_session/view.rs | 12 +- 16 files changed, 385 insertions(+), 104 deletions(-) diff --git a/src/cortex-tui/src/commands/executor/dispatch.rs b/src/cortex-tui/src/commands/executor/dispatch.rs index 1b5a5ae3..4d0498a9 100644 --- a/src/cortex-tui/src/commands/executor/dispatch.rs +++ b/src/cortex-tui/src/commands/executor/dispatch.rs @@ -27,7 +27,7 @@ impl CommandExecutor { "plan" => CommandResult::OpenModal(ModalType::Plan), "goal" => self.cmd_goal(cmd), // Effort radios live on `/model` (Tab). `/effort` is an alias. - "effort" => CommandResult::OpenModal(ModalType::ModelPicker), + "effort" => CommandResult::OpenModal(ModalType::Effort), "btw" => CommandResult::Message("Side note captured for this turn.".to_string()), "jobs" | "bg" | "background" | "tasks" => CommandResult::OpenModal(ModalType::Tasks), "skills" | "sk" => CommandResult::OpenModal(ModalType::Skills), diff --git a/src/cortex-tui/src/commands/executor/tests.rs b/src/cortex-tui/src/commands/executor/tests.rs index c893ba56..50182dc4 100644 --- a/src/cortex-tui/src/commands/executor/tests.rs +++ b/src/cortex-tui/src/commands/executor/tests.rs @@ -583,13 +583,9 @@ fn effort_opens_model_picker_not_a_star_picker() { let executor = CommandExecutor::new(); let result = executor.execute_str("/effort"); assert!( - matches!(result, CommandResult::OpenModal(ModalType::ModelPicker)), - "expected /effort to open /model radios, got {result:?}" + matches!(result, CommandResult::OpenModal(ModalType::Effort)), + "expected /effort to open /model effort radios, got {result:?}" ); - assert!(!matches!( - result, - CommandResult::OpenModal(ModalType::Effort) - )); } #[test] diff --git a/src/cortex-tui/src/commands/forms.rs b/src/cortex-tui/src/commands/forms.rs index bfcac06f..bb5ac716 100644 --- a/src/cortex-tui/src/commands/forms.rs +++ b/src/cortex-tui/src/commands/forms.rs @@ -241,7 +241,7 @@ impl FormRegistry { vec![ FormField::text("provider", "Provider Name") .required() - .with_placeholder("anthropic, openai, groq..."), + .with_placeholder("cortex, custom..."), ], )), @@ -251,7 +251,7 @@ impl FormRegistry { vec![ FormField::text("model", "Model Name") .required() - .with_placeholder("claude-sonnet-4-20250514, gpt-4..."), + .with_placeholder("Cortex Mini 1, Cortex 1, Cortex Max 1"), ], )), diff --git a/src/cortex-tui/src/interactive/builders/model.rs b/src/cortex-tui/src/interactive/builders/model.rs index ecf944ad..06ca6d6a 100644 --- a/src/cortex-tui/src/interactive/builders/model.rs +++ b/src/cortex-tui/src/interactive/builders/model.rs @@ -4,11 +4,12 @@ use crate::interactive::state::{ EffortLevel, InteractiveAction, InteractiveItem, InteractiveState, }; use crate::providers::models::ModelInfo; +use crate::ui::text_utils::{contains_foreign_brand, model_display_name}; /// Build an interactive state for model selection. /// Models should be passed from ProviderManager.available_models(). /// -/// Effort is Low / Medium / High radios on this surface. Tab cycles them. +/// Effort is High / Medium / Low radios on this surface. Tab jumps to them. /// There is no separate A★ `/effort` picker. pub fn build_model_selector( models: Vec, @@ -19,26 +20,15 @@ pub fn build_model_selector( .iter() .map(|model| { let is_current = current_model.map(|c| c == model.id).unwrap_or(false); - - let description = format_model_description(model); - - InteractiveItem::new(&model.id, &model.name) + let (label, description) = format_model_row(model, is_current); + InteractiveItem::new(&model.id, label) .with_description(description) .with_current(is_current) .with_metadata(model.id.clone()) }) .collect(); - // Sort: current first, then by name - items.sort_by(|a, b| { - if a.is_current && !b.is_current { - std::cmp::Ordering::Less - } else if !a.is_current && b.is_current { - std::cmp::Ordering::Greater - } else { - a.label.cmp(&b.label) - } - }); + items.sort_by_key(|item| catalog_rank(&item.label)); let title = "Select Model".to_string(); @@ -54,30 +44,65 @@ pub fn build_model_selector( ]) } -/// Format a model description showing context window and other info. -fn format_model_description(model: &ModelInfo) -> String { - let mut parts = Vec::new(); +/// Lock v2 `/model` copy. Custom / third-party ids stay Cortex-safe. +fn format_model_row(model: &ModelInfo, is_current: bool) -> (String, String) { + let label = cortex_safe_label(&model.id, &model.name); + let mut desc = lock_description(&model.id, &label).unwrap_or_else(|| { + let raw = model.description.trim(); + if !raw.is_empty() && !looks_foreign(raw) { + raw.to_string() + } else { + "Custom model".to_string() + } + }); + if is_max_label(&label) && !desc.contains("MAX") { + desc.push_str(" · MAX"); + } + if is_current { + desc.push_str(" · current"); + } + (label, desc) +} + +fn cortex_safe_label(id: &str, name: &str) -> String { + for candidate in [name, id] { + let pretty = model_display_name(candidate); + if !looks_foreign(candidate) && !looks_foreign(&pretty) { + return pretty; + } + } + "Custom model".to_string() +} - // Context window - let ctx = model.context_window; - let ctx_str = if ctx >= 1_000_000 { - format!("{}M ctx", ctx / 1_000_000) - } else if ctx >= 1_000 { - format!("{}K ctx", ctx / 1_000) +fn lock_description(id: &str, label: &str) -> Option { + let key = id.rsplit('/').next().unwrap_or(id); + let text = if key.eq_ignore_ascii_case("cortex-1-mini") || label == "Cortex Mini 1" { + Some("Fast default for everyday coding") + } else if key.eq_ignore_ascii_case("cortex-1-max") || label == "Cortex Max 1" { + Some("Longest context — bills by token instead of per request") + } else if key.eq_ignore_ascii_case("cortex-1") || label == "Cortex 1" { + Some("Deeper reasoning for hard changes") } else { - format!("{} ctx", ctx) + None }; - parts.push(ctx_str); + text.map(str::to_string) +} - // Capabilities - if model.vision { - parts.push("vision".to_string()); - } - if model.tools { - parts.push("tools".to_string()); +fn is_max_label(label: &str) -> bool { + label.to_ascii_lowercase().contains("max") +} + +fn catalog_rank(label: &str) -> u8 { + match label { + "Cortex Mini 1" => 0, + "Cortex 1" => 1, + "Cortex Max 1" => 2, + _ => 10, } +} - parts.join(", ") +fn looks_foreign(text: &str) -> bool { + contains_foreign_brand(text) } #[cfg(test)] @@ -87,7 +112,6 @@ mod tests { #[test] fn test_build_model_selector() { let state = build_model_selector(Vec::new(), None, None); - // May be empty if no models configured, but should not panic assert_eq!(state.title, "Select Model"); assert!(state.searchable); assert_eq!(state.effort, Some(EffortLevel::Medium)); @@ -115,4 +139,79 @@ mod tests { assert!(!line.contains('★') && !line.contains("A★"), "{line}"); assert!(line.contains("Low") && line.contains("Medium") && line.contains("High")); } + + #[test] + fn lock_rows_use_catalog_copy_and_hide_foreign_brands() { + let models = vec![ + ModelInfo::new("cortex-1-mini", "Cortex Mini 1", "cortex"), + ModelInfo::new("cortex-1", "Cortex 1", "cortex"), + ModelInfo::new("cortex-1-max", "Cortex Max 1", "cortex"), + ModelInfo::new("acme/other-router", "Custom model", "custom"), + ]; + let state = build_model_selector(models, Some("cortex-1-mini"), Some("medium")); + let labels: Vec<_> = state.items.iter().map(|i| i.label.as_str()).collect(); + assert_eq!( + labels, + ["Cortex Mini 1", "Cortex 1", "Cortex Max 1", "Custom model"] + ); + assert!( + state.items[0] + .description + .as_deref() + .unwrap_or("") + .contains("Fast default for everyday coding") + ); + assert!( + state.items[0] + .description + .as_deref() + .unwrap_or("") + .contains("current") + ); + assert!( + state.items[2] + .description + .as_deref() + .unwrap_or("") + .contains("Longest context") + ); + assert!( + state.items[2] + .description + .as_deref() + .unwrap_or("") + .contains("MAX") + ); + let joined = state + .items + .iter() + .map(|i| format!("{} {}", i.label, i.description.clone().unwrap_or_default())) + .collect::>() + .join("\n") + .to_ascii_lowercase(); + assert!(!joined.contains("claude")); + assert!(!joined.contains("anthropic")); + assert!(!joined.contains("openai")); + assert!(!joined.contains("gpt-4")); + } + + #[test] + fn foreign_provider_ids_become_custom_model() { + let models = vec![ModelInfo::new( + "anthropic/claude-sonnet-4", + "Claude Sonnet 4", + "anthropic", + )]; + let state = build_model_selector(models, None, None); + assert_eq!(state.items[0].label, "Custom model"); + let blob = format!( + "{} {}", + state.items[0].label, + state.items[0].description.clone().unwrap_or_default() + ) + .to_ascii_lowercase(); + assert!(!blob.contains("claude")); + assert!(!blob.contains("anthropic")); + assert!(!blob.contains("sonnet")); + } } diff --git a/src/cortex-tui/src/interactive/handlers.rs b/src/cortex-tui/src/interactive/handlers.rs index 7f92d691..b7ad159d 100644 --- a/src/cortex-tui/src/interactive/handlers.rs +++ b/src/cortex-tui/src/interactive/handlers.rs @@ -88,6 +88,10 @@ pub fn handle_interactive_key(state: &mut InteractiveState, key: KeyEvent) -> In // Selection KeyCode::Enter => { + if state.effort.is_some() && !state.effort_focused { + state.effort_focused = true; + return InteractiveResult::Continue; + } if let Some(item) = state.selected_item() { if item.disabled { InteractiveResult::Continue @@ -450,6 +454,24 @@ mod tests { assert_eq!(state.effort, Some(crate::interactive::EffortLevel::Medium)); } + #[test] + fn enter_on_model_list_opens_effort_then_applies() { + let items = vec![InteractiveItem::new("mini", "Cortex Mini 1")]; + let mut state = InteractiveState::new("Model", items, InteractiveAction::SetModel) + .with_effort(crate::interactive::EffortLevel::Medium); + let enter = KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE); + let first = handle_interactive_key(&mut state, enter); + assert!(matches!(first, InteractiveResult::Continue)); + assert!(state.effort_focused); + state.effort_down(); + let apply = handle_interactive_key(&mut state, enter); + assert!(matches!( + apply, + InteractiveResult::Selected { ref item_id, .. } if item_id == "mini" + )); + assert_eq!(state.effort, Some(crate::interactive::EffortLevel::Low)); + } + #[test] fn tab_is_a_no_op_without_effort_radios() { let mut state = create_test_state(); diff --git a/src/cortex-tui/src/interactive/renderer.rs b/src/cortex-tui/src/interactive/renderer.rs index 2e8edfd8..844a2236 100644 --- a/src/cortex-tui/src/interactive/renderer.rs +++ b/src/cortex-tui/src/interactive/renderer.rs @@ -1,6 +1,8 @@ //! Renderer for interactive selection in the input area. -use super::state::{EffortLevel, InlineFormState, InteractiveItem, InteractiveState}; +use super::state::{ + EffortLevel, InlineFormState, InteractiveAction, InteractiveItem, InteractiveState, +}; use cortex_core::style::{ ACCENT, BAR_HOVER, BORDER_FOCUS, HAIRLINE, SELECTION_BG, SUCCESS, SURFACE_1, TEXT, TEXT_DIM, TEXT_MUTED, @@ -333,6 +335,7 @@ impl<'a> InteractiveWidget<'a> { } let start = self.state.scroll_offset; let end = (start + area.height as usize).min(visible_items.len()); + let name_w = self.lock_name_width(); for (i, (real_idx, item)) in visible_items .iter() @@ -357,6 +360,7 @@ impl<'a> InteractiveWidget<'a> { is_selected, is_hovered, is_checked, + name_w, ); } @@ -380,6 +384,29 @@ impl<'a> InteractiveWidget<'a> { } /// Render a single item. + fn lock_menu(&self) -> bool { + matches!(self.state.action, InteractiveAction::SetModel) || self.state.effort.is_some() + } + + fn lock_gutter(&self) -> u16 { + if self.rows_only && self.lock_menu() { + 3 + } else { + 0 + } + } + + fn lock_name_width(&self) -> usize { + let longest = self + .state + .visible_items() + .iter() + .map(|(_, item)| item.label.chars().count()) + .max() + .unwrap_or(0); + longest.saturating_add(2).max(16) + } + fn render_item( &self, area: Rect, @@ -388,6 +415,7 @@ impl<'a> InteractiveWidget<'a> { is_selected: bool, is_hovered: bool, is_checked: bool, + name_w: usize, ) { // Selected row: the dark gray bar with a banner green `>` and a banner green label — // never inverted onto the accent. Unselected rows lead with a dim @@ -416,7 +444,7 @@ impl<'a> InteractiveWidget<'a> { } } - let mut x = area.x; + let mut x = area.x + self.lock_gutter(); if !item.is_separator { let (marker, marker_style) = if selected_bar { ( @@ -425,6 +453,8 @@ impl<'a> InteractiveWidget<'a> { ) } else if item.disabled { (" ", Style::default().fg(TEXT_MUTED)) + } else if self.lock_menu() { + (" ", Style::default().fg(TEXT_DIM)) } else { ("· ", Style::default().fg(TEXT_DIM)) }; @@ -472,21 +502,32 @@ impl<'a> InteractiveWidget<'a> { buf.set_string(x, area.y, &label, label_style); x += label.chars().count() as u16; - // Description right-aligned when it fits beside the label; dim even - // on the selection bar. if let Some(ref desc) = item.description { - let remaining = (area.x + area.width).saturating_sub(x + 2) as usize; - let desc_text = crate::ui::text_utils::first_fitting_line(desc, remaining); - if !desc_text.is_empty() { - let desc_w = desc_text.chars().count() as u16; - let desc_x = area.x + area.width.saturating_sub(desc_w + 1); - if desc_x > x + 1 { - let desc_style = if selected_bar { - Style::default().fg(TEXT_DIM).bg(SELECTION_BG) - } else { - Style::default().fg(TEXT_DIM) - }; - buf.set_string(desc_x, area.y, &desc_text, desc_style); + let desc_style = if selected_bar { + Style::default().fg(TEXT_DIM).bg(SELECTION_BG) + } else { + Style::default().fg(TEXT_DIM) + }; + if self.lock_menu() { + let desc_x = area.x + self.lock_gutter() + 2 + name_w as u16; + if desc_x + 2 < area.right() { + let shown = crate::ui::text_utils::first_fitting_line( + desc, + area.right().saturating_sub(desc_x + 1) as usize, + ); + if !shown.is_empty() { + buf.set_string(desc_x, area.y, &shown, desc_style); + } + } + } else { + let remaining = (area.x + area.width).saturating_sub(x + 2) as usize; + let desc_text = crate::ui::text_utils::first_fitting_line(desc, remaining); + if !desc_text.is_empty() { + let desc_w = desc_text.chars().count() as u16; + let desc_x = area.x + area.width.saturating_sub(desc_w + 1); + if desc_x > x + 1 { + buf.set_string(desc_x, area.y, &desc_text, desc_style); + } } } } @@ -500,6 +541,7 @@ impl<'a> InteractiveWidget<'a> { if area.height < 1 { return; } + let gutter = self.lock_gutter(); for (i, (level, label, desc)) in EffortLevel::rows().iter().enumerate() { let y = area.y + i as u16; if y >= area.bottom() { @@ -507,6 +549,7 @@ impl<'a> InteractiveWidget<'a> { } let focused = self.state.effort_focused && *level == effort; let hovered = !focused && self.state.hovered == Some(1000 + i); + let row_x = area.x + gutter; if focused { for dx in 0..area.width { if let Some(cell) = buf.cell_mut((area.x + dx, y)) { @@ -514,7 +557,7 @@ impl<'a> InteractiveWidget<'a> { } } buf.set_string( - area.x, + row_x, y, "> ", Style::default().fg(ACCENT).bg(cortex_core::style::TEXT), @@ -525,9 +568,9 @@ impl<'a> InteractiveWidget<'a> { cell.set_bg(BAR_HOVER); } } - buf.set_string(area.x, y, " ", Style::default().fg(TEXT_DIM).bg(BAR_HOVER)); + buf.set_string(row_x, y, " ", Style::default().fg(TEXT_DIM).bg(BAR_HOVER)); } else { - buf.set_string(area.x, y, " ", Style::default().fg(TEXT_DIM)); + buf.set_string(row_x, y, " ", Style::default().fg(TEXT_DIM)); } let name_style = if focused { Style::default() @@ -537,8 +580,8 @@ impl<'a> InteractiveWidget<'a> { } else { Style::default().fg(TEXT) }; - buf.set_string(area.x + 2, y, *label, name_style); - let desc_x = area.x + 2 + 16; + buf.set_string(row_x + 2, y, *label, name_style); + let desc_x = row_x + 2 + 16; if desc_x + 4 < area.right() { let desc_style = if focused { Style::default().fg(TEXT_DIM).bg(SELECTION_BG) diff --git a/src/cortex-tui/src/interactive/state.rs b/src/cortex-tui/src/interactive/state.rs index 44b217ad..c5d5138a 100644 --- a/src/cortex-tui/src/interactive/state.rs +++ b/src/cortex-tui/src/interactive/state.rs @@ -631,6 +631,9 @@ impl InteractiveState { for (rect, filtered_idx) in &self.click_zones { if x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height { // Check if this item is selectable + if *filtered_idx >= 1000 { + return Some(*filtered_idx); + } if let Some(item) = self .filtered_indices .get(*filtered_idx) diff --git a/src/cortex-tui/src/lock_v2.rs b/src/cortex-tui/src/lock_v2.rs index 5fcaf074..52243260 100644 --- a/src/cortex-tui/src/lock_v2.rs +++ b/src/cortex-tui/src/lock_v2.rs @@ -288,6 +288,12 @@ mod tests { let low = frame.plain.find("Low Effort").expect("low"); assert!(high < med && med < low, "{}", frame.plain); assert!(frame.plain.contains("Tab"), "{}", frame.plain); + assert!(frame.plain.contains("Deepest reasoning"), "{}", frame.plain); + assert!( + frame.plain.contains("Cortex Mini 1 (medium)"), + "{}", + frame.plain + ); } #[test] diff --git a/src/cortex-tui/src/lock_v2_residual.rs b/src/cortex-tui/src/lock_v2_residual.rs index 457f1c28..20b8dd63 100644 --- a/src/cortex-tui/src/lock_v2_residual.rs +++ b/src/cortex-tui/src/lock_v2_residual.rs @@ -156,4 +156,53 @@ mod tests { assert!(think_n.plain.contains("Thinking"), "{}", think_n.plain); assert!(stop_n.plain.contains("Stopped"), "{}", stop_n.plain); } + + #[test] + fn model_picker_matches_lock_copy() { + let list = render_lock_v2_scene("model-list", 120, 40).expect("list"); + assert!( + list.plain.contains("Fast default for everyday coding"), + "{}", + list.plain + ); + assert!( + list.plain.contains("Deeper reasoning for hard changes"), + "{}", + list.plain + ); + assert!( + list.plain.contains("Longest context") && list.plain.contains("MAX"), + "{}", + list.plain + ); + assert!(list.plain.contains("current"), "{}", list.plain); + assert!(!list.plain.contains("200K ctx"), "{}", list.plain); + let lower = list.plain.to_ascii_lowercase(); + assert!(!lower.contains("claude"), "{}", list.plain); + assert!(!lower.contains("anthropic"), "{}", list.plain); + let effort = render_lock_v2_scene("model-effort-high", 120, 40).expect("effort"); + assert!( + effort + .plain + .contains("Deepest reasoning — best for hard, multi-file changes"), + "{}", + effort.plain + ); + assert!( + effort.plain.contains("Cortex Mini 1 (medium)"), + "{}", + effort.plain + ); + assert!(effort.plain.contains("Tab"), "{}", effort.plain); + let narrow = render_lock_v2_scene("model-effort-high", 40, 12).expect("narrow"); + assert!(narrow.plain.contains("High Effort"), "{}", narrow.plain); + assert!( + narrow.plain.contains("Esc") && !narrow.plain.contains("Tab:back"), + "{}", + narrow.plain + ); + let hover = render_lock_v2_scene("model-effort-hover", 120, 40).expect("hover"); + assert!(hover.plain.contains("Medium Effort"), "{}", hover.plain); + assert_ne!(effort.ansi, hover.ansi); + } } diff --git a/src/cortex-tui/src/lock_v2_scenes.rs b/src/cortex-tui/src/lock_v2_scenes.rs index 26fe4b96..07951f48 100644 --- a/src/cortex-tui/src/lock_v2_scenes.rs +++ b/src/cortex-tui/src/lock_v2_scenes.rs @@ -124,7 +124,6 @@ pub(crate) fn effort_picker( if hover_low { interactive.hovered = Some(1000 + 2); } - state.thinking_budget = Some(effort.as_str().to_ascii_lowercase()); state.enter_interactive_mode(interactive); } diff --git a/src/cortex-tui/src/providers/manager.rs b/src/cortex-tui/src/providers/manager.rs index a3efa748..dbd238fc 100644 --- a/src/cortex-tui/src/providers/manager.rs +++ b/src/cortex-tui/src/providers/manager.rs @@ -579,29 +579,14 @@ impl ProviderManager { .next_back() .unwrap_or(&self.current_model); match model_name { - n if n.contains("claude-opus-4") => "Opus 4".to_string(), - n if n.contains("claude-sonnet-4") => "Sonnet 4".to_string(), - n if n.contains("claude-3.5-sonnet") => "Sonnet 3.5".to_string(), - n if n.contains("claude-3.5-haiku") => "Haiku 3.5".to_string(), - n if n.contains("gpt-4o-mini") => "GPT-4o Mini".to_string(), - n if n.contains("gpt-4o") => "GPT-4o".to_string(), - n if n.contains("o3-mini") => "O3 Mini".to_string(), - n if n.contains("o3") => "O3".to_string(), - n if n.contains("o1-mini") => "O1 Mini".to_string(), - n if n.contains("o1") => "O1".to_string(), - n if n.contains("gemini-2.5-pro") => "Gemini 2.5".to_string(), - n if n.contains("gemini-2.0-flash") => "Gemini 2.0".to_string(), - n if n.contains("deepseek-r1") => "R1".to_string(), - n if n.contains("deepseek-chat") => "DeepSeek V3".to_string(), - n if n.contains("llama-3.3") => "Llama 3.3".to_string(), - n if n.contains("llama-3.1") => "Llama 3.1".to_string(), - _ => { - if model_name.len() > 15 { - format!("{}...", &model_name[..12]) - } else { - model_name.to_string() - } + n if n.contains("cortex-1-mini") || n.eq_ignore_ascii_case("cortex mini 1") => { + "Cortex Mini 1".to_string() + } + n if n.contains("cortex-1-max") || n.eq_ignore_ascii_case("cortex max 1") => { + "Cortex Max 1".to_string() } + n if n == "cortex-1" || n.eq_ignore_ascii_case("cortex 1") => "Cortex 1".to_string(), + _ => crate::ui::text_utils::model_display_name(&self.current_model), } } } @@ -629,7 +614,7 @@ mod tests { fn test_format_short_model() { let config = CortexConfig::default(); let mut manager = ProviderManager::new(config); - manager.current_model = "anthropic/claude-opus-4-20250514".to_string(); - assert_eq!(manager.format_short_model(), "Opus 4"); + manager.current_model = "cortex/cortex-1-mini".to_string(); + assert_eq!(manager.format_short_model(), "Cortex Mini 1"); } } diff --git a/src/cortex-tui/src/runner/event_loop/commands.rs b/src/cortex-tui/src/runner/event_loop/commands.rs index 8f8dd160..12a6820e 100644 --- a/src/cortex-tui/src/runner/event_loop/commands.rs +++ b/src/cortex-tui/src/runner/event_loop/commands.rs @@ -172,7 +172,8 @@ impl EventLoop { ModalType::Settings => { self.app_state.open_settings_modal(); } - ModalType::ModelPicker | ModalType::Effort => { + kind @ (ModalType::ModelPicker | ModalType::Effort) => { + let focus_effort = matches!(kind, ModalType::Effort); let (models, current_model) = if let Some(ref pm) = self.provider_manager { if let Ok(manager) = pm.try_read() { let models = manager.available_models(); @@ -200,11 +201,14 @@ impl EventLoop { ); } - let interactive = crate::interactive::builders::build_model_selector( + let mut interactive = crate::interactive::builders::build_model_selector( models, current_model.as_deref(), self.app_state.thinking_budget.as_deref(), ); + if focus_effort { + interactive.effort_focused = true; + } self.app_state.enter_interactive_mode(interactive); } ModalType::CommandPalette => { diff --git a/src/cortex-tui/src/runner/event_loop/mouse.rs b/src/cortex-tui/src/runner/event_loop/mouse.rs index 0a5f3727..9f8728b6 100644 --- a/src/cortex-tui/src/runner/event_loop/mouse.rs +++ b/src/cortex-tui/src/runner/event_loop/mouse.rs @@ -255,15 +255,23 @@ impl EventLoop { // Hit test using stored click zones let idx = state.hit_test(x, y)?; - // Move selection to clicked item - state.selected = idx; - state.hovered = Some(idx); - - // Get the selected item to check if it's selectable - let _item = match state.selected_item() { - Some(item) if !item.disabled && !item.is_separator => item, - _ => return None, - }; + if idx >= 1000 { + let i = idx - 1000; + if let Some((level, _, _)) = crate::interactive::EffortLevel::rows().get(i) { + state.effort = Some(*level); + state.effort_focused = true; + } + } else { + state.selected = idx; + state.hovered = Some(idx); + } + + if idx < 1000 { + let _item = match state.selected_item() { + Some(item) if !item.disabled && !item.is_separator => item, + _ => return None, + }; + } let is_multi = state.multi_select; diff --git a/src/cortex-tui/src/ui/chrome.rs b/src/cortex-tui/src/ui/chrome.rs index 62dbbeff..44879855 100644 --- a/src/cortex-tui/src/ui/chrome.rs +++ b/src/cortex-tui/src/ui/chrome.rs @@ -266,7 +266,9 @@ pub enum FooterSet { Running, Queue, ModelList, + ModelListNarrow, Effort, + EffortNarrow, Approval, Mcp, Plugins, @@ -374,6 +376,20 @@ impl FooterSet { label: "close", }, ], + Self::ModelListNarrow => &[ + FooterHint { + key: "Enter", + label: "choose", + }, + FooterHint { + key: "Tab", + label: "effort", + }, + FooterHint { + key: "Esc", + label: "close", + }, + ], Self::Effort => &[ FooterHint { key: "Enter", @@ -388,6 +404,16 @@ impl FooterSet { label: "close", }, ], + Self::EffortNarrow => &[ + FooterHint { + key: "Enter", + label: "apply", + }, + FooterHint { + key: "Esc", + label: "close", + }, + ], Self::Approval => &[ FooterHint { key: "↑↓", diff --git a/src/cortex-tui/src/ui/text_utils.rs b/src/cortex-tui/src/ui/text_utils.rs index f911cc8a..215de598 100644 --- a/src/cortex-tui/src/ui/text_utils.rs +++ b/src/cortex-tui/src/ui/text_utils.rs @@ -428,6 +428,9 @@ pub fn model_display_name(id: &str) -> String { let slug = id.rsplit('/').next().unwrap_or(id).trim(); if slug.is_empty() || !slug.contains('-') { + if contains_foreign_brand(id) || contains_foreign_brand(slug) { + return "Custom model".to_string(); + } return slug.to_string(); } let parts: Vec<&str> = slug.split('-').filter(|p| !p.is_empty()).collect(); @@ -443,11 +446,37 @@ pub fn model_display_name(id: &str) -> String { format!("Cortex {} {generation}", variants.join(" ")) }; } - parts + let pretty = parts .iter() .map(|p| capitalize(p)) .collect::>() - .join(" ") + .join(" "); + if contains_foreign_brand(id) || contains_foreign_brand(&pretty) { + "Custom model".to_string() + } else { + pretty + } +} + +/// True when copy names a third-party catalog we do not show in Cortex chrome. +pub fn contains_foreign_brand(text: &str) -> bool { + let lower = text.to_ascii_lowercase(); + [ + "anthropic", + "openai", + "claude", + "gpt-4", + "gpt-3", + "gpt4", + "gemini", + "llama", + "mistral", + "deepseek", + "sonnet", + "haiku", + ] + .iter() + .any(|needle| lower.contains(needle)) } #[cfg(test)] @@ -822,5 +851,9 @@ mod tests { // No hyphenated slug ever reaches the screen. assert_eq!(model_display_name("some-other-model"), "Some Other Model"); assert!(!model_display_name("cortex-1-mini").contains('-')); + assert_eq!( + model_display_name("anthropic/claude-opus-4"), + "Custom model" + ); } } diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index ae7bd3d4..59437051 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -769,11 +769,19 @@ impl<'a> MinimalSessionView<'a> { } if let Some(state) = self.app_state.get_interactive_state() { if state.effort_focused { - return FooterSet::Effort; + return if area_is_narrow(width) { + FooterSet::EffortNarrow + } else { + FooterSet::Effort + }; } let title = state.title.to_ascii_lowercase(); if title.contains("model") { - return FooterSet::ModelList; + return if area_is_narrow(width) { + FooterSet::ModelListNarrow + } else { + FooterSet::ModelList + }; } if title.contains("mcp") { return FooterSet::Mcp; From 9df0532814a51c7733a000191e02786e293cf652 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:16:53 +0000 Subject: [PATCH 04/15] chore(tui): recapture /model effort lock pngs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Runtime 40×12 and 120×40 hashes after COR-13 /model residual. Co-authored-by: Mathis --- .../runtime/120x40/model-effort-high.png | Bin 17385 -> 17415 bytes .../runtime/120x40/model-effort-hover.png | Bin 17471 -> 17508 bytes .../runtime/120x40/model-effort-low.png | Bin 17359 -> 17404 bytes .../runtime/120x40/model-effort-medium.png | Bin 17386 -> 17412 bytes .../runtime/120x40/model-list-hover.png | Bin 16622 -> 17233 bytes .../tui-lock-v2/runtime/120x40/model-list.png | Bin 16547 -> 17139 bytes .../runtime/40x12/model-effort-high.png | Bin 4578 -> 4450 bytes .../tui-lock-v2/runtime/40x12/model-list.png | Bin 4246 -> 4264 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/media/tui-lock-v2/runtime/120x40/model-effort-high.png b/docs/media/tui-lock-v2/runtime/120x40/model-effort-high.png index 3173d633c5ce4d9227b3537c10fef2ef86543191..46e3945c142b3aebd0d7ccef47b36a3e9980e259 100644 GIT binary patch literal 17415 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 CX2%}@ literal 17385 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 Orl)0exBT{l=l=`um6h%Q diff --git a/docs/media/tui-lock-v2/runtime/120x40/model-effort-hover.png b/docs/media/tui-lock-v2/runtime/120x40/model-effort-hover.png index f2555bcc5af85bcea5e6810bbc9442a8f88a57d0..039623335be5429a7289f70ee0e96a53c8dac42d 100644 GIT binary patch delta 13584 zcmaibc|4Tw_xGSp3zd+vd`bw}vyA4KdOa{-b@Avn-ey``B=l;jbeP8Rj&hyOdnc$GZ1mJZL8fsU|!^+^z0&uh8eRg?inh z>f?XG>pvQ&SBKkNTmL?4=`kOWeuh;K_*xcH!v=vsLb-*s&>H)cFO=q3SAKHTGWZUX zEPExwBtd-MO=p`KxP3*-J8?Gf?5dp$yFmhVIIr$A&rt~E>+9ad6_asdjM7dtd1A)A%eS*8w z*Y2wv^poZ9#LSc~mv5n~wDSp1bA78su4%ZW{C)o`J*#9z0LI+@xl+$;GP`xw7y^lo zuM|xx(A~dKCXRwYy68jZb!+*LFN@V_;!iT)-aD1g=^yK?)W(pQu8i=A;R0v-5aS?C zd8R$&%)7Bs`{+PE*_Nxjjb7l_bh&F)X0;T@sfCWcKg;hAgPZ#LLI|<#ivQzm84t=g znpcc?2pr=$yBOHd@?cw#@&!=J@r=D4Dy(@Xj#J3)DA=t%t8=Fe5ZI?RcQPKO*PIjq zG6NC&yIZ)&`rs&%j1?F{Bk}a_&kNmbi8wc|KEV*ng6e*86g1skjIq@6GE8E}K{Zmd zT74g!?w@Z5qx_?BLM(=KD&4$45JJ>n{wYU{l-M!!bosW?6UT`wod@>OC&B$qiXbn0 zCTsL*X@wcGwpu%z`)EaO%iaMPXGN!yPuTL0pS)I3-CE@YE+ZQC>%lgK{3U{H`<>Ra z=%?VB1vAFZl8#Y4-uiYou_W|zJVj#Y;C2qhz`M;jU9G}%6l_!2DK(B0Vl&{v;=e@d z!{uxXn4Wj+9%mj=IvQnEftDJ2?JtiSkF*2j)UqJ_lEfNuk` z%DzNoatp;OgNOBbX`}St{&X*JPZ{^X13$y+4*WCMHo=mywl+F5{YIu}K9;+1A1KKQ zhr8udw^?>_oPXZ!Uef~yRT;FdVYAs>8@2x@uH;hxVF={;M#m$_iP#J>sjPY6O#PZq z%@Ku*KJObyuSwg&j}+S3ArP73wwQ(`$aKkSSl)-0hiM-&zg*xrm{ zKf(3yH2ct#vg#+#+Xfk;aVD{xaX^;9Xu|xwV{C3CyZxN5d%N!?5g~AyuY~4|DrzK< z4&Ob(>G~YJ=MgT7d+d`jzdo2rwDyHhYWqs=g6+iEy;$UA9Kcc-rd;m-A$zJ=;16-s*6t*vB{8Ll(6`TAXGqmQ?9hp1+%q6t z+hj1Nef*=wRUzMQ8LgW@qASU^&diYo`ddrh$x0_?E}@wNgi{*k1O$TSOW{Eck-hPH%V$x$4$$)9pe;4Pii@ zZH50TH0<+3Lp9h$Tg&yb0{5mNZ_0(8i<1e9h|Igx&=3%!H^AcrZ+KZYc*DzTV%d&a zhwEyHB7H;NJXRYc?$OsmAFjJh)-r2a&{KeC$xyJSW`fO^j_|v}m5aNM>K+ka#8G-t zf-;bA)7|23WO&LN&ZJP|@$7O2E|5Uo8fXnmwRP4uR40v3D7{DtJ3n^;79{k7-TNH@ zS+3+;VX#wi+&tQ#w6}Dn=oNdKPNWMv*uZj*ZI}5oLhe#k{ucPZj-wq-ype4VlO@uAtyoA5dg zA2XQ83c8}XGdE>UltL+8It=-tZ>W<)#fdGMq!TmHfn|6RQDoR1auOF zL{Gx3c2D7^vDdp>eJyCcFfZSB>8o$cdzLhwh40u`F21ij!3ufxDl9y#ueF70cl7Qg z!TFt7Qt%N7M5)00z%E5|wOVw0Pp+Jw=KHJT#y`MIu(tpr%goB=ciIdMAn!YutRi*# zZmmf8PkP+FlIEECyYk(gF3{}tMuK`=nd6n%?+2=@Z0NjdG;h#{f4jZ9a7-FF#Aq)k z1kyO}*bNnQ$~SR3Wk`46&$j=P8l2f~wfz=jMFM!{i*J#jn25s?@+S-+Z8mryDPyvtHd6H(UElj9)q^buN;n<^DhR9wQQy8MM2xM5wgEgM*{XXl{-1o zPqK*sx+?jJ`KQK*`YV*OgZ$f)J4}rr5Z1opXTX-p{)PWSOm*rMIeW^wn~|X<70kqG zWACcnIOZXK>&^76lC1Fc`jwL1I7QH~pB}~L4@+kuxyBb_n}6)iIeZW;Qv~;#Grvd1 zKi;^8bV^n>%xSv7rQI?T9&V^o^chGF-h^uAa#>dSr=MahZOsFnp*9J6iWcXjTX7vM zkS^O8^G}P1*2VW2827US=s)4HG|<7I$$c1@N+kJfB_66&xi)(KXj79;YB`VIQa33s z!YfI)3Euv`|LW<%D`U(FP?;Sk-uDxW@@1&GUYR(~^oF4vzE&s{o+69{w^40o0hRgUE&nB?fzVjqH}7_c^+y8?0tpP3li9NXfJ-{&s0{+=~4%3uHBq$9WNM zpSS)&>0Pk;M@3n;)|}IQoqfTzOR!K)x?;C2?8y(e+;q+qpx4aU&_eOyy8P>=6(Pi< z)!Io2Xn_eKmDbO!ekxv8_FqCgj1ZjEntLQV_=vZ%Q`pMuz8L2-0tC7e` zsoI9z7rlOMt$Mx&?iQc9^9N6ZuqE;Hq5jIZ9CjoWwE^wDeyI|jU$PSF654>v0)3@4 zdS;+B@Rt7`?Iq|^b-PCsUAqR-+?S#d@{uachF>{O%)Q_8gC$0jOG+0=jwi$!SHT_b z{s_?bwccR2eovqvQ@2_bcuT4GtE9ankRr!M> zJ)e=rPyGB=uu|_2F6K5hz3Iqf-nme9!Ib{uN9P=p5RXo-oP;EzeFeHq(yPy?9)*zr z1cS+wzH&wuK*PYdCovvXbrkAWn|gzk@cFS<&H}}uY9@PEAzdsW1c2w$o5B-&^n4tr zuSe{hXMQu`EY{<3L@HWYI|1tD(!F9gP7Gqr*Ww-WdYf5bfK+&<(!N3{^-Y*~YetoT z29=$4Bd9+io)Sw4HoBQOtMs){4jllqNa!U@0G+q;HYhQq{NTW?&8i_c{O0|4t7bLt z_{Nz<_ac6gk25HB)MJqHMKE^M4(BnJ>AxsyVt?xB>DrA%>9oKsZg|y3sQNlJj#VUu zHooAzLOFLnASn<-@4FgLHBBvzQdJ>`d+FQv@O@}{s%ShTDrH+j7?P;W;)IwG&&kn% z*8XjZ7_LzJ_oEIk6);v(5VE(w&M10M|83_gNZHk+o#NFpe12()5Yf?Pnsd#Ozs<%s zCP$ZGAM^w*(yym@(mzS7J;kq&r_*1h@*T5$VrfqDH0?^xfS`SebMF`Eabo!b9!I_S zIK2Pa(Mk@z7AtDbwR6$2|Aivpe`Ap&TJpY247_OP&y7M%$YirdGZtf+q1f?rR*hHM zOJ*q(X-=*AQS#d?Z!4<{b9VAdeIp^?b5y@g&+x|8vtBv|0rBGXq3EHVE09meC^4mJ zA2ic@E?hx6Ry`=TMdsh0$XL2a<03|f6|Qlp+;QIYJpln!Y{=$$37DltWrLC9>T_LW z?e5lpD0Fqq4H4pPpR4kZSLK~*6pfoZY0+(;p+(^d6bECx7)wjjg6-_KFVQBVgpM2Cr(BMD z-}3+l`SWi3a?#941|IbSMPjcd;qZh@joYp_yH`EO=U1zTj!{;c=$ezOBl>jX-&J{o zt&SOAt%&{x-s^p@!lOvx@yZ6U6?MSZm-#sk3QN(r^%8P-LLIG6a+nQCx95Hf;8mlG zY}8MIp8s0vpoV+?AqDmpzw!jdKA6gn5*CG1YMJe7Bu~EMxgo8A42Ek7rXmF2R1+-g z{Ozu^V0eI+=Iqm)WserNE6&~tpC)QzmUXK%qEKASv7Ly=zF6tF71+LY_d8zbAFi^! zgqPH+3D8l21R7E8kFJ6d0I#!-pgAMrD&-ZYcBwBCYuirDiC4rX9T{@A>2@##@*OWJau+eC9qqZ1mE zu`XfmbMXU#*AG7=}bgk z9s9`Vj&%hLxI=59IuvweJ%0M5Ba>OO%cpV}@V)=tgWby|c7%KmwfgI=ez)nfveOj9 z4<~S6J|nT&@N)|ZNhx9PuX?_juFWA)dRO8l>N{ya4Ii8E7}%KC)v#{$=kHvU4pXSC z97#s_V@$c#Z-k5k`SlO2Z+m;`mr4d=TZM}66#3Dc{T|R_Bv(D24J})?5Mto2)r3dI zPJ`kmc z{(98+ZJCbjEoB%rLO+{QuP!!PYSe@~b`OJrD_(%#5)0&>ZN2_&TcMP3xV}nrYH3#M zRde=GhyDRLe4Nqc3GEB!Sf(B4x4q3AAzSMhm-WZMM|TmNfIru^r%1cM1_(&aNr{ZT z;sp_z<3i7-Bl$A@tQ!V2m$4Ss-}N__EB%%!wmB z4W3g#P7j^T|Bnn}@ki(PbGv0fb}&k7a0j_{VlT3{*p` z{my!mH}|P&gsoE~u)~z(E)*S;AS0cuuaJQS{3PfaxmH^`J_6XrPt8C7j@RTpMvi{r ze{}0ZAPk1!5WVKF$dDBy52Pgs6%Xb}?q*h7!#wQARd`wDgo2BDEa^FcqJUVVm9h1o z#Q1mNz=e>^QA*6}3*RjY!+D~gG)$D<3hRlgXERQ(-3%E{)v&5FfM-?dCnu~J1I@^% z$lEFGV!M*`(k|QUv-7;(#PdeU-R&dhvjUr8v4UKd`+8-S>6??9mP_v}Q%s8}h)F*8 zBf-#J1*Bep{R_!ot`Y*fYeqfhYZ3v=od1kp?D(-_2qkRauSMz7tj#S}9BF%zD5 zboKI*z^>KqQg}p$48O-mLr-Rsc7^;X>m+mac5fZ-R`;>&+4f=92{(iLl<9d9|08$X z7s(VC8y$n_XW%g z#&%Y#gIl9W$ z7!94tk_z)T{n)mQQ9j&OdpqBtZYX2g@<#J90N&8jIFPMDO!EbbHqKYr4Y%|ymeQAo z#AVAC0nJVsKko4t$%udZi=MLE(KiQ-mK<+!)iURt_*mKR=*UKVVXy9lBFyS2W0H$G z{##^b>5^2NKRS(8ytF9zGdiL>d}WprmI1f*eIyid-0K37KXG4GQ!vF5Kf2nq286gb z%^}s!Krde6w{%H~m8sv_!+1wn{hFJ<47U&kp8b-7zNT2H{(;t{Hg(ETTq@F1pj+@{ z(+bTg9JFOib*hIBbqE4CSaZf4hK2_^{9^8t43f2uN3=y1X_Q%@>3?Y3;fj%I{P1?< zGTZ}Z(!r`H?Z|8sD!Tu8~;q}i&!E_FT`!P>!7u>v|*26LOgQ!Y2dpbM{+a7SJG&@=`AEE$PQ2PL=fX z#dGL#OPCgk&Iq@Tb>F=2a0~Gv6kV*HH`uvTu<>SZ2R^k^WwxoyJ&%nT{UT^blBHZE z`iXc(@9C>{#%C&OwHy|Mw%g%eXJo4$y);Ny&>gq>%&?yz&VK|)hyt97mQnB^j3u=$ zZ9GB3A*iV4K_dPFu{xymVn{(*k3I)LH&e=C^HXwJtJ~-srw32-QjKq2PZVSPh;#p4 z^K9m`UlK>0P>=QSWt!cn@wk;g_g;Fc6?vuX(sx6hnQ9RSx~qJIF&3o}1oVs+)?M;X z3EyiIvZ4kw#O4G`13`ytdBW=zpyNF88 ziL8rcDqn@_tqLleYQ8RT|5c;fxwtx<;+N!zqOPz#_J_w0O|_3Xza0pZN%gw#Iew43 zH9l)eDPp`WEWR^77}c3daY;tQyB1b<+ZwE3gT3`j{vlI$Cn1^?OgGn{3~H@m zHy&?u66OW%-p8F6wR`q()mHZj(tT{)vhg-1Dj@&vI?MM))#I4&6l>Gq`{8oR22~3V z_@0H~;EtWU8uRp(=StkwjGbmQxWoRa4_89R_0xpOD8M+w}b*>1~YsTke3OQzZ2Twp9JIx7wb#& zK_J-LI&st*>2{lZ{1dvM_@&CrY9l3zO8sYL;2`b$?a@YNAP4BV*QVAE`Ew;M3uN22 z5y0^7QB>P6U&c5lG5u};%2kFG=9-GNC%Rie`Wuq zp`C9GWrLj2-n`k6aS{SR3YLHK8K*glzLPt040K-u-^VogNVtu-!?0;O%TNf&6OW3c zQgI?!Dzz@8e?BlJt%$=Y84BjSlEM|5!BC&)k!p8q=#~~D0k^uJ(l5NKCX&EDIDI^o zs%I4O@9)JBwcx4QVtpley|xS8jUyXr4qGb(Es9KS-5IQ5ZyU3>Xlf9U8cI!$q#J`F z?6Ep?#l*lQ6bbre5lpxJ_zW7(bLk2(Huh7_r&etDOjSB+!heG+3-pOfI!K@f@|`tS zU01#F5j2usK-Wre+Z;$Nkk;-CfU9ed2lZn+L0dGib3Vjh%~q?u(H>V1e={WWI+hq1 z!%1af3xHu$$OFB8o>sS@C&X~3s(Y8on`SgprnEwQA zt|1vET<>d4uiZ_md$@LWaf1?QF95s+NtM~$w__l=Xe(S96ZtlD-1j?P?YIX2eAvmT z-&BGhNOI??n0G^4=BfR-GyxxnFGoh-T&QbpvW&#^KuDqKJGVV766CJvp=|8_$pHrM z;*ZZ-dhYG@2|aVSGvhf9=~^>ZD&4HW*;8UHF3H30BwZa=sn_OksN2*RiSsvBuhl4V zh_r{_XMx=R4O093#kfy`Ape&DdTH`1p4}zyi1(5vSZM8Si7SZmziwk?KYkGijC-9shNRXDQI2z z3a>uvV-3L+%*cXi@3m>mU$y%E%Nv_fU=}R9>3pnifHdX*p9HWJ8?&ig z1L-LIhUGHkN5+Ai2M!XGGK<@TMkCXu4S#(8`jih7 zw-8}rrDE={a^pNGs#FD|3ZsEPJj%Jid1N1Zi0 zpXnVFHm_#*lJNQ1=Z>e$Z%{{PPZCjlUb z3&!><>`sF{PLndseGD|TRfEJ3SV?a{Nqz9>k&N;EK`=g{l8ZD)tE(YtCB+=~%#hO;;TAguObG zn?p(T@3ihXbeJw8{%*o~p^Ck&51YdnaezSaZKk+JJ(@(tYIuya`=-XsTq$dgOQE`9 zQswZgK6p9E@jsPdObtE`qu^!auO!|lc#adfvGN?YGmH6q;94R{go}D5*H&yX)Ag=) zmwF9snC-U*!8>YwM@5XwoWht{n8kOEO)yUentk*501N%;#!kG|Gm?{ryNWd&$td z6c+4@PUHPDZ`n<5(%VeRA#}8!ixzb7*Iyy&MKo8Q!?naWPO=^rtjE~KQ18KiKU~g4 zx|B#wul^(-tr50Z^UYztQIAu?5w6s1REsa>ffPh! z#whfCG%=0k>Ktg4m9J#*&sFK~sYX)IwE?JGbh8BHTHI>v_WZ7aDxkg7ukfkC9bY#Prf%vY_#|Gq6hz$0am`5%SSoYAt*YXZNJPUsUG`Tug zhzN7%t}>3-&Yj{>{CQC(l!FzC9oJQXXGB%tw5U&LOjq!ZdLU^UV~f48+oM-27*ZbGJn0o#QgC`;6SH;TI#Cc5hoU*UpAuk z_!IUkKf7VrdkdGnOhuc8BPf7*ugsif(4dBGX<1@g@pK~e(ziRgZ2^Z2(90rIQz?6{ zAv3vg;&1IICbNf{;;E1XYLj@*=BI4_=TM3)cbL4o(_(8;7zgXumuIm1!$7U#gAdVF zcI}vpox7KV(m_iOGqb`9K0D#3qW_f$=>>xfikn+)s?trwlxaI*8VE+~R}xUQ8LN#M zj>|CV!{0(dEc{xG*%rfF(H&DuT^ z-;RNn^1sjOLU8BxAK9JEdr2w*%`;TQR@mdQCox`SLCzpBL1IFv(Z>t>d-GMJY zT5p~HX?H&QefxC~h@++3frBIfldiRQkTRy11YYO?%D8Kx(7QFOl5Q>cBfM1;%1!jZbQT1LV7J)TE&xc7F(_UCx zB^$RJ63>*NyUod$?S=nc zOT&wDz0GW&z`CN$pWU$_0k!^x!HI7Agln!2V^8xMVyh~7LW?;IteO0LbxEiiP)o(G@rxBjYQqG7gz}-aKlzo`|4blD=%*)X% z8h*_@y#kA%Pq`(y8$m~L@rI6SsoU0xvx`VYfv@vvdITl+QOQ4kkFDGCSiZJ)6cUjh z`7}LM19tVZxeC|A`&`Er`XZNq=>k5;94XDO+@X^dOUYN%Jy6@mZyBnssUnz2CuxVE zHTk2ddae%&8v7T|l6|ryz__RP#?ckSGJ~FIjwYBiUOnMQBHT+skwvb_ZW*JlM{@OdGGm)V0mhl z$?vp!J$8|l-d`4RQN>Q^=9=Quv{yl}U5V~}I%(Nm%S&6#;BU3mF|~|vOqVXG z?<^%qTX_gTCcn=SP9Xrs7w3uRq%38f&^{0L+YP?wmKDc+-<(k1dlqsEG|;p=>S4_9@6IbOw9Ewn zbZfw}!UJrP?De0||4-q7wgRxfire4h+-JgSiYF zu-&t=n$4*pS#U8<&RGoMjqt;VUL2jS8Q%w|a;j&Vl?s^4yVC?mfczBqlgZZb zfz~%ss_uh$(p5;{Wtoh?+93x4ash{=;a;aj5(!AIvH?*e?7{F#S;RSMMtHY^1U}1H z(-~QARks-3EB;B29w0p=-s)tLZ@|`f@wdj4{D^bTbPpOPV*ulU#l-r;&E4Njs~J6{ zn%dZ(o0K4`1IHz2#7H7S^MQkpOY^02N8$1~XUJ_DnEb#OHlCcxEZlXy^18N{m2-0O zLibiiFI6QW1N1d&$M?v7_TuEBQ(XGVvn7OK=WEct9<+#9wpAs;dS){m%)7G4T<>OF z7i44h2<_FYxJ=qlH}TLSe{QGGpqwsjG%{B9JiY^K$J6T=MFwI*M~?Gz%4A4E{T|o| zLn{aT;aTLdwpRb-ZH>?3VR+Ge``+yK=GSNKgb|-YrE;G1E0^{Ew)B~~j8BRw9K}J8 zb@_(ZfN3;(9xg!2Y0hndHqnm)Us&k<^kj%Xe-r4k#rlbf?H*UtUuUsUjx3Av+Ud)d9CM)?u?Q{57oy>~GH&COl)FhvQWN!sfk92PL%J_U@;TL8qS*PVDhx#YWK-72t>i%BU z-@4&I+5eR5=9q!(i1s;iAC}bAbHMZF9WT?o9k7^~p#_FC0?yQrnV@Td#J>P|?hUAe zk=c*0FSrgaPk8Wqaa6kL5atlRR}SY|z!>RzS(UcE8!G=DO+@1M$xX{H>%{PwtfUABkcjZ2AkTwJBtjT_FX`Q!*=ewCrWh=~1eCXDP;0H^=s`XA)u5FkdX3+h?nXLk`W z0kEgGLUx|niHKcr+Z@-TwpeN#n$?6^SoG3o)aQUI>y74lL4^&zRr%5-3a&%>Z-tD-<-e|8{Ef1) z@E08DHM@Vn^6dVqJgX87 zy?}gDI9+L~;Ic%A+;>ox=(<s4Yjd1Sl6-TK?V>l5sz0zmYDE=jdo(Tf1`8qQBS* z@~bG+l`7F`Vc$Du*);j@3YhE$i&6aS`Q22hEu%NJ)Y617Di_tMhGQS?jO{-u%v66? z084x7fgTU_RaVxWwDfw%f2L+i33~{}tY>WCnQ<;GtaEpw8dS8}OD`=BiOx!Uo=AAH zyuifdq_K^g-nXU;Rktqi-;6?@FzvWa|Z9ACIpm9Z4^{rMT=gK`*Nt|DAD zV_V#(+ba^o8(RERN^Kjtb#eS^Q^vwmBnbmFTBf7o*(o9OQOdviSkj-eK>o3DakFS6b7=B;A{{a;j1i#8^cqP0I> zhsd(x^8M!7-*&5{am!SQHFRgdvH|IbAQ5I-uHM{$*!t_k~&>Qth#p@uw3t@;h0RV zuUM#mewYI`!sdWL>*830dg-ilO-8;W^v+K{kKFfH&vlVkA{dNSHpskykN$^2n}x$2=CTLv z9X|7MHPjD?g&w4_ynvQyFk%OP7vU>#m{Lpui>N1d7DT`#NG}fL4+ulT%0DL-o%X?U zn%?oV)r#v7=7+aRT`+VvNw*)I`DZ4Uq0PS(8e=PWz@oPs&L|FW)@WY| zt!}8w&bCK~>#MihjeW2E;e8T6t(n|&Pt70FlRlMWQlD59#3%gKDq-0$E0&^kl&pQkE(re9jXOf@Rq{TcieX#w zu!9GNcv3>DlIhRJ>h)v#_?ku;VJ~Y5Bq}n-do!lHxL)K}-3quk;o(raRBo(eFYq-j z!GNS?2v||KMSsB-N08wO7ysyDp*iqZ_9(FSGgm?snUcyFVZ55!MHEGb?hljm@}G&> z@N=`L_;O<|eMv^g%t(~IUf5EewaQ1`)RnJ>GT|Nm>v9)(1)satEUxa6Z)T1zE8)Hd z;_m!bU(?fSUy01w%~3c9i4N5>sSs$Jr+OCyKE#@(@75RtHv3b`9htwQmF+`Uu7V?r zNeYU=XlN(oY5SXK+l<^OVa8XyZB-#2w3{BIlF3UG` z%ASb)SZl2WYmAXT2gDu`d>NoP1{L>O$9yRS3(?Wu(C*x8?5Ay-yodQ94f%7!-270gQp{h1hr;nuUulO+Hgyo-uje3MV=lB zwC4^Z4)vSBaQl4*%NqCbl&Yrzci5sx!ICr2VucIUAM#DXc~TIQ)1OmoTvY@h-$J?d zR461rIr}8864Y9{KIu{ZRtGT-_!O+6V@2-^d3TEUd!vU-NHA)VoX3utT-|@%^;z)A zcE=e)ur)DP{NeUVjkgrP+S9zXI{lD~?d zd+?hekUuo>M0)^QuE~Ascv2bk6ht+-KX!-J{8yhISoXsXMofZ`SI#Jo!Jx CW9o$f delta 13546 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/model-effort-low.png b/docs/media/tui-lock-v2/runtime/120x40/model-effort-low.png index a5be25937f357dfb9f5a9ce792fc87efe87c92f4..7e13dee79aec1f377899118788e46d1c48a3f3f5 100644 GIT binary patch delta 14133 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 delta 14092 zcmeHu_g7P0w{8RxQHqL)AcBH`^j<>sRRQVJJ4g|v!~l_AHY$QjlimWThzJNlAoLK5 zfKf=KMv9>)QbLs;;BMaUoO{o>|G^#O?q5>&YJ06&o;l~UX|X2=u_xZ#u*uN9`;U1r zlKQ*6YW7>U^rQ;aogtjQL$zJ|V@D?JE4T6`amV4$s7d>Os@=Qzd@p|%$dKS`>^bkM z_Um({=6%&FZOsz%!<%NMlvgJP1VuJ1M2iaRWQ!Vqr=F+N0p1$J%jqEyNH9kMwpsIt zGDh5vapobrE`t9-5~Xj18OMoCxZK{M`R?4%^o$?(y|8NgfJr}Yr7wr=VI0`=&rg^2 zz{)C_X#GWJ0Isck0s_f*IklHqz}{rjhj`)f036qNm`w^}K@t!^LLjYWf2MG_q<3eztAuXtw^Ova9Z87%W2S&x$$q0T({g@C~0kYeagAQ=RsKv z0g+>R76Q3%)keADNZP7=a(9Z+z*%p92HxtW6xIiq+o_@HWG4}G9vma;$;M}?NYAy0E#l6D3LW zaEAx@bP@uoPr=gWlR8dMRftQfweE;3IxqQI4dFtOrnz#^z!X&C+3eyfLQw~$n#RncrB(u2bHX>o9eZLGf~ur#Pflj@^q07a1Xp* zhO8Om5m`lpr{4~Upf~$9Q{BPUKfB~Ki?GXCZ&dsesMe++?b48St_#~0C`k?aCurU~ zdSig#mBzE{Jc$7JxH`8ubCW#Xk}k2_w9+DGH<=vMW_&C*t>ea;2Q}UYE&mEuJu?&K zNT&H%IxJa=rC3z*)xd*&D=vTpmCFs7C)qOI@1jVpc*nIwMDSS#A08#UEcCvDwahRs zxkeVFnS0eXR4~~PUm4H5n&`__|j`d$WxW~GHIz=5WMRaA&86<(HT*j1x>)}PHA<}U z;098LtlC3z=a4!d-%gFYBRpfVS8b*8xyxlpU#-|65Z@E(8XZtIzToiT^N~@$ex4=8 zTw>}?)+@>1vQmVx1gH%)D(Eg~d{_dM+IP)q56g3h#08}iY^H)YZ>t1*sQTDJAlLfs z79kZ~AMS%EEX?F_LPp9S6s2H=Jfji@@W8x)x1Z{UPte+D*6M#h-rkR(5!Qr@c$7eeOMDFkLTB|r+Z=qEQ!Y}R9!eQuIjT%-+ zut_S79rCs`WSA3M6O8d3VyG?U1U@E#2G_AOe4P$*3*J@u0<@3aNta?6FUPV0-fl6! z-E->(1d$v2gA|FS@b7CWUnVB3x*hN=sG;L#oyp0IH*dx3W*Yk02gA2O`vX^VBZaiUDGe;k5vlXLVi@fq%FP#XI;?Gz8#e8zK4YQB4ZE&qC^JeP3to zjvuSPhw-&-l{q=&_P)CRV@J1P&U5U9U^Lor+Lc$kt}Az3$K|%|XC>j%UR%+0wMzqd z??seW`T%}y>?2w`68m~Z8hRl5F^_Srm;-W4%zI>JmC&2H-BbM?pv2-v+N*tQoLSU`kl6yRUB-#;@{B)p3|4f!fk0#n`t1!Yg|Rj%mXq_R6dA!b zMdmpM*7j>9#f*SADe8H3-R$C@VgdvrE}Gw&Fu^ex^4fZMzF-O&9vLp3H`wxtRQ5b) z@QO_se1QrlyVl`$LrOwVKpHQko+GQp+URXS0-2>?kVH>L2Mh~9C#HjGLldqT0HLPc*+7V7Z_{A4x6%CAUB_ z64deXEuLq@+>H2Zo#G0~Mbi0yaE%#CN4zC0^L6;^3$Zpso7b@+@!0g@-vnehW;s9h&Zfk z7!5C@9PK-TKJv8kT-vB9+c`Yt+16^~D8J44=th~haYa}252Z*Ea0u!}0puM?b1yZR zU*ew=n_YMNpZj`$h0}rC?FyhK%YFPNBDNhy=)lGQ`T8IC!InM^jy&0^dyJPp-9E+_ zw>bWT5O#j4M72lK*1E^2Tk`|Om|SL|v6#$2v3FM+MX~J3IzW}}1JFZC&QBa3Xm%gb zeiR&D{=clx<$s-1e{Xfm4p7v&Xjmp$Y2i)-4Y4AZ(v{NOBr}-g+-Ts{h{7BQ$~U%*aPiH55{!&*}Nn7 z{)&9eQz~>2hYFW=vcUWHn;M=N8hL}#CIjpa@X^oPC}ViwS<)~-K`6?%X!CEDuSWV+ z>JlPcR=Cu1Oz6t`5QuyH)+#S0d40NR?_Ur>4?5k`#V>J8vu6JdFgBSf#l{6>*C)x< zT-{@l+)U1qWeqS?f7(#uJs~ z6D~obqI`|ApyzCxk*1*r%5cob7is>jYgdbbIOBrvY$qVf24u6GINZXll79c0&+?Vf zKi+y&m?vxb*K5}RZEw3+Ee-fhCoga>nx_STH#2l$S4hp98NPV4-f1S?f_a;wPyUV> z18x~B?if##1Z?N&lRrHsKxtTVaipbg@VJX8(EWL$2O~!Slb)E~ctP3+r=o(Ed-&zj zWqd^}uNYdp?M`J``2{+9$fSZq%Qs4`{9FLcg&O?K`@vU#nd|XD0@Z$KVl{lhJKCX| zbh58gR+x|X=yhJ!C$B%V4{yW9G-(Ty4qr|{T3_`H{0K$(O?;FeN|1Y8(58&;Ur0$uu z;F`o|Wql~nIi866@-OU}hJ8PXbh7tY4_PbKPuG-e@agfW3%==8-jKhaTU+csMozOS zjVArE(iz@2|FDHi-{nZW3bBYdT-P|H)S*_M7Hx1$|B$j|?0DP~=7enzl%D-Dv6MBF{THp_k%nCPlKnJNN;7=>MQ8%rjB*ys6F! zcB!dWC+V6@{#zMtCH0>O&~%Ca!U~Ol8j)C6bdCthm3kDg9gpxNpf`c=PbLT z?wMpj^Wx1ABOc+zWe>Oh+eQPpge8~+o1^|Rloq9=}j^RXph zf)0lSpDBKsO;GRB)C}1=>5tk_?+9u7oxl5Q^gZqqHH!>|YY7Kr_BYp^G|FfddRnwelFzjqRd?aO zovh4m>u+Z8v~v+g5!?$>yb$2e|*-yO75qxd&!FtwsN2-96F zXBO17#23>DzLrC)U*2~Uh8Gqn8a_O;%4A&sYOTWi97coz4r(mXl2%hF_n1~O3iYVi zB=?sBlEbcxdHay&w5(`p3be;Ghp|#0G<0zxKazvA6qZ>z`TpiCnTO*xO!8(ezc)kU z;AJ5`-l#?gnnzE?96_B`?K!8Jf7|Fb@An$m_Of}~fONyJS+{_-f>;OZX~K)?>kMa5 z2lpS{R^^;ey_y(C|1+tRb9X%BV{?V!=c~qm?^U2>i}hV68+(jW*{(@Rx4HMDqzXx3~K>P^|TvzxKf=m`m15_xtqs){^6$3>ZL zL9<4QN8sgrDjcgH`3gN@0^L{3$HCiG7%aa34i0oeu#bauH)M}v)c?9tx#=8%H?wQO zYP?CqCij1oU7fHRbJFWWJen&HfM6?wxyM(wX9Tjtx)hn*FZhn!=k$)B@cpSv@6H`4 z8WPmiD|=CP#eZsjqvKwx*-8b>j{2ab^_{)i-*J3+J);Z}=gWAnrT@~aayuqsf@RpA zm+(%>_BI_6>A*TRafpg`mGb`!2pb)6UY`KLCAcVGLq0pk)w8MRUmapkon}r`81yjj zl?W7u1*ji5DJf@3`oU0v;Z86>qzFdngFD$fF?m$osyzn{@rTXNZaA3Pkj+Fc2w9yZ zcMB0r@8vi0RO{r*T|wB+)cT(m(keedv`kejT)2zhh_}zN_Y60WTLf;@ZP-pF%TTtr zb}eVJVp*X_tC#vh6t{!q$g?GWo>tZ9qBTLvJq=Em_qI(&T~3_LpfEa`3BuO*VP4 z$nur8GqSUR6HZ3om3%D@^%z5@AXpz_==1LT_w=De-<7jIYPIbCGqg}{pOlbq{R?>~-&p!%@-x^ij4-)lm*Tw~ZR_QFbS}HRKf`$G zSKvk{N9~AZGBE)&mXX445j?-6Tmj<%U=w30Yl5+8744!u3;aakx1wa0T!iH8&B&8- z+dS!B%nV8vK_|CUjN9)% z%i@;9CXB`3XsG^3b?xD`*qgyz?nq8q{5>ve?~gw`Rofe1+FzSnJoRC=6Z@HIvr7kk z*|Z4es%Y=C;QM8>LR2ey`=&D>*U79q)O52v-5%Ar3Y?KCH)$qm=qIvW+c>?<;=gwC zRY^sc!+itKWPQ%<_l`Zzz55nNn?{E!9$gu}ys)hVTG=BwP#zkHK985*=y0OJcQ;!) z>PftPS0cnsOHlp$$s2QiVw>+55Wp)=;AD5%)sPcvlaila`swEjy6fqxCgm?|CdeJ4 zy{6G%-jkj@b0ev{P+O|Ok9crUgCR zb1mv3Xg({oQ|2&uPlr(M!LEIE38Oa^`O~rkh;ewV_Azb13H%vA-8Gac!kn5s8*I-^+%=?B=P-5rtb8 z^3;{vWn!kV<3tZhE}hCUBPt}=%`@3b&ea!tg}WJZ#J05VOhwwj+b7C9n`r1#q9kA% zMmP%FnrTAUmDkDZB!qG%b-=jE&c3Pe&>7g_RpfyIA#HRS4`hb z*6>U5h4l-gqE&fe8ZF&roCv(hJ?os^Ui}tJ9nE)nY&&=EuUwwnPN+#4D3x@np5?}1 zhSINNTRZkZMW`@TX>fF~E;}d>5=Qu%qh>(6D)p|;hHuwtWUE%^$vxqJ8g9g*fnp8q zsmVp^s0*(6F>V_Fi`yffOR@wdf^IEwSZ||$Te=(IDzj*3Z;Nt-=!K+=($29b^>E;ouX%Z*Nm;FE3pRD2x~>pQZnjFNf8sw!P}2N9qi(ClX*62Er0fbv zUPcrEnXaF;B1!6v7EN=?0lB{MZ2#5^CUZ1u0oKWrLKEr*f5edNFI1FWd!S435;}r{ z&Yxy0jxAf&`nZCE8cq7*NjOV6QhbWJ=l&@2{iXch=DNzIs~4w{xOdE+zChNN7F(e7mG>A=Z#O=MqhnO{xxEhl~Hz)$GTYK4ZiwYm(8UjY#HB&0wV zpv^pYLkDeboBTiskSB8I$@E zw*oH!irNRFZ99=+d%f_}j**D_>}%6uLGZ=`YktN6uwxFQF~E zs9cDT{FTSXf6X4`cSfX z?Fc92Xq;hT1vt9P?@34zl{4e5Y;wlU9DghXy&r5{9T(XXAY!JY7W>{wAFazgwx#em7FJh6i)o3qK?HN?w^8t<4pT^>|h;kr%GPH$H((cw-5F+l8m98zfVa_u-@GkyhNw+Dtl{ z_Q8?fUwv{F#bjkmZ{^+~bbStrrxT=XxR=7hq$v$?q zvuG`bl?vgBi%X6CFiDJ}nU@vIZ+=>D?{q)E(-s)39z^uJe(=(o;ZDsQE>kLQMWz7z zw3bQ>b77S|hN}Rp(4(O-0i}{44#WEOpsfw`0Q^P*cFEcHo5d{@V)^c@ zPqeT3Q+4i^R?@z3G1cZv5D?d6k_}v}s+*0@H=F-MsnH%i>_R>-($gT16QCfVbkn3v zk`~?Ah!kHO_<%Lq2AEBJo8Om>qa-Ql;msxLR>T(4baQx-Fta$cs_Wmg=3hZb#;EU} z;c0lXwi5aFy&p}c%))fR2))$D_REK2N;$Mm*fpVEkc2i6^M3DMz#{>A_6BN%eBUED zj%mz2g9mY4Be^$9%;66wR^(S1sn6Kj))*7Ic=aGuBBasG$BZ1{f9M>3fg`&s4WmK% zoA6Bx7#&g-e|P?j`>VL3IeRVk$1-4&!e@xE3EgNszf*NB{35p_CU@|PqwVaI*f3T9F-t*$n9AD>qYuBEPU?k~3>T)D{e5qV zIfy4x79F?}M+*HocIT%z6X`rzrcJ-(-=V}a+eIG9L=~5H%=+5I z+gYBru<^UQ(SeCy>K14z9Xgs-3V}l{b!;bVdqosIHcWwRehTJp{=008Op94j+tRTm zixslSq3Gz)p?3ar=obD&T;28x-WDUn*-={e`yqge)~cY!3C2s^e~LZKl|hx?-yf9p zPkQo;FHOD^MOcfIof{XhXoQ`;$UA_LMTz1#Dc?d-naM4~r#)D_Cu)Z!8yqn#4AYvy zK-eQ3uS?b=j{Y_eE++p(6DzAee!=Yq*liqR+Q7oi8<_=8S|jh~JIBS#Un3mY;&jG# zmkqbWiFIP}p;nVT$w5S>%^0PUzlJWcU@h7AO5sTv0FA(yN#+kj>UoKQlS8SKP|oBxCxM^%nYFB=@JpbHi#r}FS~nwW z>+Fx2+xWvPy@UweUvc~rA^fOXELh7P{vUCg=N!&FoCI>>Fwmwc0>WvWZ|O zSW)sIf|dLozYh*vT5X|8Y3D4GuX^@#=eoYigla<|t14hsm=P?!67LbowM<=`i9bF& ztdLS%U4BS~tnj9LCG1w9y}*pW-315)Up5eppfcVQn(uZ|G?n=r0AdSq==G>x!xZ3@ zP`N@oA{3!VvfH=OI|Tuv@B!P*!Z^v)Uzh2@M7FoGO}mW(hs^vJB@f+qn>-MR_27Kk z=r_s*%Jw#~X$D@egENj5>gJLAQKyZ`9s>($aVl4*?3?%bu$>+|N8K~$ck)s?PrAci zeA_Pkh`AQD-gLFeXW2wB7ixX2GE^p3A74@zOaLqEoJ8VjiovwQ;WWXAjLjh5(`gA6 zcAC5yO)TNouJ0OMLq7BenGjEovoD>q%-4r4x2*1jWdIiw;br+@pie^D{+~2_Vl)1} zH0UKg0N8Q>V74< zCbId;=){g5XVPsWfVFOD%>yhd^yGQ!!3t(l72fN8^LTBAv5dqN{_I%G>;6eOT<%po z0eSmMP7wKg{~(ekKJu;$?ISHwx|ZW@*O{rtES;#-kaSlYeff^Rd0Y|0GaSGiP~PhB zkh}t?nJ9l0eE1Fm;aPDr^D5YD4lugM!M~9)`0_#m{n^>pO)r$W|1a{_nbAAnJL?o; z!3q!A2-=R5*)v!IkEdFB?zHf8S0Mv#F_6x50qGxIy(1T?HG6kxZ22p;N732S2)F5@ zv20yJM280aobkY+>A~VEV3z3nm?Rim&^@*(cb%c|b&c4EEIqbg6IBVwk(7;6V&uCU z=YD}YCoaKj(evJ+bGh_Mvk`nE2;6oq4{lJBB=W<9Y2M~8?^Vzpw#wK(ueAFsJE0Ee zAdt-MVHJo9haB^1kP71a@tE}kF}mB1qwB~8zy0R|vv|&cFZ4LpD<(LR;B{kQ2A*(~ zeFP-8BhGMfqRVQWQ~yc67if`p-?gNR5oC-EfNK3yWCX0;ygAOiJAPZs&iw%LPab^& z)md%-Nxl>V`6Hh5_b_|8gCL5d#j|Q?r=WBD(`Vn0qrNfH;KKPma!hmIY)U+qJ(9Nf zw*_js3I};#5XEy@hP_!pA#%Z|`Lcpk7q+Bx+8?bqhV;^#t=2+?N5~*gf+>5Ua?1AJ zRGam2;WI$KD3E3}y6S~1k}&deu)AJP>NIR$`PMs9*b#oX9`_;Wn3V!i(Nm6Va^z3j z7!bk*80uwFFsb$z!Tu#6vFAdTQ{-nuH9SxP+5%r#o)Gc`w4s;m8vC?Zuqia)eo3fn zJ{6hdv4`dWsUKY+^2`X0^3~w1i6stQ!cA{26Px=j4Z%t5yO^|f;29Hkj^wBRQ zy!ya6HT-hoWVMX=>WSnxXMw1rjpJ;o&f?9@K_E=1acI4~(ahLf@4!0Y(`fwru ziQ-*HagGT1g^p2o>u>f>jvl*FTo;?P;(|+-A+CB6WgtdVcNT%;Bd$4l|mvs4?X+iNw#~bdD`uLU$c-+^)ki%N#Z3Stx zf+jukqH^}~6~{*F+rfR6@*ijAUKbQ7+B8CKl*(sul(1rw#cNT7Cm5WEW24n`I8Al0 zt>{ajO^~eBNVB3On=A+})ueUImoWk}S;P#vn3uU#*2`MziI# zc~Iv4Ig(*@dXIaGneD*P@+@|q((rdJ_=zm<<=&ZXfvBHJsYeO>OUmB4!u}|3FSr z_OIfrq&A^l4e!-&?TGER_V=oO=!9tkyOht>)y({zU&mJilxJ2GKPxrgj@3De-zB|r ztbP)Rd!9N|L;aTOSKY`8j+3+K4SJrsTlv)nY^jVg_CV&7s`L0mMER=$2K%9DL(&eF zGdUNm(L|LKDBPYtHyt|DO%>ryxsxpw~3q5J6WNDyKO0MGaff9%sdwy&i|GC)vd>f~OGIT%2Iron7*wxdRt{j*@*zoN-E zCPQ7V2^Qnpn3+svX*y6}yN-V>Anp>boH%ZV703RG$2^uHTOO3Yj4r(2tf}KDTu_!* z@!~{%DI3e8A}d%>@O9?1v#=K#Q}dUH1Ms0K4sLD7@zvhFjkqn)Bq?FN3w&gnW%sA)xB-hZK zHEmoE&r{u6n`;)*vAOKPJwN%0KQpHA3}Hn7S7FF?L~8jZVMj90fdiUt3}1X7IHfVd zVPT6aa$zld@=<=?YF9R?JsiE0pXz(kb%7yj28}dT<>cL33O}>#`oa7uqmOCF2IgAW z$~&bW;!V`mDN@*X1FZ#hW%9kv1;d+A|I}8m+yg~uX-^8mg>`Yk0QwfJfY~|pLMESZ z3nRVhL4ugN+IOXi)x&DqgB&)1-e?Jypldd+!}>B1RkaNRi-xh?=jbN>Qhcstn63N@ z&$_8W{#KMKJK%!%EVJC~;(HNl(rXnrp~$mAau%5w>eQ;W}n37aGwHPnWT%Dff{sg4dYNj3=>LXlnag(vLbv{`FNup#UM zo?S3uEoa4i19B>LzdSm(dDOPktdtZY^wU{D$-FQxj`>!v=2Ey&sSyLjZQ)6Ds`u%n zH#f%5ab`CL@~@#THvl-Ox5`_rU{W)z>!a1*5js?$0{!H}&CUL||4csZK)x#UKt2iW z%3^f*eJ_E%x|6Yyj!o6#cXD*>=Svefc_(4@kIdPGA20MJ9m&_$Z;Dr>Ze`iG+xMCZ z>I^pp-@MYI^2roCdaRa3u{W9;gXwN18tEvrJ6bhu*L5-Lp;wVETSluqjl8Ln$*!AUwPp#O1z9yQXvGQgO&dS z9Bl)!N5+!EZTDBcD#!1ttm(&{41Ag?TK?PifB+m}pUq{8QnOOHa<|_cj)n6e!fRqT zKV5J3bC}9fU7^N>4Ho zlxDTbU0G*RwPJ%>)fjuk?}qX)K0Q^l2(>3`n+p6a0lXGlxeC<;s+SF!=#^4XYqEk4ZMq&@x+AWpm8<7$LS zZ?-0qczk?&+!{bD(Aj)hH+FmEYD|s3W_KN9M6Gs#$%$LHrcZ-RWpb87kx%5-m>{1azCc{LB-s8YzOaVsO%Tnu^jquP&bY)+ni@bu|8 zH*9Fjpk!M#uQ$bba4grU7xDo0*FzZ|QkauU2Xz3SNJIchxZcZMm=pKPk}^W%a$O#n zKCoQhcr(L>(8HTZl}@9qUd5L>>hrFe7EEvQj&p+v>AO}QddV>Mj6l+u-Bkg|y{+1y z=OE$1K3krd|HTAZPj=uus&|bcYV>fc4okJwT$DhA@>r?;A3EE=&gonyNUu+Rb`hAS z9@?alLGT0|5{WrN!sxfvIRWbA)VLfL{;7+M`9j z@{u+7WgP_!7`$GaR1rW6nt?2;=;@{Dz`y9 z++SHN@)=^skB*RMp*_8Agx(+m*!=$2^8(0+C5vu|)l$cMQ2GedAM=9+-^OLRZ&r7?!ZSXDx>jqm z>2%E>v{PNQ>$2(-kGOt?x7?JLP&5p7^nQ?}SeM|3oj|4a(?f0@*=lrTBLjt)g_nDU z<;wKgQ=?vJX^dQU@^AC0erLuA^2R9vf8~(JmI*MF?U|rWZ8OLPIs8# zRoi(r-7gKk^poQ%V6r0AZ}P@^;FD(dfr6{xC^wcKX^M{I2M?LsYa?Uy)wFB6Ffc@* zPj##SBg|QEnksV2Lx>{VttIEgTB9_2Z)&N+YngM``~yfAhur(=qX#Ry{@u?Knsi-G zfQ6IyTmeFeIr5aE)8`TV>vfx$uTDFNi}Of(}_@{!*> z2=ml!4T8JinT9vzs!6nhrjuX@5gb}(^>=#$0GfVBg4!~b+LN6PT`7j$t{ukyx0rAk zgW>0+$NA{=p&hQ{u(P6cL=MS>m#qY!ueJB|vA;?G*WY}a{wacXe18Ytd$bLQ0IzaZxt!J&OyBlQB1rJG%Ap&h)6bDJ zxEhO8^lK&x8=y&(Ug|oL`W(!1+$mZnce}c5r1@)P;Qb%9tUs;{L*{?rNlNrAk4*wNN|1RL7x1}cY z=*xANR=uKUo0i4qC>~&p{~c{}p~C;DpQ>3(<__sFbZ?h%Grlv_lMlGoelEtD>?ZTa z)_|!%fUSTil90?}bPU2G;pn!mZbNzR=?mP%XJbHMvs8@naZ_I=W0^#NpPBXDnqG%J zRuYF-uANy1`o-+d6rsL{I7eRqfr2intAVYL?#J%nk8bw~%Pqyv-@F^`*0V4zC3pnYlB7K#O8jgmYhWfM6zn`#<9z zGM_n>$f%iAqny=*wCNZ)zTNxJbq%-s;5r%Dt+Kg1wemZ4CQfrI>FwJ)?#`3_duTPW#a)x8NK`Og%ipC5bbjj`Wd1rw*F= zc6MKT`$CCvLB4*(?t%!HFbGtwudLO_8xkK8zL9mpud20pD13L*EoDQdliL-jL?dF(<*yh}waCR@J)dTbP z?b5l@b8=g;C3s1422qmJb)l_6)+G!0hE+!T029nsm&VQTOr;13*>xR|08IUJHZIg# z-wc8m9!V5wJf$tcd7*=fAH@~zOZ}A!OYjNb)k;Va)I1Z)2JD#t%4RLWZW2}76}B@K z=)$5laFcrDXkBOR(MSb>71RH0El}pw8M$NaXzV_!=i)i#e>V79YTWrd|_Qm8ZF9-cqKG2;y13d<6|M6F9=Cewq;*HS!VkxOS z=W0r*o6P*JnK^SW-#n~=#FGiEx{WP&p=sr)bIeV^y7x=W+!=cee)p9Y_1`FFHd&dv z?$vX=GdB!*9ayiQtD<2te?)U*0sqI(fBX#laqSFVGcqN0rgNsirDtAfhAnDCTZSwr1j z>M|=-=+31s0wYPi>v2_%B^^)dSLt9sDXTzwQgMNJgBu3ZlzM_KfucT--gl2VeVe)!ijk4n5eAU7drHJHkhwzt?rbJUl~To*cFV2V z{>>VHPQBxu+*I|o zv%iuRteYDm?;z=y)UmVav8A2C^^|lAgE1?18V{}`bQOVDceB zt-sl955M3x5h9akuTIz+m8vgNf*3$}4x@8&1^>9NWo9CzBs7K+-ll`Y#`WzUdpyfk zg+$&D?d$wI5|p~9YoHsqHGi+cTE8fz=ka*3*M7q%zj1K*MEyuF*=n6nxWu8Wo^s`& z{ut<~i)0AzK@)8wKiHB+zX_g*&rY5gZhn4BJ<-S8Cbvl`G<=lLi`dt0`J!?LKKS8{ z8)08Iq05S3O=$~h&@HRS=Q|Lj zoBD42?NTMYGs_Wlcf8~lVQ2cHgc|8~D-})>$}9`4^$PFlWtOP+D%zKPxIw_HmJHig zwK0G^Z9u!&mA3-MnqHQ5=WHNQ`i5o z#Q)X*DZfXJFwmz+(qv!{P2d5{)_2&ZI|F_hA2)6>UX6LDd%am~%EBo%k^vMMNBgM) zD$8<>@9_kDz)k9?N+hS>m)jk#?frBLurUU^*g>HBVfzj+KP1-}!fLQ($D3*UBRL?w z#gbZ#v7C$Gm@d?s17ku?ipkD!fIzQ)*>`ZgeXA;&_yhZcInxgM#;sI6=SM#X&(EOn z&kfJMyDGPZg|R1{)h@QB4C|%0Se3)^&tF@M@X7&)pN=3RnW8zDidoa0e+-TSoi}a0 zuYt6@gX15re)z-L*}qN*@OUbE%5lw*YeUWmmrnZX=9W=Y2{17YK z>v6Ur;r=U_;jBPfw={6PH|9N#hV{PGODK`Vol}2D$kK(M^-iD~{;OXj(EsmCE$NZ~ z7Hbu^y#jp9qyBSpAHFx`1wOSXGXvNdWTATmK0n?0H)JMY%lKf_Sabhb^OQ!|Zhc_t zSLcbf0dJxDyHp4|1P_?BUd>?SG;q2?Drk&)|9XEYBdBEBVY#4uitW%qDK(pZ$5>=!gYCBH(t?lm;dNWvqOGAl7| ztiUNYZyZ6tdqth4By*1SLUBd+iL;gU`2eIUsV&S4OEjLpH|##)e7AKMK%0{MBeN!~ zmtN|x)7zF^;)X#C9(d| z2P~0j6?($Y?h&*z7ezRa3of%(ySgB!UVhO6_rouzZ)57Sl4RLB>T(olcNqxt5cYj> z5q|ld5=GjeJfl)<3z=Q50+n48U9efcImn3_vmc%s+xqELG$I8op{7IiHdmP=Jzps8|4 zp-a^njB|MviM-RSRwpTVdFY)3Uty4{@qs9)ouRw%WkFj@&wskqn5ifKcme0AkYu#d ztvImjqmC7u;TgYUxtg3<*W&a%eT3Xg<(3sfkw@G}u_;*$>{oLBF+uJ5468_7fZ@IP zNyVS}GH7q8d0ZD^q)jVllN3Fd8{o6EU5-+o%NW?E6hHB2vX30a;$O(Rv2nLwY2 z0B|^psilFK+Srzr@oeR0yi|%$#wA$!W{}zjIrf-P5@mSSVTE+@vUh?HW~*ED4cR2Q zC`?6p9`34V+sX9>`9i^HLRixJBLOQ`mcb4(27EN7sfS7u>CeBl>fh?B3`I@I3E0}o z(+X<0R&5;lN&B1>R!&WWS69afA+7BuSrYcV%?~}Iv$P4ee$UZDJvs_!yb?59l03UP z+Psv@YUrOv7N^9|Qm$w9^4orN==uRZJ@aW6-%sX=g7>^+EMwDYv?OOqT#SqvsqL95 z$dx8%yQcTEr`BP!xSH(I;!ht%!wU9x@8)9yM^Wl19L6F|p><(Wl~c-9dNCbgMy~k# zan&?uC!-y6e)M{EJt6nWpkA|%!Clewu6Ojk-`uDULSy%?gT5W508+kaq;_&&N7$G9 z7Fr{6bw|<`c_-0PwAjrYoc^HOyV18C`c#*{C&HNQHtC zs*Mua{2g2Xk0aR`;YAo4k+as5RQua`C9hoaHn?zQ+!~gf)GizQ{mIyb7rZ@c*4zZ7 zwmIcd;tepVv@0_u;8}OVw1q0EuYq7^Gu#FDM8gCkGtZ}?gtS9wwk8n2|xkAVj z3*r{$%td^bI-pdu=+m1XsC~RO(;#r#@G0q9SZ${-6tr7Iy;d+WkcMw~-7v>oIoFRT zT&<@%cC0-ao?iQmWg@L0w=_oA2K2U!R?Bnxn(WhlTF!XsyKQv8gNMz*-ze!rSJWar zJm}wJ!O$dit+${DBWh^1IUt=e!tl1JKR5HzpXfoU+nFNhhB&Ej|zV^ zI3~rj_&8ymhfT$;-JsJ*h>UBrj=3{$FJ%`Ve%Z}$ajLUCJxhmmbDTOzLg$cBklnZ9%z*dPD`M0 z7ujpS4)LI&~wcV5cRt0V!!HI@GP1MhBxnu64dI}$11O60|m?iiSR;4#!C z*N(J3VjK62xMLCQs`isr2JpKZ<)>{!%ORK}Tf?v|WzSpk1%c=+#OVB6;ST`QhGw4t#e(FA=bi6NaG@n3EL&a>>N{Fp&E3w+L=aYHccUs8B zCiz-N815x+SJI>TgUbCw8(P?Qd6!oDWB!SW3H`0|Ydii?`DSzQ;rsn#%RK8c0&Doi z4Jp|oMN=yMewOZ8GpBi!Z*KDSz>)f}__0F0h!##KWm7+NuI)>G+}LzGGTX#rJb)sP zNNb^HD!eC9KXKeGtM}@Qi8JJrLJ};BUaj#9Ekld5u9m_%iyBgvEI1)oixuABCtNY> z49@&t(YK}YugDA!H?q9BA?dd;3mJ+7e-3V2Y$ISCNPVN{afR5{r&ASL<9=0mIKAZGAs6kLVl5z6nB^hr_-8X|9 zZlqsk=vLqEHcP{n5hmC6Py}&3Xy~sHekm9~QFv|MOclOoJ31T{ath{i;U)Wbf?(rF zzI_ACR$BQr(*SQoB5wev`GessTl*?Ik+|Mvp2R!8RSF$kS+)E*OLxG!%uP*CpUTf1T^A(Vl3YI$ika*Bta3e%Xt=M7Z z3uHKsMqRR4hvQ=w1}dYOxA?ELK|gxs+WCbtqr(zX7A&-t2U`UtTK&Ef>K+c!`M;R^ zCp$)ad{%<<4ss`J*+cHwY9V3$Jv%{Lk8$AB%=&U|!5IAFUy*tWLj=-fqoHkU)tN1E(f`Ps3T-Mb2_A}15Vl{jEnLqe zR&SGsdPI3c(e}0yv>{3BNiN&Dc$rS2ErlWuhSa?OT1>T<=HbuQ)KLC7sgsY#2& zR2*<7ucQ?<<}n|#Ub{CxPAuR=iI=q>;7a69YFJA+8lsV>Ck3FZ&_*KmQ<qQkF z#*sO%^lM&J2VMAf&~mGO(Vto85Hte`^f3p!>JbMb=lav;Iom6Doy%c|kpzh1o|uK7 z5t&dJ#5{SA2Z_pKe_HN46IIrEu5ws4V3el%x7e4CCO>B}K zYF*0Z&DqoSGY6y5y$7eZuayv}$mgksrD1PcoS#uE`fSW+3>QyQ+=WP+h&5r%M6reZ z(><5q_5Bq}m3dIkgYqmG+&(!g&cSK$19xnVrT_3gtGQCBV1~n<-Ic84!brZ!r4BTj z2F|LkA0~DpvIO;|!sBI~DmSfaA?Rc;i#a={Z=s`MY*xcg9oh7}pEh9o1v#FP{j9k1w6%!KW#D#=e20Brdpt`MyA2nbEk@o_T4HrMh-l{+^?2JlE)-&3+&L zCNH7N>e$j}n>|Xb#$Dx&6`GOeQ0fPi+@GMi!ln^!tb?IR171jX6}h`wI8(|}GNATKM zBNbJ#yj4z}Q@ru_HkaCXu6u4=- zRlc-h((3c}q+Is8(y^lN1}u*#or0IzG&q?B?ffX(EDz%(-{*NmWY%-tT2IL>c;U!w z!sinoaPn>2icGBVgCAQ5Dk4Lk)_isd57Bd2xo?J!rWPi$8Do?$@HB zx^gQ=mhzu88xROG7ApFXzoD0sDj!%3&@?xFqmo%8I~&c9^acO&whRP<{7E`XqE9=2 zkqewo{Cp#R(`^$G{%`2FxobaMQzNA|f3E>4IEU8Q!y(n5&jhSC5lg5WPP3TTG-}3Y zE2mb3+$ME@ktU{+RFT@QGDP8$39NjoWT>*}vh86=+4oO+7J6Mvo(!hwcFWk6lI+@# zcpV_)X9%P^*Tg%O&T{U3kzdwprse3|j1^v-Zb~#cBt43~`gN3e{YwjOXGhN}{-CPA z`7ihz0C>;*$bNH{5Ku>4GpKGTO6@1T*vqXuH?YV$G}?rYy-}NYVbM_aIYsYykLb+b zSeAZhLYCLy6D@7+OHWgYV_92?Chv%Jjj?-0OU_T)z9XVDLN7^ zMy=jd$I%x)@x+soLi%$;0}~%yRjZ?^QJn?nw5=ipn^&PolY%Y;{8lMpSfYf0@cNO_ zg8cM*YKxfr+}`RVwg~@3Z>8+LZFF0cwVe&|N4^iHq0JZ`Z(i}#&S_%+zBPX_%gnD} zniKhE@t#iGySe_aCo13}MB%N<56o5v-c@I!qOV`gLjO52GR>=5iia&;^6Nu}zz$5e zGNzCa49&#fFX>skx+6MZm7?~&>2t%EB=wha2|jGy5qttkJ(WvtK@-%rW|;|ZT;3~0 z!r4TzYMoBb(U3!8y}J1JDl{1^mU?G91Mw3k#oPidJubH0IwD-lXxdX z@|I_Id8NR>q0#OFVR!2{rP5P1o(b%D4JX2ej*rx+XC03L>!_7 zGo=ou*v;h=HJ>!-=}nbpsP8i5uGlS3I+V+3me~U#!OoXDRfmpj*rRJGbdoUliX_-^ zqA$fs>YGR{mroJP{;bl;kYUwbX8om7D=50qp-RX&@Qv5^79*Tyyzz%?gITqB5~B57 z@E_x5c&w28ov#wUHT8({ryY{>Hp5XByG0!9J-y6tK8LD7? zHxw=2DH9@Jc}>&4gePgGk@1KiaoKov@ z&}tr^?uFg#A%GvPZy!uqmn+Rbez=8fUQVy>Z3wH0UOy?ehL4b&Z@A=MFs`+l%(nL; zrI@+}4mT-AgnZOPc|~IqLl_IwKj%E;)Ah z%!P_ODpU!<+c=rUMKPO?L=BXoC@s>@hVLbDgHkT4Dv!>}Ewb>fTyk80sye-&Pu>l9 zX+l1Y5ZqW*c~4jqPH(-x{1Xr|u=x#3pOIQl7vb-7OK`^R2aTU*3m9#f8e`pWUc*8h z%-n;0DOCZLf#16Zxk323akduje^g5UwWA&fIB-fqKj6t9{Q`PVyootK815Ks*E<$b zNNbX24l(&CWK101<^+@*yZ=)HAo1oIgFgnZ6u$V252c7~xbFcRmy3U<501P{Qrhn~ z9yw@g^h$im@>34V=nR{V;Qt@je!8f~MY0B2mz>_9K zo+>o0keP0<1XvbNeL#^B?4RRPxevlz-+$PrEf&*I3BVU2krUNT_c!|6KQ?Fw89|LO zAs(9g7!c@Z(`x?A^)Z+8JWi2-vu732S1vEUCak_aFL9$j9}ri?spOgR(ClXE2M6## zI_r)oZQ&;|%jpSiAtcYbq9@XCqa>wz#;c83vu<^`1b?%r~MmA9qV4huzr96F;Y+-t?QXzrNKb8HfR4Yr%>d{v5&k^pf& zpNq2-fb1i269`3Gc<-MB=%H6h700Q~h}$KO*e=I`HB+3_237AFupl1s2_afoJNlUS}l3s;%Jyp+jLTa zkm^ul25YgF0tDt&PECnr=w27zN$&l`;iQ`g2oP@F%zj^asj<9|zMr6Zx~Kl5#6?i# zT%M=iidg{)$6R{HnUKP5^1=5}6mKJBC0&ng0uf{vqT578&i_0H`Z;++M;WYL@LK(d zM+C$J&OUw7_nlk-67;!Qq7O$zchxJzC-_7jHFHc@0(+w=AKSwxzV*ejiVaS`))a6= z_J2Qz!!{GwC_&BP!XF=*CkMQ|XtuzxXNydhv-N{)jZ3GUI2NMDpIX#a_{O@veAGTY z5x=mq2k5k<<_v&!it0*bPl`y;GcYd+c*sIhvPn3<$mdYSat!o)gJ8pWtK@ME1Auyt z;pC5K-uBnJ%GQs9{yQXE|GrG6NI(c2u|xZ@w-T_oy|qu%q#R0{1{qzQ`w)<>=qW3D z9#dI%!ChjQ3e3*q$Q`K&O#o50>=D_)0@i?~$^(v!6>vj|t_3(sQTyZ&?ZX88Lqj>S zp+m_K$$eNy^$9v42fJ#qe{Olb*Bi329A=C4v@ zd2BGL;dKv9+5)&xSuq$bcSQs>7P@?Mt=`$HicQP{+EfZ(_WxH4Jec~2 zl&mO>6yKx&*$4DCBPQ+V7PkUO=Ro*1fS!Du??&7Y7dV8`G1N{BsaenHmAkiO8CoAk zT*j|+KwDbF?5WjC{k_KL+|SJk4j)4B8Y-G|0*?Dfripr^5w*_n%0lT*=9PQEf+==sEmVA&IiMh88hOG;S^gmNdt7zYQ-v{#3 zKeO@_Uovfp?&^>Gb_T>4k{%6{mGRGSlf;Fw8hBy*K_VxOiuYnNr83S!+$8fagq;yGvp$)s1QYx z5ekA~j#>2ku;`wYgXamzMv9$xH$sQ;PcPjFuZWYV9#*hyJEr{7ifiT!`@W$iOWOje zX>&d3nJoY1ME6#m)Z)L+(t2F%=lVn@Ep5Ii{|el2+{j#wd%>S9lhpN%*I{FJpqCa7 zgf6d2#kC7`+RXc0^!X=jp+@Em)2*%ShV~!Vu!4X0ExMHA8i1c^y zua0o}`q&SGk*T|MpTFI+zRYtNtC*|#vpP2^lhBZpr>^t>wjf0OQh8gtr`rk2F%NU3 zvOXbwO=-;5k1p);XW68&J*MykAKL@O-@k!U!t>m2cZr#NT}u^S`0|g7_Dg!q z#`@f&t)HX+N%Z>}e}`APTQCKdC5?0%ISlupSPn2JwC3(_vJ1{vbQ zB0c1a0Hxc%w@6OZUeWEgy(zN$H{a%|13F1l1iH7sGtC(foPd!{ZS+6V%_BQ!{#UWq zd86MC4yne62T6yU9Z)aUm=Qw0Ecy(46S`O`+^91v1@RHq=We%5;eJ;M)A@wd1 zVGV-~H$g7JZh%}7WPhabbD+gW>}LXqvF(uN0DhUqeIxHF^@q5OMJ&FlufO}u^k>bs zr-wZeyE|C&xJd3#%ZZwEf^t?{IXcMSkY=M}4~zleZ{X@_;U*&ZQ=KUW*_cq=O&JVl7Yb@tt+S{Yt8W zx2%MocKMxZZ&H+QCpKTL=c-p8o_=FRbW#scDhMjypbTBeVo-*(nYka%I2``T4(6!I zx@W=7qTXH*QA52Sw6M}wu^uYjO9=UkmHpwZ8rry%FKdRHdy&r|P!Et9qE8>vt1#_P#_A~n&0&Z8J5e=_U0TzJ zA0Az9rU!rY#N?_fSUVEfuskB~JcVhRhx>;ePE1h}*IXy65%8Y*&U@=JI#PLQ*&Hw< z+lDfw2OIObHhMsK4wjgNZ7b@p%N2RG<%FI@T9s0iBs5v_p>jzLLK9?6_f(eJLpcvCNEh~9~F{Q&uFX73pYdiQSiAN|?( z%Iy>sde^h2tEL#S;Hp(znWsw^*Y@_q<*@yQVg#YNH4B%*knQF6SkPZPhkhTUS}aX4 zujmB->pm`S^||UrE~i%i06_(#J`RDur`49t{dLas*V=@N42I@S_NF*%NOMXx1!ceJ zEv#+?vdn(WFa`Z|AaI|3?@3*Jr?>B3M_4>|*@tXQrk-+<- zh0%aEI-snx)uf6rF=Fy6_(2mY{F3Fu_qP!T-2$&PdV(1K>NyA^`mbWS$L7bETtlRq z^5wc)p5oC)2|R@jCZ)t8#(U{?UY)r=^ehV2MVG}K@o~X^dWn-_??08HEAM9-jZT|F zImK()K+7A*z!%f|tAPr$jeio(=F3MRWB8X*JcUD!83Fx;(z@da* zKfr0N1T;^Rd#qHH*qmC8=mYdoHt)B3Bi&Ta%$Bzl5L-dabM^56pNv%>x7Z7!VA6Uq&Nxhr2h7ar!?>#9GqTA;+l!-OGis;B zCq(9i1g5*Z;_Lv<)o7l^0&;`6=&g*WW;iwv)b;4zv5z~+UyV_SCf|sg_T{(%{`$ba zd>=c8w9pq$<88uxmFbCSL=lMtdc%9}6OgJrhAY2c0@V@SPLWAHPQLBcsCqBSdD_6b z2+9L3|JRK&v5)yacS+cRqM2!=aps~jKSb2lZ*;a=+s{0CVqOA!MDX*jhoqTpR2nLx z06h)#u28);{nfh7&67z`qok?wA*5C%53_nn0qkrfe$$4T^mtLBV9KWDOV>APS;=?< z&ZU(um*u=6?$H)cj7)1-*tBZUjR@J zXgQ&hp82$vQjCA$B4C9O^!K#!`MDhZZ?>znB+1l@Lpdlzjvi{z6E|Q)CyRKs~S0tQV@#~|IExNd< zSKlr_K`!EhtOz5^ne36LZNSW6Py7WZBI!5L*Z&QvFEXV{e*ieYFWb0f-(JK$7-F4R5!0Tc& z&adNXNW#$8`L?oL5#DJaYyXd>m;cQmOeC%g6>{C7*D(Eey}d(-eZy2ZY+I>^id70J z7gr@UHNJ2#PyHDg!U7JmD<94_b)JYWa$R1DQDNu>kOAoTgBes)O5d|@9lFrt5h_NNcFQEi9&WI-n&r2eZHdOG8?cL!I2 zS4J%u+wlA1*ff1!sd)s50si*LIh5xFSQ;pcj6FHmv*|?w1@Phb5%_|j}EKF&8?5}*lr+G12U?Bd?o`< zr6?d}A#Z5bBSe}aH60%Cu|O9{y%q7QchC$jO3N_^j3)P;2$JOwVu%XEaM{bt0uLZE z@I=q6v|dhln&q<`+ZBXN3<`Tu_rtLZ-kfrPAMmI5x6f0wqTFiSIw&^BL+YEn;sF_1 zQ5ru8w2KF{f5dt@M`d5AMz*zmPSyzti49CQHHGC#E^D4j5MZ#X!h(N;GWTO>?1#J3 zC*{7pUu#ec;BB96bh*O72DRctW&zkaR2dCNF|V`C3?_R5i_pBB-tJ3|!xsIxJD$B;?5X?B)YT)VG|EW|4rT<%b z#q7@;4Ui9ap)E&Mv5PYQa~Z7ipzTqu@im}6F}!&SaN1BF?L?B)B(8aog|4!Sznx)L(U7U+dSU$O)3c z6Zcg`>hBwkHh-5Mwv_QtmkfBI>LGVD_5??47EX0l{#Sn@QAZYcs$cbje|5$n$9kV) z`NmPCv3!$@y(O}}m3ZBgQ+GR{6xBA}ip;)hcW*125-SjXvz!AI>A`gUQWP^PZmi?+ z>=)$-*H0>J z^U#QRowLT}uyK;`6#j!vgS4-$@J6zTdW94u>ox3L@wkIFm!!$o?AuO!1iWa=#rzPp z0cGPGq{5uksH$6E8Xj)EjU~DYrltw2sWo$1^dSw;G&f~*tf)Uno!@Kb8kRbGQ4xoG z)2fk#pnt^4%TQ5p9K|Hn2>^sVJz|~0^VKE~Q{394ZPyYgyxj<_y-Vj8* zs7o@Q=Q-v6#@K^*T+#J&iudpm*lB+=+X*14BIhg&lsP4hNFf9&juTr~N>ho_O1~QvaAU_wn#0A>a1V7jMd8E z#l0K&@O@hGicd^s#o1}t;tI4B!U(!$ZEsM@s+Qc?WJ5$c8g^ThB`#hE#GR5&jq(Sb z&RdDljstBeY$>YoJ(P%e0cQMSp?VzjwiH;Wm$Rkw*mI`HJDAuV2hYkT>!9adCdq4! zmdU)e%cJ^@6@J`e;Srr)Kt-kV_0F75P11z0Kp~(cx;&!CMh0?0V6->o4C@Yph`SK6 z**SrW9ZLe=WdOYj+)Nv<+1t-oEaM=QLBi8paZsdzeT%%P;qUc2tl|0d)q2vxrD4V`*lH$(oXk~gZ>{;BdT=5A)Py6gJi*oq3?G47Z_2B2`sHyWmat$QdSe*2HoTkYqLM}6JbGP+lJ=h5^33&Kj?QUCw| literal 17386 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�zUL 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 aF+*nGFGT_K8*ffJ)6p<^fV}7U?EeCt<(S?8 diff --git a/docs/media/tui-lock-v2/runtime/120x40/model-list-hover.png b/docs/media/tui-lock-v2/runtime/120x40/model-list-hover.png index ae18a5f3aee22ea8080d9ff4ea4329faf90402bc..429160f457aba65bbf686d90743b4a7f6920bada 100644 GIT binary patch literal 17233 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 bu}cLVrOs0ppU{3fd0g$O_LK5QR&V|Xii(A` literal 16622 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 YRyOn1@U(MBgj3K14gGtSckG`1FLB5e7ytkO diff --git a/docs/media/tui-lock-v2/runtime/120x40/model-list.png b/docs/media/tui-lock-v2/runtime/120x40/model-list.png index a933271b877b1d9516866ea806527093c1c5f542..49a2fef6ac580eafb90a3673f854b87126fdad0b 100644 GIT binary patch literal 17139 zcmeIZXIPV6w+0yGRYVk26r`)P7o>Q5vm-JHA_f??e#~B*|5^jVX(-j`B+61qN$PbW)%^)*Eu=|MO>3 z0}xL9fb3Q*UinHl=f7YZ{#{+*=(bHCs2w|~fCOO32R|y1vG_*T6XRguzqKC{2;h(P zh55gL^&aDt2L7>$4iM2((q(NetcLCUS+rW#0~U^3NAGWnEyS^y>2XKpiqR)sW2ZCK zl4D{!njDUcAM~+Ews+kf{jpJQ!#^df%<4EjEEcy*1K$Qj6(kwQS`bS*)$MHW6cJCe z59pp+KvidLsF$hwgse!oitt~txQ8@(GV&ycf&{wyYxiK3H$L-;LGA7#OXs-HJNasB zOCf-lu*Z)hVz>V+w*2WAi_3NgRH-e|>eJx6{w<1hy3u*YlE3k4g#}Vd#4XzJi3!;SQ5rYrRrc~YDO}W2NZgBxt z8y{qTcj>~QF%L{?S!uq#abVl42n5m#F0k-bkgCa=l{30jH`+yhiI!<>E(151l{Xby z03)2Si~cJFIO{z{&BW8gk=6EEG{;L;Nq_{#Ptt!N5tPd&Rj2eSto)YC;-rRvxgVDA z_)KZK`ZE;bu^REv-|bU~(uI_`)Kw=u_2KVP+)+vea^i3BdQTSxkcy9*h2rv1Z_Fjf znef>dyQVJj6OWMp=yeM+cH0-X9rMr83KBRyyzd!tpuca;T?HR#MM?ovw?8)LWkoZ(4V*HQ^Wf2 z)7T}Bhmw!?p;95kb|#m^fKRWva#qZ&_YO&)9RRa|=GwQ7)uHtW`sXuO5rhDR)wSju z%e_{mDt$#;OTb79FZ+GepHSG-M>M*5PAVwKZ(Q{(^Wk6CJ}qFiPGW$iYed%4{stEL z>bHS9@_Fam(E3(VnbIX;w973HYQPf+ppG};{vury`DcLJYE5EZ?mYQ%4WI$&^05Q^ z_it-wHYPRVT_dzan+dD2o$32v7U_Xh)cBi3f~3RyCPbLRsNoaebE`qZI>lwZfQ8-K z{TZ`60(G5bH=$hml;_$+8uCCQ(Y2G4Pk;+b(JwRZ5Xf3(Wcx=RA6l)pwaa$n$H;;5 zbk*cr0B85tP(;HTphR2Wy4OGpYwoFob%X$VSZg9I7P;O2xY$BK+xzt5WzAqG=kxiI zw~C^!y2^*7cQgL@Zy4kX+^6Vau~y}t_{e%N`R4{#+GL3r4j2baf*){|Z4{>GVW)&WcmW`ra{YO0*O^ zM}mY7+5LfkJ2pl_>P;^k_8R}T%o6LVwA$Xpa61+tr4@8mef6{wM0m|M6fp*kmf`8PzTYMp8;u_OEydguG-SI?g(z02yYr=v%GVGj=IS7w1)SBsZm@gR8`KD?E=iPkcrZh0LAw9zu=J?A zAI|+22=re};@SiDqDR0xma=A2a;UBGu}3P>!E*OgCLNcY)NnG?Ah_i=XWO; zk@JY?*yzi};~ka6nn#7>LiSP6rBx`|vl+{btb((FT2E)4Bx^mfH>QKaz(0@r>@V20 z1y(US_RHPo!944|I8DVCYfKh|&Xa=ZIz+I=&pwo-#$aF$n2j_wP`p{P;(Cj`S)_B( zUCoj?4OaB3$n|6~spC-Fy%Qt&;j7&({?_zfsE>cU!r$eUJxkh;;X97ir1xm9L!g&0 zBjJ&KEgzt@?0*MP(NkFln(QD@5%3XU$-AC8$L5vWiuuDMnf1=U=A<-@}Czn%$dh20E(PH)&2Q_e}_X= zCd1E$>Tp?UInnb7a3t?1Du=LqqOS;uVx8oqPwHL&qK56CH2yqYD#+(wkn%RLNdmZ{ z3^{#*aVCj{DX?M6 z8as}hY6f$b>_@LH*{2>@>GN~hR(>Yhdg@3ne9y99vRAPG2pXl`B1l)5-6{k2tl26h zh`Z%>6|JEc{F-B2h}VdxyY^Hku)F{3t^Hy1``#GF_wajM2Z)PTckj;_YD3rhIk41t ze(C=T!w!HjsPc#BGU(V2tzQhRt1jn=G%!u0jyVX|$6? zh)daLQgm4t>K=4lk7nL8AWgP(PmHnK*})Eo1`XRanx=&z8?` zHnu?A4DP!TjCOeZ0X!yCUaVH?EC-gZ?mYqhw$s+~z|7qLKo<{y-=Rf&b&N1H|1v~H z3NV%%fAWKLazs{FV9{5kt8EEVLhBO%R1ALSm~5zGeMX^W#FHHqUw^dXDVCFDwM)cv)^C77+*!7Fqn^d(OaaI4T;M@b*Lh)HTtj3k0? zT_16M)CX=WQ;o>`d9~nYn?2OQdI73*i0w~g03f$8B}EoClDj@zknMp+nJT?Qcddcw z-FG^66g_I;D&Z4u6Yhh%k)GpF>c+p~SCiNU0!94aO`hPncTT297hF9x?Kaf3klTXu zZ`H0ncsGcB(%Q;zjzO_e7_e|5H0ja1ZZh;P8uVFIFJK zYG-jr4}62X3-hGgNooLo34O3VdLCt50vsB2&p*HYZ=W5#*5*mJY#MW52mcy?2T#tH z?8m*yhr>LIs9S71`L2t%yJ_0MjD^WJmO;5OtaZ`P7kqDZ0@KRSY2tSK_+m5~cm_VC z>QX!5=6%B~EKKWx@T`?u4*>1gt^hW!hWn-2F=RzmvWc|7ik7QG3i$Sxx{afgk1}ua zbQmmsGPkcX`;uzG1;FxKk1l58KPvI6!~7Ou&wa03N2wVRXkBaGNO?da63dt7olL=B z$QJ;t@T4Eq(-WT|*+0Is>$MfM+1mSlFW;!BZUS<(uZ_<#L=l+f-mgGoh|N4n zR(h<)F62Yk8hZ`RqD#sPmt*iu|Of@^WE zc(o3=SK@C0x8n!Ftm}Y{Dv>}O{?s0H7QporfVKi|`oE>c2Wp9?_b+_YIELyA4n4S! zQvmN{j-L-|^_#KtLnCV>+0MCoHyC@*Q>U#L72QaN|AyjAP>>=k@2b=Ag%29hV)v>mgrd`Mdkhp5PrE-)QKZsJ zAJ4P(&G!fvxHnIeYnv05?dM#)s3*R93=8B3wb_P#Ky;Bu^yvk@_b8_+rWd%OZQ+af z*Ns)-*)QzljTe^;3=7 z4sz|*{s9Im`##g+VX()$bX@pfAnWzj<*4)8Tori>C$cJPlh}{i!43G0)CZoo*ub?! znT#6=nf**Z8hR6U?0B=m2NK-#OfRGI^Qex9FbtzyRy%*(neb7t0+N+0XG!%wYcs$R zUlH^?pE=_Rm}no1^9+qyWdwln3({-l3wJH1;o-HH)9I{wW)gtAKD`K_YP-JVmonk+ zSC|yMP@ciaMYut+v^ytmI4TYgbLqZYA`H2+eWL^$KGm$ifC?=nfC0S?W=8I7qD$fZ^&riB7F`Sq?bH>Vz1}_rJ0-Y2`@a7sX zZJToYzX%Ge?Mw9z4!me@wKSEFJjyXhPYLfb+J5iq2%V}tNBZD(B5AbD!Tlb1NW^9I;(D|h@UA2`-Db>K%W=F#KW^L(HlP;lcTO;|-1IQ@h zh$D*Sq=${v)h`VY#&7G7W0zZ|NM4~dze#vDNSL32ci2Xu{v+l27a-8lU;f7O5`>*)Iqht~)Z)C2<@GKeSm}RH zGdi#;wEH558`~ZBJMb*a=i*Onfr#lES8~P2y;xnH%od-3EH^2(yc41C`nFDR6kl~K zcdy6{_nDEqae;nA!6`QOoNvg|_eMyK$RPi(FTE&A82Pv8CnxD14!!l9rdt8ujXwl7 z;K%GVKU!cq`9F|XLZ(=oagxGO8APP|hHGLp0O5hfcB#Y!h;%8M8c1yK3!cAxd-68& zj!JWcx^K<$;(qJLkHV*Mn|^ycemf>IkaXex)nwq>G3EQrcTw5`C0`uf;V(N7Evw&6 zdfv4=MY2DJwaW9{ybtsCH20seZFRF8$Lmsrepf48BWaC%F2m;Z88&_}579)Q6%~N7 zzUj>R3Dbl0hIQNZg|&)y+5}+h;~yGortza&nJ@_?m(rbDXXynrlGEyU*1lgNIx%PX z@wtM2gAe>+dlOHc1Y=_*UP)3OOWgYXaj3JdXk;MK#Jpqj-WM<`B$xbm6h_t(+D$G) zCAP_8YK8AanGCm|wsmlzq9=Z0zGUMuxVDScX(cKG8HAbAN2N>AcSDrgrJnroK08!; z3@7xINvo$(vMet8KXW=`A2QqomZUtmhe;|O@oO5ld67db0%ObwuJ3q(US|A@Q$z_jul9)$tm|D*Rj%c6@ zx?7bXyWaXPoM0L9`k0~!V*zhV!);>Z1zbb!*67HFI{n<$e(oeVT?eLIPy3;r-_q&7 z-)S3*?4S7Y+E^)lRU2<2VyFLm`H-P`>avZr;V}8#DKR=*T&)82qLrWc;}K-yv%i#7 zykmu$1&r1|7B;0TMOiPVGdzwP8l%EtH9=VLj?k2LZly@r>&e* z+g|36Ud&VYt&hp?DHOBY!)Y>?5dx0gkqwanBv<{Y9sh~?n$)23g77$6=TF=Y_X0fX zCRErn!#E~~n2u0PcdX*KLGGBeZ;1+{!$^nM;@e(c?30ho&6kl})q(@|0YO9C@S;_^ z1ulz8M{0?xqyh4c#1Tp_lC3lWw|vT`U;7dG!?W(<_stwQe0@z=;PPSVQ`ZU?MlyPS zKRi|~2&-AnS@t?r(4XY;_wPmnb#@rn@=(8~Tdc3c*$wg!zPR%{bL+`@hysZ1_f1+o zhLB{{h*9Dx3J@Kk6q;$@^`|5@3925?MntAP*eVN%h^sl)U|?=t(002jJtQp^QK~Q# zzoD_W)#H0|`Vl9l9Zb5iU$^A^wf3utlT@*dCRw=leYRZKU|i7eRdy+;Oy{{A z*xT1j{7L7~w8{y0yX{jU)Xbph%hV3`O0pqr!cASk16-=nNt85wB@njSt9qmpt9)_ zc`Guw?e(!0YP5#cTvqSt$#MUhu00x=m1IIpsjhAyqUFKW4}E^2;JmrNkIAf>Ry{a8 z3}$#<1xq>Z$ve(y%^%aUcc;V8qSWS{&eeo}ujGe?V3IFox4QHS=O$G0_3q{%(6%Ju znKn(@#_!dapEJb?#{y%_t73KoSdrK7Ub-} zslqD;&q711Eojp+&UTST~ID!E0z5}2_0s5X#uZhc<-;eQ17OL&(E6-&+(mk5K zr^trH^=vlL*&r$kTDL>hyBp#C+?sLH8T?>8*Ac#Y@9F%W4e}p1mVi=rmhgm!FW}yv zxl5gy)$%ZzD5_s|H~fx2E91TRiAeuDx>$?cdgn6Ptlvq%Z+641m8_E~Y%~1L#Vd|I zD#HpI?f4N}KCYwhaz$g;)?2=MO={y|WMd{Q4Y4MLC6wD-y}xrWlD4->M_We}-mb}q zrL|sE;_vJ$*H_{8tX-SVH%*hRmml`IyCYzv8+}~jQmO1K7^+8 zC8cH56${@mXtGI#T{ua1XMmk-(m8$B!>{}Qd{8!0d9H?05o`yJF+Ym@uu0R}AJ~r2 z(wO zjQ(>b{7Fp7tNxo4aa8NjQSl~=oV2Oxm~l#rSXf_vg0uPlaY_ck_Q$cPd}EAmhi`R=ZJ$e4|`tY)Uc9afHueAnyVImXXRsK zC4TeHU2~JB){78Z+!Az}X4gFkfqu+~Z8taTT3!wQa%%X|NMCO!ijDhBe#Ih@qArU z93J*s{{jgjj_h1)>s@HlsVeI3)g zRJ0cc4ojn05`H@iT5a?MB=d)rpBipFRe}eUTPvRb4w~U8Vh7wp(evlIyss=k|1!=g z;OinkF_evsQ8*2FNaR$$IzGqinmCq%uX6kkNi|)Lp3|>2UZ#f~e$lzA2AlmqcOG(Gb-+|{^y3ckRv;|7KwX!Lcn%Mg z@*5VC- zERyKVITkq}u>sDm5*7$m({F-Z$M|ZiqpyB7vo@4={? z)xE7Qk0s{-44iTYQ>sl7m7#Z_EH+Ty;0no9HWox>t=+*0>L8w>+2sj`JZ zKdGBvPTsn8`r)*rx!c|lEemdFj=7#T9R?kCttP%FOkM)(R-6CM;Qk=}7B?JIVhGM_ zv}L@j2m;jk;}&{hfi@MYeF7@9AFk$27;53os6W+x=kVtJtwT{%B%;Zum$)Z?#qgfx zXJRIA8p0TZ924~25rT2&$};m|x)tfhB3XNgM^Wf3Z6{=pBxSs4Oi*cKQj?>!@{lbcrZQ;lUY1ahtJO$Qw9_y=Vy55b(#^0-QSNGzF z!W2S(qbKskCKTo~v(j7ZHC?+4#*{J$L_^-x&0Its#2c%`|ATk>_=nNQv9zLxn5B)_ z?os&Cgd>`<+(=q9e`i*J!!n=HjI6x`tv0t2uz;H`%rO+voip|JWfLbkc?ux6J|mIe3T8DF}uyRgB8+a&>Rl#_mJYXrvSycv0R&phol zE1mM5VOO@2D%(-aD9_Vw=yM-d>z+0q1nuQKh&_ABpV)F(8r+W0xFMq$%6&b5*(asC zHk;o3wx{z^K^$YJT?gk+A!XJOT_tPyZ9b5692d?3h}fQLtfupzg!>YBcfw@ajk|6- zzPEE!2rx^&uDe09uidq<7_qdLX1>5n^(q>|vBzEYlL!6HG;JIkZMG~7915CUld_dL zA@#XI6Hl;OAt9*Mj2)qp&FB-pQRDR4y*hY!k;#1f(! zBEpn*_feT@Jj>3PX7Wn(T{KT-QFGGwk4RQ<;HzU@|f2BHxs&sNn zwPFe}WU_bfIf8LIGRfQ4**2r*epQb*8m?wRv-^hHR9hDwd>77rw;dA~KDm_Ia?TdB zst_e97XopWbB|6qw!1N#5(#;XuL#SCdeg&t`9>x-Ce1Zlh9X)u3UPe7mM<<%ug;7P zPJ7FM3oQDl22Iv&Li|@VmnR6f&$AvenxEvZTu6FmdqE^RH{*OodTZ-*KADyg2(Piu zON1@v1>l^Yz4xS?A6DNWI~=MlCkmmo&C;D`QJ0sT6JR%q&eG#T#5bdA&qNNg=hsl% zk3T-ftbck0uFV*15wmdo_>sGM|tV6`wbdp0(pyhXBIHe+>bgN=m3g zaK1BW4t(see$xdK#|Dr)exDv@7Vqtr?=!J@UH)cyOR7gf!A996eFpkIew{3RHGk|XK_3YbX7B!2wUa2CAHY^ zp=zo0HgsbtRStY1e#k5{?ub;aN;eD+GbTFj*c%@K#Se!vj!R<|vZl_l19T35b^C66 zm9t8V@6>#ZUWtG~pt?$cnUFCeIZUOZ!~180(le3VW@%vWTxcp>xfzH@^Mz`3w?r^> zW0ObL_S5^t*EA)QIS28_GN^`TQP+Nx!ZpLDXG)D#VRd?L8y?(w2rDQ}90;ViIJt@= zlEazFy7dM74u#?(%%$S!1ec>|E0vU>)W!wy0O^1^@CCT#o?`{BzpY(CCvD1g@~1&- zO45ZvAoWJzKmdX6563yBMIwt|x&2QY{4ah!7uNPY@E{l!(U1ltHe7mv39=MkZ~}n} zXM*`8kK*d2@(SWU-K5g}S6Yx;M$PxvJK^p4h+=&013kr0%|Jw6coDc;Bfyy#fdtX1 zgH&)h_>p-}VRFx#`7(sF*S_%sAeZANB8gBU3+S)PUG#npB%*FuYM1bUkwOCbimkR( z61}nN4d4{8Kb@Y%svVB1fZJ{xxZw~>&O1V`iyn$3;gR_!4VEd86lhU4t6GIczc;Yv zWSY{dabM6lF6}>5tt1^rIJ5~!jF=&0=7oXjFZf`&RZ#aH`QAyzIT2(#Nbd2$2Q-H( z)xGC3OC99oPnvpH`XBx+s~i`%5H+8loBj9@D5yQltSV-SJ_){H^K{VBQr!3|x7-VM zTn)w&>t4j0?$0B`KRYSx00I?i{yZw(|4aEDu=&G3vc(a{(+V#8z6FAbw}JrF`D0}3 zYzD6lw2gQF3L&u!EQzaUe()?SMNQN^64f<9iGV<=#UY6>x&nAti-(keapR%OHN$`(T5I~_pkazK6TDCGx)M(SB`Ej`UU zQ6)0j%}li|O@!|)hh776wM1Yae_0P+J`ZHQy9)kME%j5J(p<-(z%KurTG!757nlk# zH9Nlt0$C5;eIM4o{;?4mFQ;+TXp-3x{fpB!q1RK(1Of6=gxLY7pyD4A+yO|7xX|wt zm}&42{pj>CZDlO7<4k^$hU)`Ii-xeAcH6CTtnES^Kp1`BUEtRv(0xFgK=>L%t^>|H zcDE-8>pSh8Vi|SDr9MFQE?Na}m6O3%-QcYQCf4?@WD9%mpd-8bu*p5in`c2N+c87T0)vFZG_cL-MH-$ z#C55K1pbp##fWdc%Bf*N@>&n^jUS=dno|2tCWr?PQY z-}w8c&iN)|g~-~rWW%!xV7Zw`QElRsO2--1E4--j&H||OLC9b3M6XP6wuLUGH8PjWV>d2zFuDgB-9_3a81mD|8Iv+pQ9E_;cos z$D~UWhnZNyn+E2S;*pz}sgF*6=Q_8V`2BrA>IUJQ6s-x8g05(5q;lUa>zosLGq`y*)58xs(|v zNkRpp59SVv;}J42DvzbuRbT z6~V4iE?L7-jl_lb2^=y)9b0OY&`&u_nAOGYMxO8(v#ibAf!DybchE%VA`>S-lK=>Z zyiw>oP4?(kjy~s7D1LjL^u0;@jThP%(q3bU9a@&Z`%PiPZ_pRJ>vFF1g;dK6XGz1r zoZHqDrLT=Tvd08BmJWlCK%>;QhM=)l;%SaVC#x3W+eR4Xl#LI(IdtBcJ)WO|>tu!E zwu{ZH4$nCqQd~X+aWkrCjUFijMD_b696u}W&rKQ6IWUG z*(KVd=~!vT4klp!FjortK~T`Dv%M*_BgT2_1->sP*o%KKJptdS>#yY|_QZJrym&pM_FRY-LviV9W6X~eJIz#$( zvXrB|`LEh>!(_>EO;qNMR>+3_M7}579VP<`vcVNtY6kC5(~+EDN0Jmxk~*Z?Pvhn5 z2v>~qarMk%Hi4t8(JCS1HHZ4p6NuK(Z;;9zfTkG0?@J-mmNwbnd#92gQT?963*Q+-1b0+V0 zX!hu zza5Z5aH1(yBAnTc%Q@iR)Jx!nzrIN+X-cupsW`6+3zHd*3=gue*rDqk!^CMVx5G7Nqa^fdUROrsw13k%NC zKlTXJ1w9Nph z<3G*%*cIoDcMh4!rGXNmb2CJd!M}$Psx5VcT*>ohb2m}BK}VzjhjvE6`$6)vWq=4d zL`n8DO|EsI0)zm&*FyOTeCE=sc1K4bj*c2kE%#P82TXEunEqL-_2?^iSuAgdBDScm z!70)@zvn=Kdfs%Wf7z;rs)w;l&Hdn-M0)e*ZzXkCUCNdXLL7So9IJ?H#5wYw))1yEvNf%MZ7lVm?zH26g)r9(p+C=5pr|5%Y+t71_#}SC_ zY@wmUz;RTqBtCfis-d?ib5Q#j*UXhLmA!zkvYCjAe(TVCy%mYRgxqa68=0_4h*>fhp9 zTunm=vOLj`ca`Zsc}MmqZSU@=wtn{1N~r8RYt~%@=MV<#eH(G!qGga6u~{uu^KfYA z%64PLz;;W&dA2zck{C4T8)dz-9i7jtqf~`+L|prS+Kf2X``2Fn znnhMryqhom-H!@vaX*O~*u9{UkuIyRBYviS7!~z+Yo~6|5O+u(ydSjw!aZUM@6Iqt z&OzNtg_XRw#8N2&2`VHdkmB{pJ z7v!a90(R+bIJ(Muh^AY)@Cz%2M~q>{r&56@W&-9Kj@R=lW*C1l?cBVa|7x>ok{ajZd*y`-Lwj<7U!d3J8_OrTcBwGIqC43u z1#n&lH0I{}o8kImYhOy^FI>y90XmnfE^aJ_8bkC3{{{+>K>g}N*+9qzH2l+29MPu? zz>RJ9gX+n6S#FW}Xf07gTincEEK~&eQcpRr(2`KJzc;&oLM|q%X6v~d@E+N;3h<@> zv-l7ZVZ5r#Vug?FGm*M`J_G7N*LOpHB+{!4ngozvxcw)&fRci_H^UlbVVR4-XkUv; z4b_p)e%v!S^h6{B1h8RE8wxBPWmi+Mj6=&Q>_>f4<_`)X^8LYOn+Hx$L&C?z+D&p+ z!36L$=s`F0zy-oixrN|cY+0nZLu_(sjz^LddI-RbFHd?KuPQ?Zgo&p4Fs6RPkUU%-Zb^xCY(3;~&fZU2W1S47y zKI!iE=>C=4fw2jQ28J=CzpZ`SH*!!#8)P$7GH)7`n_vbADe#{-QsvG6@Gqa3S7BzU zhPHsusdwW)e!2c1zxcpSfB?1L8{ifON(z9g4M@*t+RS4@0i*i>lh!Q(#Zwnn!65`; zTun3f_ZgZk`WF?L7~tBj_3&&|15@Z3gl==CX^Q9ys|jd33Y!X1*NIb^&BYC{>qVqQ zOwFz(kgK(u_TXr&S3Rf=t%C$VU2I=4=iOVm6)Uk2u-2}8hr=HXIW-bcFMF_(F77N^ z7uV4h6Z7t{1TSbFd}n9Xzeu24-`YYQ7&@xnj}7!8Nzd{WK$Ojwmy<#z)1^I)xlNPJ zcuR1CQ>8-?Pg2EQB{qx6;}!+n*(b+rlbvm4Ca7Odi6cS)Pg_As2Wd}dnv5roY-K90 z8H_oGt%0d()pr79dO5)TS-v$={%3iI#bUSIr&8IaIM_jY?=2ZK3mJWp#$d4t#PR6E zqqV)6PqZX-g$mwWou8i`s`O}rcuWm7o(Y8V5RF%;-qvlq+W`1qg~k=x-;xP+74&lB z1?px`fi?0}pEhr12_*}BQ!>}iZk1Xalk%CKb=_OCqg}$8Pgh%1<-h9wdybcxx}N-P`o&hlOiKdF(b6_O_ZjoPL^(q<2gN&Wwx4U$uH(1H} zneb^&v@O&(EipGGfC5*N&Yoeuw8aoD{%)~xJkf76JpG-*1gHbGe%;J-1&YP#+~27T z>=OnOf@-mkcymxn$$n;`ELmL0*94iIX)=5&5Q})0vEc#aH)#KqyDk{M?pr-6nvrbZ za4x8fsM}FnqB^p-cE@gUH+8lNseA@Bw~|(3sTtNeJJu)N<0$EKdtqk@@H_+Tk zE20t>P@Ar5^>AnrO}CZ?%8wkTJb23OcRLm~VPiu`N=iYEmTe=0osg8iS)Dn1vlzxo z3XMuS1VT9Xo*Le{g>jI@3dl~|43K!kQDtWqKjtecX3n}3EU5gt_=SEQ9&wAC;*rf3i zm?~L#)i;UnmT0RMYZnsxpL1p2au~E-ICCG8T}piFR7LsOtxW6I{cu_VJnO-w_{Epv z>0(zDl;^rxp+gqfAzI6JGO~DT5t%*RkkPfu5)lm*i(O{QHO<9 zTlUW<<4#1UN-SA;g#J}+*U9a1tCA;0nA?f)N{q|Jz#pb{uj)~%-c8Z(Ns9rwf91Tp zL(yN<*)Yi0L$ZT8{wv1%LYdFedn#rrsawRb=8zEg%bk|;b?3mfpL7qZwrbM;2=l+d zvPK#HN$l)?mKctsQGH?@96b_z!-NxjVH8Uu@_BOXHB%GDi6HSddI)5dS-jtG4>5|4 z%odWR-QD{YQWfgIQ1*v~4SyU0F;`^t(?~hGpF)y2y4`ffZm|~HFO~f%<83z|)-!9; zy`ld8_&}fVn`?hRFvUAD*|!#lOkre%+tTJ;nZ`P*2!ol;PLLC00!G~C2WT%J-M9^l z_}aSmlPJb=N*rgP`XsRRUo(yh2rEzAo8G4O?pjh^^CEc>;M*?gt6#ZyD50V2bPN){ zlv!XtCqS#HVIES>wyoZKMbdrzEX>81qFtkp?4}a{lljm$m||!nGGHRV|82!m^;fAi z_BJn=j+XELkx@=8bMcu8*)khDeGCHm{Y?|LU*o*bm^=&Q|Jk7|4K5bmKiU+9OBXf3 zwc_njnQ*Jny|u0h(&oZo!AJzSSn+G-U?0{Mc0i2}qq~(=ao!?qEJLa!q`A4y_$<%S z;w})3EcOOwN%<12H?RZt=pxNmdl=ogFS%= zolJ44@4JdPq4a_(Y+n0P`*(^VcoogTUKi~6K()txX^}L9Oe8Ixl(A+!JyCZo=ngGy zL5_S#pveAO7q@L11kx&kXBLAmiya*FSYPZ$?PTce0-2S+r{3=IHSL)#w0pW>gEk`p z^E_T^8{eLj$w*GOPsXw)R-@C5nxRm5JP#ri5* zZePX4gfVF>)vN>S!<-tBO0cSup`zc_oEBnmIR_>SGRb%_VdGRntpV%j*`ai`>(ZuV zQ^1li9#N3d!PHVKb0nk!gBasMPXl9h(v@T0GI@38JN5&&AP}wo+2_G-s=DSl{*gF= z`jd}tu`;!7ca385_C6IV-L9n^QRD_1oqHYNrIHjkjEYukn9}ggAb%vJ}iK7{_S0x79e#3K%b{y-wp&H z{NaMqNSc=oKecjjy zGIdP!r5nEYtS=68l-~|+ciQ8uq#yIi)APU$SwSH0?ZK{zyz}9>YFQ|5f7{p91>S6I zybm5_+)R2N|EZxh1XLmvzve&bhTPqk zKY;IjUr?(nRAxY`uG_dm_f2iMIrA-R+C8_uQ@Cg$B6Gkct>w%#H=jzu7{01#aY1Je z%Uf8Ol$9}-(L&6Jcn^<53Z1eyIz)x1-HhQ8Ivcat_0K+#){-<$a{zB>|C&|sitQh5 ztB|=>tJuEE2^Wg*mlyB@=mzzIue|Mgn)0Xi^82#H_Y(#)2Nm|RNQ@|Y%XbvFbg7+EN&$<7Ury!qB88{-xmJ*i}M-`GV; zpcrj%b6A#T5bL~Dp_n{~U9%kwBa)5hMbR6$k zdUh0KbCm|1I)|A~toWE?eG>9id+nCnUg>*`?zbw9Fh=71#@zFTPaBFGT%1Fnrn*Oh zblro*-5b?0Sk>AykpASf7q^M>eL5MZDtiT$q<6Vn#y1iI$rSg~2H9{Pi{M5|hHC9S z!OXCy^T%0km^cQV8EM*D!#I*g?oC4=lEU)c#Jan`d|a(a{?C@SH)`$agqzcDHyLe6 z$vWQ~q$8GVqgfB7P3AoR64U1#SrHtXnAVX<4KY0rft)}O_KIUVLYz4jEQ7*2vhVJ& zK_H{v`4^77qsF`reSsy?`nUZ*WkC>#^atd~vAuSpC>c3Hn!tgOjc_Qc6QIF2SL{11 z$;`(5+Q#r>qp{1y+rUkTaT}jfxI~FrOREABK94V>^}klY&KrDkuMY+b3xJvJ0W>n1 z;zP{gYpL_Yt$NrF&xTqKM?c$0 zQWXNGaFk$vUY&yojMlXA#L(Y23<#3(dz%|_viC2iyP*w*^eN_L<7Q|0?Xo=jfC!wi z9*;1GF`E4CJn7LJ$7vovrt(uqjTxXOdhJ$1i3!8#BRu|n1Al8J@U>Q=Cx$vXPDK^r zmYl%k76rOae7E!<3w@%z0FN&e8aTvBvnuZ0Yp zcX+t2Mv<@&Ek0Ppfib>B_+3ZYRLd7%qElaW@LVcDzDW(SHt78Qyv{)u;w!FxH#J^4 zx~)gS7yg0$^grQlTe7>-Nd9g>2X;XqbZ4Q!Y$>de89+WnRO5dQ!rpoSQMEd{MvgIW z&c(x~-H@6&@+9FqX-N#CB!l}fZ~ZWV>stplwXGQ-oE~V|-wlg9+@o+Go_``^ajp5F zO2XY>H#o$#_VS~n2yXyg-MpRGF`@1(qIFaJp!tz>W=tjn8r@YSnd;@*xY?|&4&tuP zk1r25$%kw(6?2U_iq6DyuVhJF8N;r9U-_tTJ5h@gL<@oV8ufBT!KApS#j!VY zMEUJA#l*efUIZ>BY3oOM?>5pO>%F;&IK>4c!DR*gToa=oO62SZMW_AAcsm()Cgaf= zh=PK&KpzL4u(_t796thSK6qaR`t&evu%)9>^H&rE!og1wL3h~r{K@2Vyku|%fS*L( zX5HN=1FQ3IVIOPD+OOyMC5cJ^`!!#?(CzsW#o#_2s47h?vRixc3Auk(V_wiNkB~LPa({t ziB(W{M-22aa`-GUsm@oA6}klC~m=1hj4WEDEi!J z9}RQagA4b>w1@k9+Fy)shHd}&+GquKiYdJyb%QY5oLmNUvsuXG8jeZ4@e(k~{(mJ4 zKwW?i)t{voh`Q4RqL+$~gHb0v_5Y|rApV?x|MuT*JOilObMIrY7SlKu;DF^zSN9GR ztj5u=U7PWzT&zPsK49n~0~7vv8^B-XGKc^a&M80G1VP*R1?wdU%UMA*fX@V;r*p%` z40e)3Hr8Day4Hdg?fgM1XMO~6!^dire^KuGcrNfh&myWui=Dd3UEmbGHbM?y@q#EF+NnSbf))WTYN} z;>pWgCu2&X`BOxp_UQH;+phIlq+hBfzw7;?35OUz;ZO4@uz2eq8wG3iUnZ6y)GEx; z_|xrDrJXa!GT)jRs+{ms7d{Dr1dib7h}Vs}j$MqDfuFR-bxIOT@`f3~qwgzT=(Bp7^jaTl9l{?s{_|fX6ex*SIkFgVwp~xK)N1 z(W{)uQ~S=d4*e=g~`lffELnf+xI_#wAg$v9po)PStD(#hH;dw zU9;@5lnZB_JWM%1`olD*nIS(Rb3fX^yXTb7wA044M@!skcdJI5xYOHLwc013xWifC znAR5)wfXHE$KSwM(f0YtS*i%}m(r%b%S>>n882`4UMNk_{#w&?aGJ3eD6R-1Vy_qyt? zw@2RwCaEq`+}oAb8BwPmSoOFuQ(do&87zrA%K+c&qGr`))hSv$kn>ROE!Y93SU21y3Z*64C zCc-RdHiNx2+;U6TqA(~p-m5Ox91SH+ztLC}$)o+|_(r=yV*duhkRFXIuFdOA3JuP4u6R69$^JFpNR@H(q-vQwDw;Q`re=cJV_Hl5Ev zq@NJXGNOAH=cQB!Zpu!z5)|4Rt`gT|dmixNA3NQ+6R~>7yi7_1iK2uzeuw4+MiWgn z{M2YXTsx}k*Q%e%XkO@*`6Y+YmuM>cy;faYw?pNSJmCUKzn&N2A&l{K!h`EZ|{j?)DfuT6!Qtc7ZyCX7?s&y!~vLSFPw>{nCF(}gjFUsNVDK7%b*4l(cel!iko0!uQu~InkFeCHJa9Ba$(EUdT0J^h>hG zltXP^h3~VRz#vf%^w_UT66sJydh>cv*z6FQjtVdbd~CS$4k*M~q{Td5Ka@~-`o8po z{6{CZHID&9+~A?l^XE|Ba?v&aY(t&*pPlleTa+SZ z`a~fbiglvBAg`ub+*mF;Jr;`cG#NXQSUhroV4WN`ebyb2ouHb?9vkoEnKd73ULt#k zu=g><+=+wYp@6YyQsj`$oM>c&{~4;UDH$6d*v^3S=A04JE;AFDtH`0(T}hmgXfte6 zA>NPav*u}H^+h>96k(Wwz3We;s9fYFe?|L^qIYfEBm^v$?)>5~gsQ@mQ0A8$r9Su< z3E|5hxeF-`O=pN#yhu(N2||8pGECQL+zK>&IQ*lUpT{fH#M?tJi&0f15;w0k>5?0u zhxerwgM~_lhWt^n5lV=@?u-%41ZGlRiu}mr6gRf3&$m8&jC0h98)e+Mk#VLblbU|5 zOmBOsEx4oNF&g_)zPD}wAE4(03PSdiWfG>sc#d+M^9o|2cyO6H;d)mg!P z&?!eXyIHXODO*LNtLBm}FFZA`_8$G!GD4t|v4$R$&ay)sz zOxU>TQeAPqf<34=TkJ;6pALx!lLs`9;XP&1| zG;SW&?(E8zv#{#F32-6*Fkh^{`KLj|V}7XK+{bI)g^PVnjC8iP6j}$L0k4zNk`ymiv6a$nS4KyZOX*3SO0}1D z@~Xs6ur|t=x}r){F5rb#MyJ)p9_Va{s5ndDoJE@MtGP3~Be5BCwB3`>gPxnp{$-U> zvL<*Vzpgtk+C*EFP)X?0KO|{PXNg;@O2r!5M0W^>KG^)a!CCNn&t!*N>R)eti?pbd&TEVa-D< zJmdEil@+>&zx!(PIekz7yxaD`YFP6x#<(R->0@)dPUOAZw7d@5a_wMY#u*>&@3QKWm}>u92dx-+!R_<(Z%;M% zhXy_Y0My5@a^#u0;b^G6DDN%w9)ZuI1eMc|J=Jt!XhMnF^~f0QsLuM?2p;`4i!Y)hH&v(UT?R0PfMyI0HqX{jQ)M*n{MeE!|?$U#;h_si!M zNXKZ2oG${=_pIF!Vs`bPn)8Qf3VeIm8N-VSxY&+TcTY!@@39-d^z(-#y-}j0K;MSu zu7d33KOFV%yXHK<x>D~hbjmd9t2ZRveUU8aQvq(@niO~*=IT@ ziMw7gwcXf8MWhoqRAWkjWA4Gykudf7p!Omi(c^~|*f~vn_~9JpGW^_xNpTw-eL;q- z{}MIgyE3~ZAeSAXyK4SGNI+GZRy;|vpzx)=l>WuIo3byZ?FY>K%?$|N%?Q+a3)kSj zL`5;CVc!l8n5dhfUIZyi)Bbc*)syy&z>rJZ!A%V)e1_D=;+w8yTndN&S8;E{MtW7h zmr1_)dS7UWh+VM^j>NL*UY2M9(+B|}7xRiX5LxR3_8R$}}gl5!}Y&YZ+FsHa-V!p;>sd!9~vOL^Y1>d4=EnEfF+17p)x^ z7<8?mV$soOh;MnH_C@@c=O4dAb+4zMdItV+0) z{W+(7r-??%;9^S+HTmt}f*5|%yJe=`V&ZtS5q)Zz0Ed3?Sa%v3CS*>@T{SP{qVcwtFLg*-kHEg1ruz!}zKNa#Ck0lF9k0p&4bgMp!n)zO;cu7P@G|jLCO6;a*RTjw{>3>g3{ndd) zV*QF%?|v{4BXamCT8V_lsz*C-Z@@Re6a z71eBYabL-PBjst*a;#{2Rngu4`&wrZyi6(smXW)toqCnpT_i#IUO?St+jky3&g(!c14U+w2+gG|Pj z4A&;0Bh&G!FU{uKv~Lm=?D?ZmMjp7+*g{F96hY&4AE)-m3ajxie59GQx01*kc;?5W z4M9t4(Zc7Sv?DhWh3C4TxS4F-=UyGVdtmzb-UFW9hDD@%$5Q;^$or>_CqyfQoXh=C z#fDAO_m*?JGwGL5sw2))M1K)|kY}akbK99TRf@-Yl*g_PiI`|oAm$HIsF}t3FVif) z&YUv3oyZo(qg9Nlfk;}&>Z~on6K=OjNRey8Yez5cG;I1QXC7m&XrMwbr<@-?w(DRB zq1wieNkkZwZ>=Eu-89BljYfz?N>~s@LbS|~@X;G>2eAbeJNDds^$G>UnSma`LbpA? z3)X_}OchnDQr0P9SHN*a4YaAB&eHI(L!vy3K!x%eg{X=?O!ZP}n$D8CRN zy4(%1hCc#avW|~@$i}{EfGajSdc8NdYaF>dW1f=`7ys!MK?x)K&hxCHjF-sI{{=6% zU*g$cMTeMO@y$aAqvg^bux^k|cMA{UmF;hzx_DhQGbc_25+@Mn9| z-<%g|G=lr{kB$%YEK$DhqsQnRNhgh$C#R>F$FTIIeA3r|j}akBm0Rt}#H~kaV>Lzz z3EC%icmpKuP$A5P(8DyB+yS3El=|<87b(G)g#G8grIv-91MQf#$?6{28l50Z&%g;g z7fJ?k<)unA>6_gPN4zzp;9 zm+P(~C`nx>Lxw2D?aa)MJjLc^dYtL*?x(KD!;ziB{Gw$zH;tE2i7je~Wl5n%&DI&2 z0}i$RMThuXI^>%f9>2(&-_JjOeDT?siRRON^jcz|k_Jj8POwpmC_3ymR<+@Ti7!sX zK0X!9Uy8$qWGg{aYYlR&HSuaZi05mKb8~B>K5`7Hv0*c@f{jqW>t2%grHflx7%ZNW zLwX&943?*+ufz5Dlb6e&_-&*>!_MjX)tB+-QR zM{125n6I9-l*29@M+@sF*JcP8G;h4jPd2{7uwAG}tgE*{UWtp;WB3!qj^y2l$j-H{ zQUm28&0^cF&{jKGs>~M7xG&x*)dSt5G&Pnbitif}ORyz>eElfMS>r~g5xno^_Crb9 za_IHb&f^+nRa;kLq7tocc7iI&hu5d#aaOGv>s;#F+@S<@u=c z8+@3(?Bbi-dA?)YjYyu}y5fN8{$pj{*Gbi?@9R<*ExmWS`3*}tF2lFD zZn0$5`K1-rt?Lz>uX=Kl;}1{r*)vYh@qZUshsU7Q zi8zkw-2~Lo#WwjxSQFG1kM|qvpACA7y ze&?Pvp~&}~Nu8!=OG1}Lg7|KExmuK321lH3+I8=2s=H6pZS1!H)IO~>z}zC=1-MWY zwxWTqI)z_iN*V-xKI$yT*viJ80o)aQsU>M*WE`Y0$PWs8r`+8c<;EVIWh%Qbvwe%_ zFO2-+;!WdE1o>Y6ptxEh55!Ren_f(6Nx zoD^Lk1u5^U<@A>T0qcJT)io4s536k^tsJSsM4@gtmJ3U`!YEY%5bEXzu8ZZ>H8V=gSp2W)9I({$JcbWwo&l6?_q zp~~Q<<)CXYfA7M+uIvtbO_<=oFX* zfR3*i^uepz|f-UbGyYv9?+Z90J+>z^H=0So3fI*{f*22*#`d?U$38XLr#El zlq^@-M^F$lJaWWgbT%|wyCH^SJv;cksldoACf85~iL;G798cz*kiYlunY%V=kj!PC zihkPyEgX&o;9dQp@2-PZ%>{0gQ>%>7=Nj!9(e0n`c?h%lgXG^dkk+p?{;%~-{ z9`-$)sVR*76e!E>B`#?on(BZ~9spcOY zsJC$0sNKbFaiG=&%-y^?(AvAA%{MRJk!fDiGHw3b@(^SF8y>V}mkELNe@nlJIjWaxoB`;goY!(d zM_CFu@HQTOFO;oqLGR|7Zkz{8OIO7!L}B0rVmoS#{}#HaAsaoxDa7eh#>Kh5ZR7>= zx5|Yi9zRv{>9R<1*?#Kzi*1{h49a?<)gHY+zCl$NixO3xTPkBC* z@vUJhFiq#3ejqX51i*(oAugP)XQ1-%#Jd3K7<^Ja;_P!Ul)To-A!_bKU~X**q4v9! zx=QTft!72rm*T^b;x7Q-k_kGPH2$L0{d4zThX>km%q~X9gxS2>Me<376wvKxsBRl{ z``=guR{vrVbWCK~WahLq3D^`r_*(n6?fGXQN%WF~3TZpN20#4H*#t54rS86QW3*x$ zwi`W`+Yabs(VzUP1wcIjsC0Cr`Sm2qAb*dmx>Fhvm1xQg8iYlIg0&aZLQBHz+!z5W05{DUjt5-?%%bIqSu zY7=|7hwZTiis7*29=1DCz5&yF1DFWmtO7?o&G)D21%O!kk3lm%Jdv6jwjUox#T`mF z-wKlOcj&h`_>2EbGf69^jOb>bgAs~_hJKR6~lPb@uet=-c ziWRjm&7B)#H_;die6vNFPZN9sCo?i+*k?M6zIy<8F6%t9*(ue`GFxIF`rJbg8v&UY zcetag(Vn>0dWOzL1M@pKK^YR>>woU99K8ETkhGY4ziy%QFHbKUU{0Dh!?Ov`r^`O^ zA~dOvL@Nwinnz>GkC#jI%sHBCSxxV9mR}MXMcsbbwL%~WZRz12qYM|fIq_ zFO!?NEL`Fg`lTti-Yc9ePfww!zzQsquSfZ8@E zMZ)taXGXp&6j;?INM+ z>}MemrcCaYc5!!FRi1)nx5aCYXJ_7Dwva4~#Cblk;EVIX=%Q<=HPCpXa_`EB3Y*z+ z$j{6AlrLARuj8&PRvu8B#@c1(z2g>2k}hDB>%cDU=-Sn#SKb}82(24Q*<*r)KaHM59W0){N#y9C1&8_0c`p#9U5`uuJQmM7Hr=vM za&H{L2L8<^C{6gA3H9=*JOX(rmd67A{JZh{D`0m3Pr+@Gg7Q7QrP54gECCIjs$|yE z+s!||eg)Lg{uW?Dq@|#P0b*`XPU0+-f5Xpe@>-B}ub_$MT4*+hI0JJ1caEab9vc=h zv+1%j^pzIk5x(kgjM4c$*=4{0i#lfO3`#U{M1?`|s69Y(zO#~4y>4LXUu^L8tG>e>ljN!wUal%dr2+WMeTr<@S{qhbfk}95o3+DCEMlFm)xw`Mr*$-daU3(1b z0BJVf6m7Kf_bc5HR%fnGfmj`|^TXo>zb(sM-s|P@TFU#^Z))YPoz{O~%#@g*F~XM5 ztz=i7&XnmlwoDw?F5A%m>qPz#3!_k|!{?u`et(jDo&sp`tQv{$QVEykd&sUz#! zzg}*gg%uk;Jox8#z+VtkMP&l9GOfcII5 zhxV`cT?4b`{6~JFMp>FR5k?CjSNu!IH=jNG_uIkRv5uehCr~rwi)N5;UAh7psA^)F z`bbujd`_f{vYYC!FO&_W5CzZ}GrRm2p_*-SFZ8sAM)PO32ld%|-h6OV5&OFp)W<(_0|(0( zC#KggV2U4X&RuBfniK0OC49_COpp-;=l?7d$P+c*O$zYRGh@y zcZw0mrE=H&gVSSYt2+ZdGVSYg-7b=FD~d?wzUjT<+UA>utx4mvmK}_1mpCqD4f&4# zv@G#G1}J^f>MG_L*4w--$k#nP`sCP2{QwO;b$&_rV%FhfL6vJs<7)eALRozbfW+_` z&A5e6M@Hl&==w?}7Ym3-;tzx1%V`sL0%S@n29%_uIii&goNR4)C62r4NTjnseh%xY zFFN(TF?B9%-yu@$7?<7-Lh~!eV>}|OOUD~5)VwBcGA4!50O}`!R?B$*3Q>COGA#H; zL-wq%+(|*oU*aKguSTRL|Loq>sh+{dV4+MWVYD5r6P%1S=MHmVr8maLI|((7l268i zOD_WnJyp)9Jz>v=vy1ack$#9C(GBgjY38gmv28}o^_kuzzlT=*vz0Mf$_0hsTu zk+>#rfTSQG#DP=c%QebTl=VPB|L6tT-GB3hYZ_pY1 zN>eW0#+GgAd;pN9^{f1d+s|EcOS~y1iaYd`DFv{l>}jar>{xJ`nCu;>xs0g1g$&yX z&Wgh&i^Cmc%f72kA23$4*P3774XaDfRikwz3mRAu*LO=S_MLD$;J1B$g0uc0<_$fO zccO15=9=NMP3ZE>;lUPdGe|lhH-2|}eqGdca*sNDR4zJi{kT6nowzjR7m1P(+j*-ffylTe`5}l` zVjf4udB}6c^JF@>j2hfhXUmtEv}~(1!=)!;>k^DE;7vfMKox|GUDa_3~(^!f$HG z=50!~98OVSVfz)Z+L)twmk(?~j+0I1TG4W)9qK8VLSwO1*GV9q3;c_M2EL%A-!Ql1 z^%y-*4_?^%FjKHLZvc}PELw??4)^H1ECQ-At){(#wJp?r^1#WHOe!R_fOsZ&_0Qig zC>4hr1wErry~Z014(DMJ5SA`s+6SrlD)8=@+H{>=wTU}XQcV1{k&bZ!QJc19eU3Khwqdb~&d02iC8Bms|YoIyLT`g_3HbT-F& z5SWCg4m^D!9)?)`*>yr#B&+EL3aD9{e~IA+*srk0snBhF6h66YE@VDbyPkoFCLRa&|~gY0<3RE|9x63`6wBH6wdYw)^6?YcN4%} z4u2m${8yR)eo@mb0z3U`9cUxTcXx9G<$4*Ko#}CpV(|9?NQ01rKk}dClv2>1DBnyM zjSKD@#RmtwWRTM{!uGT(z*N$Gdk@0CdKSz@&GCP z9X1qmO)m4*y661&Va^Gbs5H#ImAgN%k@HG-FekD1n0zWz23gknBul&)f!AHW&BoXi z-dZ=$>%#hY)3*qTnrW^}zh?Sy;{^rSkyHurtIl-1mm=tq(PM2^vtOjc?&K3%Yew(l z1Ii+V$8WLoz&hU0`&ZfdfA@YLnbvGPX`8IGU(O-cCP)NM)M}QJE|JsnP<=b5f=Z)# z7iD`YhZ6kp%5aKKFsL@A*Ev-gh~f9}QQVPe>8D;mhj@iH(t~6Nq%{SJ0QMs)6u#6x zp}dWnx93Sr;+K_eWYbq0N7PyOV^#=Hr92FBsugMeD z9*5EZOg7t#jqN7RbSimGKyythmsh_}3#+WWctK{qj+CN|N(&wxu&i_ydvMvjG!=Gy z9DUf(>pUTG^NIT*i`oIUK6(ap7QtzO0o%@tqN`cYj$Z#$2a}feQgQk#Fr|NFwEhB` zctGt9TDnoLpxHSH4sw3me$v$0HTQXYXFqhtM7HX&E0%Et9PL6f@Jx@3)OYwSXf^2^ zVwsXXXChMx$V>y1dQGRT(QltX-#pzhBspLO=b>P6403)I)WZ84J-IGDCVWSXU zaV>8!3it%hBhu0`&*eq)usf>eM89*!Tv+KryiVA#iX)e-{Y@fY2xoss+52Tm+TO< zt}b3u_ZfPjf}$r->D_ERI?JV2y&cj;B9>>)VA;eC14j{m}Hy`oN_9J>tN?E z+1~(1bcL0q6FY*>%BiN@%Xz&;Rh=^R`*Q&nfJhJSBJW3zWHZzi=A63KG9*s}xltY+ zbuy2BlDE#t=JU`t?JtT&Fxrukl?{0@fb3wDIcE1$tPFop!3;N?Q+00Ww{dVQt2j5h z8&L&S3d;C!>RpsbJS;3T2keWzq2~*@{5uw1Cj?Ddtk)2Gf{;&(sXxE@_9??Q38Kj| zUJ<$<+&AaMB>yXQzbHPSvso(n`^;`nlz|4?5-;!QKcu*+KOqii+$xy6Z4KMn&D}AL z9gKr(*aBtqD$svG?+6eV%`nl#{4byr_h r@QJ`X+08Vdn3(=wc3i?=_>gSp<6-&zr_cTe5=FYl diff --git a/docs/media/tui-lock-v2/runtime/40x12/model-effort-high.png b/docs/media/tui-lock-v2/runtime/40x12/model-effort-high.png index 66ec8f7300546f04ee032dfe7446547e3e8a6655..92970fe420b852c4a4b598c012ccc088a3195e90 100644 GIT binary patch literal 4450 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 z zwsX|g2x!glmB)XM{~&;d?P5EY&Q9&6Z8oCbgjj!j9{nb5qKO}6OZIHTh@?u%n(CkF z3k^fdbw%zc|^(URbfgW5c@D0kZjwjq)Bb|zY9 z7BN}|^D=nwE>O%7Ny!P+R*A`qQ$1Cs|6*4A_&WVAlN$Tci-}Y&+e(x!V0IgBBWUXK z;UzrVWypWaMVxHi)?t_K%qW}j!WeuNrQBe4%jPdDXm88VC~;R-WtTCxIJDLLP!LZT zI0>XFEHKt&u)8kb*%o~*z-;f%4T@Zvuy~&xplo^b_t+;~*{d|~1J&3;lY#Vp70aZ| zp#(B)m2&U>_qNmJCrJ!Kq&PHBIc-{s{rV)M zdwf~TvQRi@P%j&G(d2^IPLh_?&5|G2{(%NcyJ4mlp|CqZtC+u6fFJ5>m1@3x^&i+K BkhuT= literal 4578 zcmbtYcTf|`x)0!?3ZeH7(m|yoRf?fVGxUxakbvQc1c`JDT?C~_30069nj|FDBPum0 zXs997ph6%>F9Me{@6DZiXWpCpX5P;1%5LW28Nopas;x002j|h3R#Nh{E+*<;O%#?wLfo_fM%^kC zGh2N_+x5O`HHZlu4d6H0=iO$4bV!ez7tzZC2#x=vo}Q|4vq}9}bp22z1P*B4q|Y7P zLSIMKC!Qet+2ij&leXMF?no4Jb8-<3$CB!H$ra!QeMyrGM}*#fPm*STtHzwSs%Z%* zv2@{zy{c|$ic$GSuiH{Ii6_j8YhUgH4F~@V9#){AU3BEHM{6uB6@uxqV-R|uA#EEz zRcFz*ceJXeK0d~(5SbV7h*y7g61c4tDI5Zlf5za%ISU#*Q5fhi%$EelB*5w0yLM~8 zp{BTDqZh<4J|l$}!fkRjo&_CQY747p$)*C|zD(UX*8~8~>MZiE1R5Zl=letezrT;h z;QumCVEoT+`(JJpju(ux9(*Q0DyaNPK1BasI7L=$Wmyi_ltE`wf}7t-L%*gduUtFm zk?RVY1%##CO=8$V!RbWJPx_7R=*q(Q*zu%_NCTE=+lQm?#2CwUc7EQvcaOtEc3S|{(1gs=9wQ-$ChXYjd zAeyV~+sG>U+>t5_gfRaJqUc1swEAvnm}&e)XZ*7r3)vDaB)#eNLF_|q%B8e%xJK*C zpmqtrRG2|OK~K9@qJ0=k-$?B80)EB2mffVpV1@3%<>C_P``IxMG@K0<*Xf)lVdhqk z#KoR(O8%=aWyeP^`_mbvc*mX)9+5F~F{w4aack@}C2X{kfV%V0HcE=q_N2ry0u=wB z0)-<9@cyx9XVVKY!*|z z;f#oEXlNJ`8@iCX+t50~tp;4GS3uW68XTLf2w{n35>%$W?_%8(Ar^HNWD|9b)OF<1 zLZ7#2Km#ySg0{!MEiV9deWnYnlcKJCQil#!c&Q3x5n7M$JsSjhG>w+TLCA-sx3c{hByo{x~1E=)t# zEHIuH_G)=pU1+WVW#eeB7yY4Ts--mUpdy2FRE~{^tlJvfbVABcKC^pkm>7_5r-|0B z+dOwmq)>@X-LmFTWM=aVGIYaZOzDB8`tO5Zeu?(;<)v`Uy? zb|CgpT>nDGP>-iSAmi6fo`0tO)3!OPJa_?68Hn=;$z7|5D?(GdC^DnGH7khlGwbTX zNA}Kd-+OJ&202p3cF+VJHWsS<&K3n>ufl)pO>#YQ7JY?fdtH0K$j!|w+(eY2L=g|0 zRpe$3@;7NJ$Z@_qxkW)2-nLLb@A1AlzC736f!RFyxb|Ef^g}GBKjpI1_fZOr1ujD` zU+Z71d-?M2xcKG#!g$8g6(?c@U(5y*1lYd174DZyUqh_vsR*rIZesZ;ip}1sYlxG3 z`yBbOsijZk<0*-{zakMbZCHJ)xtjvPbU31PB0uFr+Oubbe_WV~UUJ{x8zCWz$Vvms z+GmQLSM@(|gDInpY#)QGzD&Cyq-KYU`8UcW|tEk5I< z@3?g>K`LAU6uezo+X$g&qu%3x-|svsVxQKQw;nR){}*XN#Q3d1*=-zx>c&Og)gqZC zFR#Uf5(-1DUZC2HkA#1aez+_Kj(`7FZ};H#D{igAHvM0li;+*>(EU_2*(pM~%ETTE zc(Z8TF6b;9E9OKRgdkUhttewk%j=a6lZ{JykBU3@I)?$GACmT?x!7s$yb6`Q1w2|+ zrTb^r{Jn_FRByY|ep)_Xc~Vd=wmlU=rpylJudNa*PB|xza%u%CM;eGL?}Gs@@S`9t z@@8-cGwx^vl!!Zd8a4qTt>wWgI)KBvY2f$yTT9HwqW&4=sR+_yuMQ<*wTOprYw45> z<;{vjd0FCFi}x_HzeMWxu5@?dhH+vh&zZ#@KDq5qVpinVNengAo+N;O411Tcx++7s zriQ`~$};30Mtsu79d5t7n`Ne?MvNdYvJZ^g~qcroM7R2 zQ29V+@M&6&zd+gVG~6b`$B*=&qURGH*nq8pk6b}EnPUoAi&c8iJuP%_3bRS)<1WOpphNlO zPoeFOKGuXr1LSieZmBErUQBXQzd853=Xd8J4C|p(HM(Ev{l|+Pi7jUSADM(;dzF<YjPmjug26b@=0ci`2=x3&>iegi1U`9Z9?g;-q_*ZHtU+yevN@kSCG?{R$c3 z;Wb&zY)qd5=#&jWxR_+IUrP6G2#5G+objZzr#^)>q!UAU_I@-5Cn1VH?_@vWbW4}0 z=`E8KNqzn>x!@}k6MJ({X6t6Y+Kt|X1ehMQMnBSCTDlQsxts$=X6Iyiv+1vrcGx%Hw&{0y}*}g;V#f z2grx<%Pzxyic2fuqRCS|^>1}UQR#t;s2wiLqd+G13cOOwrAU-kRSZ4lbySZZG)kmQ z&;PsSup*bN?QM4<^K=6FnVPDSzV33VYnnWA;k5)uCsqbV2v(qB=Q~9b?q-^K6 zPU>r=oVzaEeo2!MGFVoeVr6OcQ<~pQeqtr}yJk6q>v;j3*V|4$h|X-Ev)P0h?L>>9T}k8&!B37-Ceku&%F;&tDibAao)LK2*Z9JhLUY?u=6lkk z6eT`ZnLp?jb1!?NXRE#(f=WD!W!1nBOo|G45`c%1L8OtU9X0$lPx8)QqoV}G-6F6> z&quQR*q+oKd$!Qa0RPo7Xj7BHU*tH?RHAFUr^4{-6Y<)On`T4LQ&#i^L*}|zy|H2D z@+63ij6qwBv4x>>{LdLo$cZVFf8PC)Vw!e?_6lt-l*!X#;pmi4l|8kqqIw3rCoyg} zly7as4@~6L^s_f9>dCC&J{nJ=@~U95vTWZYwfM3*0+iZ2%i3&Z$b0;?coT24*Xb8I zG^taqoi00%Nu7MQQ48+82oo37TKtWuf&=(XAD;@Uh|K^3bTKI`FFro|$3o@VyS}8- zKd&b+&c~*lj&uB5Q~bYfURMt7p1(icFtkexuejDc_XMf??fbikBEM7y-k&+Uu2G0C zgfnCxQEaV_Ql$=-I;5J0RTIau?cMg`rTHT=%xTF zI=D~s(u4_SFgjFRk)OS@Bf67(C!7x((B7Wj*ze}cdAzhCYkO)(ufo$NQnjh#$hhEw zm}trw^y4!ww$Xl>Xw_MewCWi3ry!ko7L$fB7bCYso zkiAm^o(v02cQN}Up$r$J~ zoomsQR7nKneU`p+w=g8)$L7Glqw)Wgc%Qa_iINOMps71{e;-?z*_fh?eIEYBzCXU5-I?7pJ7>?FbM|+BC-I4~9tYbMHU{c2I=3InCic0Bqe{1rgP9<~m; z_w*^f2Koy6>UkHOlb=uMZd;J`JyEBbc@h0z)R|=QwG=sTn6~moY})#?qn5RCkUHb3 z=KponEh1a5GSsaRw^q0N2B>4nL(_w*5vmMUDrbt}J@4x-*8t=>tCv{o`#GdJ+9qmZ zOM7T5nbiXVtbAWC+o^z29K=zZX+k(Xp{`hN0EBjwA$A|W85h@_INESAhub6VpeFs`CHz*2+|XR{WhQZ<5y>m~q~aP}V$s6TFt029~q946T{#w@#VxpBnKg=QU$1x-Kh zoUDGr9U!w*GZ(^c-=B3p3O`#7H0tO6uO9mkH-55p+`vVjK*J){^Nr<4OtQ3>qb}Xl zK)m;VihOicMUc-EQ(k`2OE#E7ywQelW>kKpyu|U_jm**_hSd|e#{u>PTuY9~qOJjd z(DLNfahzw6kJ>Eu?b9oJPXq|XU%#aW_1$H7GLhOec>bxUe>xpbOdBhD{?0Ul&!P53 zU3sYTvrs*@gx6UlgkK!LAk#83Lk3#8uxngI>{>LtFDb0jGEw5Ecp-l5NfuP2Ovpj5 zv98B>t&)HAm;IciMsI$tUM@83u>DgcP5&Fu9X@XO8u|VZG)Stk%HTY;K_fB4&n_t> z+y2=`L$I@0)Q|HvV;&&({>Hsc{2tp}rMH(ysd=jcO@KuIgn+J0h&2zE`aByt2$y45 zy_BfvP4jkGb%j42o&@aTzg-!fd}jwf!vKWQe`aBB zwIBapE9d2;2#I&7oY9TG#mF=N2y~`_mz%Nb|9iC2#Egd$URo9lBgR&#q!A4En9{{{ z)|P39IHG-GSKr3|A8#Oi_k2JG)aTizujLlg(1IP=<6%ffAcrA7Bp?qBymqor8i7}z zkO(I-RxmeD9f`$(Y_jENl~}`p8Nvd@M^9UDVc}ZvaQ_{+kg574IBx&QM7zKkp$$9G zM7%f9nuzJxTyk;Oiv)kpHF7DMhjBc>eg6!%98X6vEj)l(*}Y4Q;oPlExCoH0p}YRs zVxmq^vED!KSP;QMD1W>;@JDAFJBXfKg?7d-8h^4_d;s6Y<3ie&aVqYczOYaSJ@==*yA$#ZW)3=7+AH}KmYY5Xq8;%l@q(^S5hxL zF$RwLT+y$hw>c1Xd{oWi>{M*O9R8 zQe>*YOCQMfySHvc9#u5e7ZQ% zILsy7f==X@DZLMQh*7cS|J=yFCGO5w`cPSj5Z9a$(VKNhr;@Iu;0EJSwpbME@XPYj z!MlvOMoW%$fQnkn{nCT-U7xAR(-?*soF6M9E}R9nTz1Hjc(U#CqUp{1EfqP3^ap_P ze!yYxu0VxHhI3Eb1K2fzl}youv-*0b+*@1eY#<)BwDUYf4?c)A!WcJK=^py7Xv{Yi-Z$lGWTiSaHb zHXOyi@uiUFj!mXf`oX{mbF#;hTK6?0G~-sL--o=uPX^C4Q@TIoT}(BgY#;LJhoG#R zz+qUwR%hx?<^HkpcO&n>;V=Xv zL9y}+iwa}{x2CC5P)tr5&*93u_c7%GQqOmYUvMQAH*qZ83&n$UxtOotaHAM;1%-#c zH14iH5neCe3NiDDBHy-)s`{hdo2K%sW5fF#B@FO{M*xU-NOWlzyMmUKlw?ZGP?t$u z3R$wPt*z|Muzj1{*awQUD3w1gt4gl10MwdYj5+V9mQCwkR2^yTY|4fycK6&?5D~_= zIXJdp2mc*+vjEMWH4f1vNFBkQOv;sc@3t*`8TIFKXp;K6A~S?7Dyr=4QBd|jwIjMR zc=vI}up17kX=r3LkvnmD@ss0C&)S(?n~CM)hrdXj>&I@mtJna&CZIuHTP0>u>5W5PL|!|sOpMTu8)3>73(eG#35(5nt|-9YY4op zMITzGY{|frSh%PDgx1)_zE$+vnzmO?OSl=*3f%xBfA8Imo6>mF(!4fwG&`i` zoOAMIP2*Nx>^P{zN*3B*yWQNXVCFdSFPc?v_Q0VYbup_-2AT%4KZTpY>~#4`3%KE; zZN1g@`}6oAamx)~H8x*CKLQvOX;!=0+BtI^upBXPYAF$ckVuM}2;T5@cST8ZzgpWM zZ#Hcxx_cq8Vcu6fY-)ZQG0T~_&n5XNb%(H=@fvv%jLbw&TH^<7a|u-syM0N1yP0A+ z!PWKQ=nud;-U1FEg?sR90-#T=e>m4Nc(|-Tw(ba83|_shv+g$8TEB7A!gsOu=#4bq zu%VS7c-3xuJ(L>E#;N9lAHMKHL}Xb+w65pf{wJE?0fu|1N!5c254CW02nc1hwY0EY z`fc)2uOG0TVIp|3;@^Ie1Dui7@46y%G^IvR)ak-IqAH32Txz5t9 zMtMDxe>BKa)6C4O8~v4Y(lz;H6+u_ub-T&@`-e$f!_>M5NVWU~wBDB@Dlv7qvud`K zv-r7v*>l#d_Cssb$#GXaS1N=>u_r#kC79VMQd#!8`(|Ce{d_1HUuh%S@1H1b(dE<= zt(F)^Z~oFLi$g}zw_RVS$c8PV29c=3EK&#l$78dEC<0 z=ClIEP1tv`)pq3j(n!9*;-|nwMg>ml^y9&bORgki=A5scL+H0$ZoaoA`JQbmub6E7 zE1(4s7~MD)Efl}1$UHu25qCrMOu#7@s!|!^c64+^SNMdIs8F&L!>ynRSDzurs3U%> z-xHRs2OD=*3IIwS8PVtbg69ELn)Xo`eKCaqBh(6mCPW?X9Y~@dal+Bx3lDibI-KyA^pCz_ne@;mS#(~o;#gO#v3FQ{z4LdF zd&rvN1pvreQEOdux2}HT=`|0rn?zsj!XZ z8;N3mPZa;AD_&!OTI-eQOw8Yu1u2oFsM9ARQfQ1AJ7w5yL;e0UZ^lw-_v7>}Po;4K z0Rxc09ZNEx*{r*aVE){Yn*Md3w70i9D0yII^su+N1qH!ijgtevDPTPJ%C`-Lksq7B z3*4nV<~Nmv>59?3pVL{NlPvrNdgd6w^oX_7BP0Ca zV7p~RI9j}%wL3*r`_~=vb-z(o^>Mg6)#;i2x@gY_p_RR|^E6xLh@epHWxCk4vd;87 zU1(jV>)k@g9(2X1-cvJFKX*?zuE)_At)cNScxAzG^O^4U2i$(%R^gSNOj8X5q0meu zOZr>Jtucg2m(PnI^eD4O`4<<@)Tl0@=8d>-W$it5z*eX#W-Soy?A6CA}HK z={M=Aw!2$mPF92`3VV=7y%5(wZ2ug{3Mq9pa39o#v2e+QU*4ci!s#goyATVo1^GyBpBU7Qp6>Rosr3o?!l^}dNvNrn zU`ejgYRlsI2R#0d&H7&r7;(#!4BqKTUCLd!ep;shZ7{9EDIbwW14tHp=_lQj;MU!| zE0DLqxmp7)UDW1MUv$3ekmE?69aS75U6G1k0lB*!{MBVJRNg2Q73s|OxiB{>Q@2pvDZY=6FRgeYOXn)i-? z%CD_*wGGYg8zu$Xz%Jos=xm~nO5PD1KtpoKf{HPJpHHh^s64qDhlNhF$>vuJp!PYz z8HYi-!$85wb?d3GZv_{iB@S{KOOdkG<*wV`u^Jb=Zya;>7LLSVXCg}9rUyt>tF5s_ zxFukmj6WCa5~0;g#4kRw1$I>!s5%0>7z3Xb+#wuS+VljHgXJroO;*Z?IeAzR+ z;Hg^PSFek2mR<8vZmCy}lr))`owETb3B@dp`yK=a&`z!ASL%jJ@zzf4^S16L+Q=7U z8u8y$U6~BYV4KKm*EQJH`+>t)c2#M+FPPl;5t49<%hKn1vUMn*-goXxI$o*xzJ)hD zQ72kZ&#?47F#jcJ-da5!H1plBB4Bv>qeM1vr>?=k%w4!*S^E4Ve@UQe+`0djfIH-N Yw;F?OfElylUsnts80%KufA;Es05ghCC;$Ke literal 4246 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 Date: Sun, 13 Sep 2026 16:36:54 +0000 Subject: [PATCH 05/15] feat(tui): lock farm modes, mcp, hover, resume, sandbox Document Esc/Ctrl+C/Shift+Tab/Ctrl+x/F2, polish Plan/Ask/Agent and /mcp/resume/clear/sandbox-deny chrome. Permission-prompt radios unchanged. Co-authored-by: Mathis --- design/cli-lock-board-index.md | 8 +- docs/reference/keyboard.md | 16 +- src/cortex-cli/src/verify_mcp/tui.rs | 19 ++ src/cortex-tui/src/actions/mapper.rs | 25 ++ .../src/interactive/builders/approval.rs | 73 ++++-- .../src/interactive/builders/mcp.rs | 155 +++++++------ .../src/interactive/builders/resume_picker.rs | 171 +++++--------- src/cortex-tui/src/interactive/handlers.rs | 125 ++++++++-- src/cortex-tui/src/interactive/renderer.rs | 136 +++++++++-- src/cortex-tui/src/interactive/state.rs | 38 +++ src/cortex-tui/src/lib.rs | 1 + src/cortex-tui/src/lock_v2_boards.rs | 191 +++++++++++---- src/cortex-tui/src/lock_v2_farm.rs | 217 ++++++++++++++++++ src/cortex-tui/src/lock_v2_scenes.rs | 6 + .../src/runner/event_loop/commands.rs | 8 +- src/cortex-tui/src/runner/event_loop/core.rs | 7 +- src/cortex-tui/src/runner/event_loop/input.rs | 5 + src/cortex-tui/src/runner/event_loop/modal.rs | 70 +++--- .../src/runner/event_loop/sessions.rs | 27 +++ src/cortex-tui/src/ui/chrome.rs | 59 +++++ .../src/views/minimal_session/view.rs | 48 +++- 21 files changed, 1073 insertions(+), 332 deletions(-) create mode 100644 src/cortex-tui/src/lock_v2_farm.rs diff --git a/design/cli-lock-board-index.md b/design/cli-lock-board-index.md index 3d3e178c..217aee29 100644 --- a/design/cli-lock-board-index.md +++ b/design/cli-lock-board-index.md @@ -20,10 +20,10 @@ Verifier tools are the hidden `cortex mcp-server --verify` surface `tui.key` (`verify_mcp/tui.rs` `apply_key`) applies composer **Clear**, **NewLine** (`Shift+Enter` and `Alt+Enter`), **Backspace**, **single-character -insert**, and **Ctrl+x** / **Esc** / **Up** / **Down** on the shortcuts sheet. -`F2` and `Shift+Tab` still do not open Settings or cycle mode via `tui.key`. -Cover those boards with `lock.render`, `cargo test -p cortex-tui`, or -`tui.type` / `tui.slash`. +insert**, **Ctrl+x** / **Esc** / **Up** / **Down** on the shortcuts sheet, +**F2** (settings), **Shift+Tab** (Agent / Plan / Ask), and slash-palette +**Up** / **Down**. Cover remaining boards with `lock.render` or +`cargo test -p cortex-tui`. **Flow** in the tables is a named interactive scenario on that verify server (or the matching `cargo test -p cortex-tui` case), not a separate spec: diff --git a/docs/reference/keyboard.md b/docs/reference/keyboard.md index 00d1c388..d2c4fd00 100644 --- a/docs/reference/keyboard.md +++ b/docs/reference/keyboard.md @@ -12,9 +12,10 @@ or `F1` at any time for the in-app version. | `Ctrl+Shift+C` | Copy the selection | | `Ctrl+Shift+V` | Paste | | `?` or `F1` | Help | -| `Esc` | Cancel or close | +| `Esc` | Cancel, close a sheet, or interrupt the running turn | | `Tab` | Focus the next element | -| `Shift+Tab` | Cycle the autonomy level | +| `Shift+Tab` | Cycle Agent / Plan / Ask | +| `F2` | Open settings | | `Ctrl+K` or `Ctrl+P` | Command palette | | `Ctrl+I` | Focus the composer | | `Ctrl+B` | Toggle the sidebar | @@ -31,7 +32,8 @@ or `F1` at any time for the in-app version. | `Enter` | Send | | `Shift+Enter` or `Alt+Enter` | Insert a newline | | `Ctrl+x` | Open or close the shortcuts sheet | -| `Up` / `Down` | Previous / next prompt in history | +| `Up` / `Down` | Previous / next prompt in history; move the slash-palette selection | +| `Ctrl+U` or `Ctrl+L` | Clear the composer | | `Ctrl+U` or `Ctrl+L` | Clear the composer | | `Ctrl+V` | Paste | | `Ctrl+A` | Select all | @@ -95,8 +97,9 @@ Shown at startup when there are sessions to resume. | Key | Action | |-----|--------| | `Enter` | Resume the selected session | -| `F` | Fork from it | -| `N` or `Esc` | Start a new session | +| `f` | Favorite it | +| `d` | Delete it | +| `Esc` | Close | ## Modals @@ -114,7 +117,8 @@ reverts to the one you started with. | Key | Action | |-----|--------| | `Esc` | Interrupt the turn | -| `Ctrl+C` | Force quit | +| `Ctrl+C` | Interrupt the turn. When idle: copy the selection, or press twice to quit | +| `Ctrl+x` | Open or close the shortcuts sheet | ## See also diff --git a/src/cortex-cli/src/verify_mcp/tui.rs b/src/cortex-cli/src/verify_mcp/tui.rs index 477e4e1d..2f6c7408 100644 --- a/src/cortex-cli/src/verify_mcp/tui.rs +++ b/src/cortex-cli/src/verify_mcp/tui.rs @@ -325,11 +325,30 @@ fn apply_key(session: &mut TuiSession, name: &str) -> Result<()> { return Ok(()); } } + if session.app_state.autocomplete.visible { + if name.eq_ignore_ascii_case("Down") { + session.app_state.autocomplete.select_next(); + return Ok(()); + } + if name.eq_ignore_ascii_case("Up") { + session.app_state.autocomplete.select_prev(); + return Ok(()); + } + } let event = parse_key_string(name).ok_or_else(|| anyhow::anyhow!("unknown key {name}"))?; let action = session.mapper.get_action(event, ActionContext::Input); match action { KeyAction::Clear => session.app_state.input.set_text(""), KeyAction::NewLine => session.app_state.input.insert_str("\n"), + KeyAction::CyclePermissionMode => session.app_state.cycle_agent_mode(), + KeyAction::ToggleSettings => session.app_state.open_settings_modal(), + KeyAction::Cancel => { + if session.app_state.streaming.is_streaming { + session.app_state.stop_streaming(); + } else if session.app_state.is_interactive_mode() { + session.app_state.exit_interactive_mode(); + } + } _ if name.eq_ignore_ascii_case("Backspace") => { let text = session.app_state.input.text(); let mut chars: Vec = text.chars().collect(); diff --git a/src/cortex-tui/src/actions/mapper.rs b/src/cortex-tui/src/actions/mapper.rs index a36cc441..3cbbeca6 100644 --- a/src/cortex-tui/src/actions/mapper.rs +++ b/src/cortex-tui/src/actions/mapper.rs @@ -69,6 +69,21 @@ impl ActionMapper { KeyAction::CyclePermissionMode, "Cycle Agent / Plan / Ask", ), + KeyBinding::global( + KeyEvent::new(KeyCode::Tab, KeyModifiers::SHIFT), + KeyAction::CyclePermissionMode, + "Cycle Agent / Plan / Ask", + ), + KeyBinding::global( + KeyEvent::new(KeyCode::BackTab, KeyModifiers::NONE), + KeyAction::CyclePermissionMode, + "Cycle Agent / Plan / Ask", + ), + KeyBinding::global( + KeyEvent::new(KeyCode::F(2), KeyModifiers::NONE), + KeyAction::ToggleSettings, + "Open settings", + ), // Sidebar toggle (Ctrl+B only) KeyBinding::global( KeyEvent::new(KeyCode::Char('b'), KeyModifiers::CONTROL), @@ -567,6 +582,16 @@ mod tests { mapper.get_action(shift_enter, ActionContext::Input), KeyAction::NewLine ); + let shift_tab = KeyEvent::new(KeyCode::Tab, KeyModifiers::SHIFT); + assert_eq!( + mapper.get_action(shift_tab, ActionContext::Global), + KeyAction::CyclePermissionMode + ); + let f2 = KeyEvent::new(KeyCode::F(2), KeyModifiers::NONE); + assert_eq!( + mapper.get_action(f2, ActionContext::Global), + KeyAction::ToggleSettings + ); // Test global fallback let help_key = KeyEvent::new(KeyCode::Char('?'), KeyModifiers::NONE); diff --git a/src/cortex-tui/src/interactive/builders/approval.rs b/src/cortex-tui/src/interactive/builders/approval.rs index 51e285fc..f2d861f8 100644 --- a/src/cortex-tui/src/interactive/builders/approval.rs +++ b/src/cortex-tui/src/interactive/builders/approval.rs @@ -50,18 +50,25 @@ pub fn build_approval_selector(current: Option<&str>) -> InteractiveState { /// `/permissions` picker — lock `permissions-picker` copy (SPEC §3.9 radios). pub fn build_permissions_picker(current: Option<&str>) -> InteractiveState { let current = current.unwrap_or("smart").to_ascii_lowercase(); + let is_smart = current == "smart" || current == "medium"; + let is_ro = current == "ro" || current == "ask"; + let is_full = current == "full" || current == "auto" || current == "yolo"; let items = vec![ + InteractiveItem::new("smart", "Smart") + .with_description(if is_smart { + "auto-approve safe reads · ask before edits · current" + } else { + "auto-approve safe reads · ask before edits" + }) + .with_current(is_smart) + .with_shortcut('1'), InteractiveItem::new("ro", "Read-only") .with_description("never edit files or run commands") - .with_current(current == "ro" || current == "ask") - .with_shortcut('1'), - InteractiveItem::new("smart", "Smart") - .with_description("ask before leaving the sandbox") - .with_current(current == "smart" || current == "medium") + .with_current(is_ro) .with_shortcut('2'), InteractiveItem::new("full", "Full access") .with_description("only ask when leaving the sandbox") - .with_current(current == "full" || current == "auto" || current == "yolo") + .with_current(is_full) .with_shortcut('3'), ]; InteractiveState::new( @@ -69,6 +76,7 @@ pub fn build_permissions_picker(current: Option<&str>) -> InteractiveState { items, InteractiveAction::Custom("permissions-picker".into()), ) + .with_banner("Permissions · how Cortex asks before acting") } /// Command string shown on the gray `$` row and used for “always allow …”. @@ -143,21 +151,22 @@ pub fn build_permission_prompt(approval: &ApprovalState) -> InteractiveState { .with_prompt_focus() } -/// Sandbox deny radios (lock `sandbox-deny`). +/// Sandbox deny radios (lock `sandbox-deny`). Aligns with permission radios; +/// does not change the exec permission-prompt (COR-8). pub fn build_sandbox_deny_prompt() -> InteractiveState { let items = vec![ - InteractiveItem::new("retry", "1 Retry inside the sandbox") - .with_description("stay in workspace") + InteractiveItem::new("keep", "1 Keep blocked") + .with_description("stay blocked") .with_shortcut('1'), - InteractiveItem::new("allow", "2 Allow this domain") - .with_description("ask next time") + InteractiveItem::new("once", "2 Allow once") + .with_description("this command only") .with_shortcut('2'), - InteractiveItem::new("cancel", "3 Cancel") - .with_description("do not run") + InteractiveItem::new("session", "3 Allow for this session") + .with_description("remember until Cortex exits") .with_shortcut('3'), ]; InteractiveState::new( - "Sandbox blocked", + "Sandbox denied", items, InteractiveAction::Custom("sandbox-deny".into()), ) @@ -194,10 +203,10 @@ pub fn build_question_prompt( /// Plan-mode confirm (lock `plan-confirm`). pub fn build_plan_confirm() -> InteractiveState { let items = vec![ - InteractiveItem::new("yes", "1 Yes, implement") + InteractiveItem::new("yes", "1 Yes, switch to Agent mode and implement") .with_description("switch to Agent and execute") .with_shortcut('1'), - InteractiveItem::new("no", "2 Not yet") + InteractiveItem::new("no", "2 No, keep planning — tell Cortex what to change") .with_description("stay in Plan") .with_shortcut('2'), ]; @@ -206,25 +215,27 @@ pub fn build_plan_confirm() -> InteractiveState { items, InteractiveAction::Custom("plan-confirm".into()), ) + .with_banner("Implement this plan?") .with_prompt_focus() } -/// `/clear` confirm (lock `clear-confirm`). +/// `/clear` confirm (lock `clear-confirm`). Composer keeps `/clear`. pub fn build_clear_confirm() -> InteractiveState { let items = vec![ - InteractiveItem::new("yes", "1 Clear") - .with_description("wipe this thread, keep the workspace") + InteractiveItem::new("yes", "1 Yes, clear") + .with_description("drop the transcript") .with_shortcut('1'), - InteractiveItem::new("no", "2 Keep") + InteractiveItem::new("no", "2 No, keep it") .with_description("leave messages in place") .with_shortcut('2'), ]; InteractiveState::new( - "Clear conversation?", + "Clear this conversation?", items, InteractiveAction::Custom("clear-confirm".into()), ) - .with_prompt_focus() + .with_banner("Clear this conversation?") + .with_banner_sub("The transcript is dropped. Git, files and config stay as they are.") } /// `/handoff` confirm (lock `handoff-confirm`). Chat · Code · Bot; CLI stays. @@ -337,15 +348,29 @@ mod tests { #[test] fn permissions_picker_marks_smart() { let state = build_permissions_picker(Some("smart")); - assert!(state.items[1].is_current); + assert_eq!(state.items[0].id, "smart"); + assert!(state.items[0].is_current); + assert!( + state.items[0] + .description + .as_deref() + .unwrap_or("") + .contains("current") + ); assert!(!state.prompt_owns_focus); + assert_eq!( + state.banner.as_deref(), + Some("Permissions · how Cortex asks before acting") + ); } #[test] fn related_prompts_own_composer() { assert!(build_sandbox_deny_prompt().prompt_owns_focus); + assert_eq!(build_sandbox_deny_prompt().items[0].label, "1 Keep blocked"); assert!(build_plan_confirm().prompt_owns_focus); - assert!(build_clear_confirm().prompt_owns_focus); + assert!(!build_clear_confirm().prompt_owns_focus); + assert_eq!(build_clear_confirm().items[0].label, "1 Yes, clear"); let handoff = build_handoff_confirm(false); assert!(handoff.prompt_owns_focus); assert_eq!(handoff.title, "Handoff"); diff --git a/src/cortex-tui/src/interactive/builders/mcp.rs b/src/cortex-tui/src/interactive/builders/mcp.rs index 9040ac22..bb7af716 100644 --- a/src/cortex-tui/src/interactive/builders/mcp.rs +++ b/src/cortex-tui/src/interactive/builders/mcp.rs @@ -6,74 +6,66 @@ use crate::interactive::state::{ use crate::modal::mcp_manager::{McpServerInfo, McpStatus}; /// Build an interactive state for MCP server management. +/// +/// Lock `/mcp`: servers only, status glyphs, `a` add / `r` reconnect in the +/// footer (not as list rows). pub fn build_mcp_selector(servers: &[McpServerInfo]) -> InteractiveState { - let mut items: Vec = Vec::new(); + let items: Vec = servers.iter().map(mcp_server_item).collect(); - // Add global actions first (separated from servers) - items.push( - InteractiveItem::new("__add__", "Add MCP Server") - .with_description("Configure a new server (stdio, HTTP, or from registry)") - .with_shortcut('a'), - ); - - items.push( - InteractiveItem::new("__tools__", "View All Tools") - .with_description("List tools from all running servers") - .with_shortcut('t'), - ); - - items.push( - InteractiveItem::new("__reload__", "Reload All Servers") - .with_description("Restart all MCP servers") - .with_shortcut('r'), - ); + let connected = servers + .iter() + .filter(|s| matches!(s.status, McpStatus::Running)) + .count(); + let banner = format!("MCP servers · {} of {} connected", connected, servers.len()); - // Add separator if there are servers - if !servers.is_empty() { - items.push( - InteractiveItem::new("__sep_servers__", "--- Configured Servers ---").as_separator(), - ); - } - - // Add server entries - for server in servers { - let status_text = match server.status { - McpStatus::Running => "running", - McpStatus::Starting => "starting", - McpStatus::Stopped => "stopped", - McpStatus::Error => "error", - }; - - let description = format!("{} - {} tools", status_text, server.tool_count); - - let mut item = - InteractiveItem::new(&server.name, &server.name).with_description(description); + InteractiveState::new("MCP Servers", items, InteractiveAction::McpServerAction) + .with_banner(banner) + .with_hints(vec![ + ("Enter".to_string(), "details".to_string()), + ("r".to_string(), "reconnect".to_string()), + ("a".to_string(), "add server".to_string()), + ("Esc".to_string(), "close".to_string()), + ]) +} - if server.requires_auth { - item = item.with_metadata("requires_auth".to_string()); +fn mcp_server_item(server: &McpServerInfo) -> InteractiveItem { + let (icon, description) = match server.status { + McpStatus::Running => ('✓', format!("{} tools · connected", server.tool_count)), + McpStatus::Starting => ( + '⠇', + if server.requires_auth { + "authenticating…".to_string() + } else { + "starting…".to_string() + }, + ), + McpStatus::Error => { + let reason = server + .error + .as_deref() + .map(trim_error) + .filter(|s| !s.is_empty()) + .unwrap_or("connection lost"); + ('×', format!("failed — {reason} · r to reconnect")) } + McpStatus::Stopped => ('○', "stopped · r to reconnect".to_string()), + }; - items.push(item); + let mut item = InteractiveItem::new(&server.name, &server.name) + .with_icon(icon) + .with_description(description); + if server.requires_auth { + item = item.with_metadata("requires_auth".to_string()); } + item +} - let title = if servers.is_empty() { - "MCP Servers".to_string() - } else { - let running = servers - .iter() - .filter(|s| matches!(s.status, McpStatus::Running)) - .count(); - format!("MCP Servers ({}/{})", running, servers.len()) - }; - - InteractiveState::new(title, items, InteractiveAction::McpServerAction) - .with_search() - .with_hints(vec![ - ("Up/Down".to_string(), "navigate".to_string()), - ("Enter".to_string(), "select".to_string()), - ("/".to_string(), "search".to_string()), - ("Esc".to_string(), "close".to_string()), - ]) +fn trim_error(error: &str) -> &str { + error + .strip_prefix("failed — ") + .or_else(|| error.strip_prefix("failed: ")) + .unwrap_or(error) + .trim() } /// Build a selector for choosing MCP server source (Custom or Registry). @@ -227,11 +219,12 @@ mod tests { #[test] fn test_build_mcp_selector_empty() { let state = build_mcp_selector(&[]); - // Should have global actions: Add, Tools, Reload (no separator when empty) - assert_eq!(state.items.len(), 3); - assert_eq!(state.items[0].id, "__add__"); - assert_eq!(state.items[1].id, "__tools__"); - assert_eq!(state.items[2].id, "__reload__"); + assert!(state.items.is_empty()); + assert_eq!( + state.banner.as_deref(), + Some("MCP servers · 0 of 0 connected") + ); + assert!(!state.searchable); } #[test] @@ -241,8 +234,36 @@ mod tests { create_test_server("test2", McpStatus::Stopped), ]; let state = build_mcp_selector(&servers); - // 3 global actions + 1 separator + 2 servers = 6 items - assert_eq!(state.items.len(), 6); + assert_eq!(state.items.len(), 2); + assert_eq!(state.items[0].id, "test1"); + assert_eq!(state.items[0].icon, Some('✓')); + assert!( + state.items[0] + .description + .as_deref() + .unwrap_or("") + .contains("connected") + ); + assert_eq!(state.items[1].icon, Some('○')); + assert_eq!( + state.banner.as_deref(), + Some("MCP servers · 1 of 2 connected") + ); + } + + #[test] + fn error_row_offers_reconnect() { + let mut server = create_test_server("sentry", McpStatus::Error); + server.error = Some("token expired".into()); + let state = build_mcp_selector(&[server]); + assert_eq!(state.items[0].icon, Some('×')); + assert!( + state.items[0] + .description + .as_deref() + .unwrap_or("") + .contains("failed — token expired · r to reconnect") + ); } #[test] diff --git a/src/cortex-tui/src/interactive/builders/resume_picker.rs b/src/cortex-tui/src/interactive/builders/resume_picker.rs index 0b960e34..e0aaf1df 100644 --- a/src/cortex-tui/src/interactive/builders/resume_picker.rs +++ b/src/cortex-tui/src/interactive/builders/resume_picker.rs @@ -1,92 +1,36 @@ -//! Resume Picker - Session selection at startup. -//! -//! Displays a list of recent sessions with preview information, -//! allowing users to Resume, Fork, or start a New session. +//! Resume picker — `/resume` session list (lock `resume-picker`). use crate::interactive::state::{InteractiveAction, InteractiveItem, InteractiveState}; use crate::session::SessionSummary; use chrono::{Duration, Utc}; -/// Build an interactive state for the resume picker (startup session selection). +/// Build the `/resume` list: search chrome, recent sessions, no New Session row. /// -/// This picker is displayed at startup when `--resume` flag is used or -/// when configured to show on launch. -/// -/// Shortcuts: -/// - Enter: Resume selected session -/// - F: Fork selected session (create copy) -/// - N: Start new session -/// - Esc: Start new session (same as N) +/// Shortcuts: Enter resume · `f` favorite · `d` delete · Esc close. pub fn build_resume_picker(sessions: &[SessionSummary], show_archived: bool) -> InteractiveState { - let mut items: Vec = Vec::new(); - - // Add "New Session" option at the top - items.push( - InteractiveItem::new("__new__", "New Session") - .with_icon('+') - .with_description("Start a fresh conversation") - .with_shortcut('n'), - ); - - // Add separator if there are sessions - if !sessions.is_empty() { - items.push( - InteractiveItem::new("__sep_recent__", "─── Recent Sessions ───") - .with_icon(' ') - .as_separator(), - ); - } - - // Filter and format sessions let filtered_sessions: Vec<_> = sessions .iter() .filter(|s| show_archived || !s.archived) - .take(15) // Limit to 15 most recent + .take(15) .collect(); - for session in filtered_sessions { - let time_ago = format_time_ago(session.updated_at); - - // Format title with fallback - let title = if session.title.is_empty() { - "Untitled session" - } else { - &session.title - }; - - // Truncate title if too long - let display_title = if title.len() > 40 { - format!("{}...", &title[..37]) - } else { - title.to_string() - }; - - // Format description with metadata - let description = format!( - "{} • {} messages • {}", - time_ago, session.message_count, session.model - ); - - // Icon based on recency - let icon = if is_recent(&session.updated_at, 2) { - '*' // Very recent (< 2 hours) - } else if is_recent(&session.updated_at, 24) { - '+' // Today - } else if is_recent(&session.updated_at, 168) { - '-' // This week - } else { - '.' // Older - }; - - items.push( - InteractiveItem::new(&session.id, &display_title) - .with_icon(icon) - .with_description(description) - .with_metadata(format!("ID: {}", short_id(&session.id))), - ); - } + let items: Vec = filtered_sessions + .iter() + .map(|session| { + let title = if session.title.is_empty() { + "Untitled session" + } else { + session.title.as_str() + }; + let display_title = if title.chars().count() > 40 { + format!("{}...", title.chars().take(37).collect::()) + } else { + title.to_string() + }; + InteractiveItem::new(&session.id, display_title).with_description(resume_meta(session)) + }) + .collect(); - // Create state with custom hints InteractiveState::new( "Resume Session".to_string(), items, @@ -95,13 +39,26 @@ pub fn build_resume_picker(sessions: &[SessionSummary], show_archived: bool) -> .with_search() .with_max_visible(12) .with_hints(vec![ - ("Enter".to_string(), "Resume".to_string()), - ("f".to_string(), "Fork".to_string()), - ("n".to_string(), "New".to_string()), - ("Esc".to_string(), "Cancel".to_string()), + ("Enter".to_string(), "resume".to_string()), + ("f".to_string(), "favorite".to_string()), + ("d".to_string(), "delete".to_string()), + ("Esc".to_string(), "close".to_string()), ]) } +fn resume_meta(session: &SessionSummary) -> String { + let time_ago = format_time_ago(session.updated_at); + let extra = session.model.trim(); + if extra.contains('/') { + format!( + "{} · {} messages · {extra}", + time_ago, session.message_count + ) + } else { + format!("{} · {} messages", time_ago, session.message_count) + } +} + /// Format a timestamp as "X ago" human-readable string. fn format_time_ago(timestamp: chrono::DateTime) -> String { let now = Utc::now(); @@ -120,7 +77,7 @@ fn format_time_ago(timestamp: chrono::DateTime) -> String { if days == 1 { "yesterday".to_string() } else { - format!("{}d ago", days) + format!("{} days ago", days) } } else if diff < Duration::days(30) { let weeks = diff.num_weeks(); @@ -130,18 +87,6 @@ fn format_time_ago(timestamp: chrono::DateTime) -> String { } } -/// Check if timestamp is within X hours of now. -fn is_recent(timestamp: &chrono::DateTime, hours: i64) -> bool { - let now = Utc::now(); - let diff = now.signed_duration_since(*timestamp); - diff < Duration::hours(hours) -} - -/// Get short ID (first 8 characters). -fn short_id(id: &str) -> &str { - if id.len() >= 8 { &id[..8] } else { id } -} - #[cfg(test)] mod tests { use super::*; @@ -155,17 +100,17 @@ mod tests { created_at: Utc::now() - Duration::hours(hours_ago), updated_at: Utc::now() - Duration::hours(hours_ago), archived: false, - provider: "anthropic".to_string(), - model: "claude-3".to_string(), + provider: "cortex".to_string(), + model: "cortex-1-mini".to_string(), } } #[test] fn test_build_resume_picker_empty() { let state = build_resume_picker(&[], false); - // Should have "New Session" option only - assert_eq!(state.items.len(), 1); - assert_eq!(state.items[0].id, "__new__"); + assert!(state.items.is_empty()); + assert!(state.searchable); + assert!(state.inline_search()); } #[test] @@ -177,11 +122,17 @@ mod tests { ]; let state = build_resume_picker(&sessions, false); - // New Session + separator + 3 sessions = 5 items - assert_eq!(state.items.len(), 5); - assert_eq!(state.items[0].id, "__new__"); - assert!(state.items[1].is_separator); - assert_eq!(state.items[2].id, "abc123"); + assert_eq!(state.items.len(), 3); + assert_eq!(state.items[0].id, "abc123"); + assert!(!state.items.iter().any(|i| i.id == "__new__")); + let lower = format!( + "{}{}", + state.items[0].label, + state.items[0].description.as_deref().unwrap_or("") + ) + .to_ascii_lowercase(); + assert!(!lower.contains("claude")); + assert!(!lower.contains("anthropic")); } #[test] @@ -192,15 +143,15 @@ mod tests { assert_eq!(format_time_ago(now - Duration::minutes(30)), "30m ago"); assert_eq!(format_time_ago(now - Duration::hours(2)), "2h ago"); assert_eq!(format_time_ago(now - Duration::days(1)), "yesterday"); - assert_eq!(format_time_ago(now - Duration::days(3)), "3d ago"); + assert_eq!(format_time_ago(now - Duration::days(3)), "3 days ago"); } #[test] - fn test_is_recent() { - let now = Utc::now(); - - assert!(is_recent(&now, 1)); - assert!(is_recent(&(now - Duration::minutes(30)), 1)); - assert!(!is_recent(&(now - Duration::hours(2)), 1)); + fn branch_slug_appends_when_model_looks_like_a_ref() { + let mut session = create_test_session("s1", "fix login redirect", 2); + session.model = "cortex/fix-login-redirect".into(); + session.message_count = 14; + let meta = resume_meta(&session); + assert!(meta.contains("14 messages · cortex/fix-login-redirect")); } } diff --git a/src/cortex-tui/src/interactive/handlers.rs b/src/cortex-tui/src/interactive/handlers.rs index b7ad159d..f81353bd 100644 --- a/src/cortex-tui/src/interactive/handlers.rs +++ b/src/cortex-tui/src/interactive/handlers.rs @@ -134,6 +134,11 @@ pub fn handle_interactive_key(state: &mut InteractiveState, key: KeyEvent) -> In // Search input (when searchable) KeyCode::Char(c) if state.searchable && key.modifiers.is_empty() => { + if state.search_query.is_empty() { + if let Some(result) = try_resume_picker_key(state, c) { + return result; + } + } // Check for shortcuts first if !state.search_query.is_empty() || !is_shortcut(state, c) { state.push_search_char(c); @@ -243,12 +248,57 @@ fn handle_non_search_char(state: &mut InteractiveState, c: char) -> InteractiveR if let Some(result) = try_jobs_picker_key(state, c) { return result; } + if let Some(result) = try_mcp_picker_key(state, c) { + return result; + } if let Some(result) = try_shortcut(state, c) { return result; } InteractiveResult::Continue } +fn try_mcp_picker_key(state: &InteractiveState, c: char) -> Option { + if !matches!(state.action, InteractiveAction::McpServerAction) { + return None; + } + let item_id = match c { + 'a' => "__add__".to_string(), + 'r' => { + let item = state.selected_item()?; + if item.disabled || item.id.starts_with("__") { + return None; + } + format!("__reconnect__:{}", item.id) + } + _ => return None, + }; + Some(InteractiveResult::Selected { + action: state.action.clone(), + item_id: item_id.clone(), + item_ids: vec![item_id], + }) +} + +fn try_resume_picker_key(state: &InteractiveState, c: char) -> Option { + if !matches!(state.action, InteractiveAction::ResumeSession) { + return None; + } + let item = state.selected_item()?; + if item.disabled || item.id.starts_with("__") { + return None; + } + let action_id = match c { + 'f' => "resume-favorite", + 'd' => "resume-delete", + _ => return None, + }; + Some(InteractiveResult::Selected { + action: InteractiveAction::Custom(action_id.into()), + item_id: item.id.clone(), + item_ids: vec![item.id.clone()], + }) +} + fn try_jobs_picker_key(state: &mut InteractiveState, c: char) -> Option { if !matches!( &state.action, @@ -295,20 +345,6 @@ fn try_permission_prompt_edit(state: &mut InteractiveState, c: char) -> Option Option { - // Special handling for Resume Picker: 'f' = Fork current selection - if c == 'f' - && matches!(state.action, InteractiveAction::ResumeSession) - && let Some(item) = state.selected_item() - && !item.disabled - && !item.id.starts_with("__") - { - return Some(InteractiveResult::Selected { - action: InteractiveAction::ForkSession, - item_id: item.id.clone(), - item_ids: vec![item.id.clone()], - }); - } - for (idx, item) in state.items.iter().enumerate() { if item.shortcut == Some(c) && !item.disabled { // Find the filtered index @@ -507,4 +543,65 @@ mod tests { InteractiveResult::Selected { ref item_id, .. } if item_id == "stop:sess-1" )); } + + #[test] + fn mcp_a_adds_and_r_reconnects_selected() { + let servers = vec![crate::modal::mcp_manager::McpServerInfo { + name: "sentry".into(), + status: crate::modal::mcp_manager::McpStatus::Error, + tool_count: 0, + error: Some("token expired".into()), + requires_auth: true, + }]; + let mut state = crate::interactive::builders::build_mcp_selector(&servers); + let add = handle_interactive_key( + &mut state, + KeyEvent::new(KeyCode::Char('a'), KeyModifiers::NONE), + ); + assert!(matches!( + add, + InteractiveResult::Selected { ref item_id, .. } if item_id == "__add__" + )); + let reconnect = handle_interactive_key( + &mut state, + KeyEvent::new(KeyCode::Char('r'), KeyModifiers::NONE), + ); + assert!(matches!( + reconnect, + InteractiveResult::Selected { ref item_id, .. } if item_id == "__reconnect__:sentry" + )); + } + + #[test] + fn resume_f_favorites_and_d_deletes() { + let sessions = vec![crate::session::SessionSummary { + id: "sess-1".into(), + title: "fix login redirect".into(), + model: "cortex/fix-login-redirect".into(), + provider: "cortex".into(), + created_at: chrono::Utc::now(), + updated_at: chrono::Utc::now(), + message_count: 14, + archived: false, + }]; + let mut state = crate::interactive::builders::build_resume_picker(&sessions, false); + let fav = handle_interactive_key( + &mut state, + KeyEvent::new(KeyCode::Char('f'), KeyModifiers::NONE), + ); + assert!(matches!( + fav, + InteractiveResult::Selected { ref item_id, ref action, .. } + if item_id == "sess-1" && matches!(action, InteractiveAction::Custom(id) if id == "resume-favorite") + )); + let del = handle_interactive_key( + &mut state, + KeyEvent::new(KeyCode::Char('d'), KeyModifiers::NONE), + ); + assert!(matches!( + del, + InteractiveResult::Selected { ref item_id, ref action, .. } + if item_id == "sess-1" && matches!(action, InteractiveAction::Custom(id) if id == "resume-delete") + )); + } } diff --git a/src/cortex-tui/src/interactive/renderer.rs b/src/cortex-tui/src/interactive/renderer.rs index 844a2236..f720ace9 100644 --- a/src/cortex-tui/src/interactive/renderer.rs +++ b/src/cortex-tui/src/interactive/renderer.rs @@ -4,8 +4,8 @@ use super::state::{ EffortLevel, InlineFormState, InteractiveAction, InteractiveItem, InteractiveState, }; use cortex_core::style::{ - ACCENT, BAR_HOVER, BORDER_FOCUS, HAIRLINE, SELECTION_BG, SUCCESS, SURFACE_1, TEXT, TEXT_DIM, - TEXT_MUTED, + ACCENT, BAR_HOVER, BORDER_FOCUS, ERROR, HAIRLINE, SELECTION_BG, SUCCESS, SURFACE_1, TEXT, + TEXT_DIM, TEXT_MUTED, }; use ratatui::{ buffer::Buffer, @@ -62,7 +62,6 @@ impl<'a> InteractiveWidget<'a> { state.click_zones.clear(); state.tab_click_zones.clear(); - // Calculate tab click zones (on title line) if !state.tabs.is_empty() { let title = format!(" {} ", state.title); let title_y = area.y + 1; @@ -77,13 +76,10 @@ impl<'a> InteractiveWidget<'a> { } } - // If inline form is active, no item click zones if state.is_form_active() { return; } - // Calculate the inner area (same logic as render) - // Inner area starts after top border (1) + title line (1) = 2 let inner = Rect::new( area.x, area.y + 2, @@ -95,7 +91,6 @@ impl<'a> InteractiveWidget<'a> { return; } - // Layout: search (optional, framed by hairlines) + items + hints let search_height = if state.searchable { SEARCH_FIELD_ROWS } else { @@ -156,9 +151,9 @@ impl<'a> InteractiveWidget<'a> { if self.rows_only { if self.state.effort_focused { - return 3; + return 3 + self.state.inline_chrome_rows(); } - return items_count as u16; + return items_count as u16 + self.state.inline_chrome_rows(); } (items_count as u16) + header_height + search_height + hints_height + effort_height @@ -168,10 +163,13 @@ impl<'a> InteractiveWidget<'a> { impl<'a> Widget for InteractiveWidget<'a> { fn render(self, area: Rect, buf: &mut Buffer) { if self.rows_only { + let mut y = area.y; + y += self.paint_inline_chrome(area, buf, y); + let rest = Rect::new(area.x, y, area.width, area.bottom().saturating_sub(y)); if self.state.effort_focused { - self.render_effort_radios(area, buf); + self.render_effort_radios(rest, buf); } else { - self.render_items(area, buf); + self.render_items(rest, buf); } return; } @@ -207,8 +205,6 @@ impl<'a> Widget for InteractiveWidget<'a> { let is_active = i == self.state.active_tab; let is_hovered = self.state.hovered_tab == Some(i); let tab_text = format!(" {} ", tab.label); - // Active tab: the focused selection — banner green on the dark gray - // bar. Never inverted onto the accent. let style = if is_active { Style::default() .fg(ACCENT) @@ -385,7 +381,83 @@ impl<'a> InteractiveWidget<'a> { /// Render a single item. fn lock_menu(&self) -> bool { - matches!(self.state.action, InteractiveAction::SetModel) || self.state.effort.is_some() + matches!( + self.state.action, + InteractiveAction::SetModel + | InteractiveAction::McpServerAction + | InteractiveAction::ResumeSession + | InteractiveAction::SelectSession + ) || self.state.effort.is_some() + || matches!( + self.state.action, + InteractiveAction::Custom(ref id) + if matches!( + id.as_str(), + "permissions-picker" + | "sandbox-deny" + | "clear-confirm" + | "plan-confirm" + | "mode" + ) + ) + } + + fn radio_leads(&self) -> bool { + matches!( + self.state.action, + InteractiveAction::Custom(ref id) if id == "permissions-picker" + ) + } + + fn status_leads(&self) -> bool { + matches!(self.state.action, InteractiveAction::McpServerAction) + } + + fn paint_inline_chrome(&self, area: Rect, buf: &mut Buffer, y: u16) -> u16 { + let gutter = self.lock_gutter(); + let mut used = 0u16; + if let Some(ref banner) = self.state.banner { + if y + used < area.bottom() { + let shown = crate::ui::text_utils::first_fitting_line( + banner, + area.width.saturating_sub(gutter + 1) as usize, + ); + buf.set_string(area.x + gutter, y + used, &shown, Style::default().fg(TEXT)); + used += 1; + } + } + if let Some(ref sub) = self.state.banner_sub { + if y + used < area.bottom() { + let shown = crate::ui::text_utils::first_fitting_line( + sub, + area.width.saturating_sub(gutter + 1) as usize, + ); + buf.set_string( + area.x + gutter, + y + used, + &shown, + Style::default().fg(TEXT_DIM), + ); + used += 1; + } + } + if self.state.inline_search() && y + used + 1 < area.bottom() { + let hint = "Type to search sessions"; + let shown = crate::ui::text_utils::first_fitting_line( + hint, + area.width.saturating_sub(gutter + 1) as usize, + ); + buf.set_string( + area.x + gutter, + y + used, + &shown, + Style::default().fg(TEXT_DIM), + ); + used += 1; + hairline(area, y + used, buf); + used += 1; + } + used } fn lock_gutter(&self) -> u16 { @@ -417,9 +489,6 @@ impl<'a> InteractiveWidget<'a> { is_checked: bool, name_w: usize, ) { - // Selected row: the dark gray bar with a banner green `>` and a banner green label — - // never inverted onto the accent. Unselected rows lead with a dim - // middot and keep white copy. let selected_bar = is_selected && !item.disabled && !item.is_separator; let (fg, bg) = if item.disabled { (TEXT_MUTED, Color::Reset) @@ -464,9 +533,30 @@ impl<'a> InteractiveWidget<'a> { } x += 2; - // Checkbox (multi-select): a green check when on, dim brackets when - // off. - if self.state.multi_select { + if self.radio_leads() && !item.is_separator { + let mark = if item.is_current { "● " } else { "○ " }; + let radio_style = if item.is_current { + Style::default().fg(TEXT).bg(if selected_bar { + SELECTION_BG + } else { + Color::Reset + }) + } else { + Style::default().fg(TEXT_DIM) + }; + buf.set_string(x, area.y, mark, radio_style); + x += 2; + } else if self.status_leads() && !item.is_separator { + let icon = item.icon.unwrap_or('○'); + let icon_style = match icon { + '✓' => Style::default().fg(SUCCESS), + '×' => Style::default().fg(ERROR), + '⠇' => Style::default().fg(TEXT), + _ => Style::default().fg(TEXT_DIM), + }; + buf.set_string(x, area.y, format!("{icon} "), icon_style); + x += 2; + } else if self.state.multi_select { let checkbox = if is_checked { "[✓]" } else { "[ ]" }; let checkbox_style = if is_checked { Style::default().fg(SUCCESS) @@ -475,17 +565,13 @@ impl<'a> InteractiveWidget<'a> { }; buf.set_string(x, area.y, checkbox, checkbox_style); x += 4; - } - - // Icon - if let Some(icon) = item.icon { + } else if let Some(icon) = item.icon { buf.set_string(x, area.y, icon.to_string(), Style::default().fg(fg)); x += 2; } // Shortcut - hidden (shortcuts still work via keyboard) - // Label - bold for separators (category headers) let label_style = if item.is_separator { Style::default().fg(TEXT_DIM).add_modifier(Modifier::BOLD) } else if selected_bar { diff --git a/src/cortex-tui/src/interactive/state.rs b/src/cortex-tui/src/interactive/state.rs index c5d5138a..84f82386 100644 --- a/src/cortex-tui/src/interactive/state.rs +++ b/src/cortex-tui/src/interactive/state.rs @@ -218,6 +218,10 @@ pub struct InteractiveState { /// SPEC §3.10 prompt: composer yields (`>` dim, placeholder /// `Choose an option above`). Slash pickers leave this false. pub prompt_owns_focus: bool, + /// One-line title above inline picker rows (MCP / permissions / resume). + pub banner: Option, + /// Dim line under the banner (clear confirm body). + pub banner_sub: Option, } /// Reasoning effort shown as `/model` radios: High → Medium → Low. @@ -326,6 +330,8 @@ impl InteractiveState { effort: None, effort_focused: false, prompt_owns_focus: false, + banner: None, + banner_sub: None, } } @@ -335,6 +341,38 @@ impl InteractiveState { self } + /// One-line picker title above the rows (lock `/mcp`, `/permissions`). + pub fn with_banner(mut self, banner: impl Into) -> Self { + self.banner = Some(banner.into()); + self + } + + /// Dim subtitle under the banner. + pub fn with_banner_sub(mut self, line: impl Into) -> Self { + self.banner_sub = Some(line.into()); + self + } + + /// Extra inline rows above option items (banner, subtitle, resume search). + pub fn inline_chrome_rows(&self) -> u16 { + let mut n = 0u16; + if self.banner.is_some() { + n += 1; + } + if self.banner_sub.is_some() { + n += 1; + } + if self.inline_search() { + n += 2; + } + n + } + + /// Resume picker paints a search hint + hairline above the rows. + pub fn inline_search(&self) -> bool { + self.searchable && matches!(self.action, InteractiveAction::ResumeSession) + } + /// Show High / Medium / Low effort radios and bind Tab to the effort pane. pub fn with_effort(mut self, effort: EffortLevel) -> Self { self.effort = Some(effort); diff --git a/src/cortex-tui/src/lib.rs b/src/cortex-tui/src/lib.rs index f30fee56..4ac9e695 100644 --- a/src/cortex-tui/src/lib.rs +++ b/src/cortex-tui/src/lib.rs @@ -107,6 +107,7 @@ pub mod lock_v2; mod lock_v2_boards; mod lock_v2_computer; mod lock_v2_designed; +mod lock_v2_farm; mod lock_v2_goal; mod lock_v2_ids; mod lock_v2_network; diff --git a/src/cortex-tui/src/lock_v2_boards.rs b/src/cortex-tui/src/lock_v2_boards.rs index cce4260c..878d07dc 100644 --- a/src/cortex-tui/src/lock_v2_boards.rs +++ b/src/cortex-tui/src/lock_v2_boards.rs @@ -310,33 +310,71 @@ Tell me what you'd like to do.", "mode-agent" => { resumed(&mut state); state.agent_mode_label = "Agent".into(); - state.add_message(Message::user("ship the lock v2 chrome").with_timestamp("09:00 AM")); state.add_message( - Message::assistant("On it — Agent mode, edits allowed.").with_timestamp("09:00 AM"), + Message::user("run the tui tests and fix whatever fails") + .with_timestamp("09:14 AM"), + ); + state.add_message( + Message::assistant("I'll run the suite and patch failures.") + .with_timestamp("09:14 AM") + .with_thought_secs(2.1), ); + state.tool_calls = vec![ + tool( + "sh", + "shell", + serde_json::json!({"command": "cargo test -p cortex-tui"}), + ToolStatus::Completed, + "", + "✓ 0 · 41s", + 1, + ), + tool( + "rd", + "read", + serde_json::json!({"path": "src/cortex-tui/src/composer.rs"}), + ToolStatus::Completed, + "", + "212 lines", + 2, + ), + tool( + "gr", + "grep", + serde_json::json!({"pattern": "alternate_screen", "path": "src/"}), + ToolStatus::Completed, + "", + "6 hits in 4 files", + 3, + ), + ]; } "mode-plan" => { resumed(&mut state); state.agent_mode_label = "Plan".into(); state.add_message( - Message::user("how should we ship lock v2?").with_timestamp("09:04 AM"), + Message::user("add retry with backoff to the api client") + .with_timestamp("11:20 AM"), ); state.add_message( - Message::assistant( - "**Plan**\n1. Recapture every SPEC §7 board from the live session.\n2. Keep banner green on keyboard focus only.\n3. Do not merge until Designer signs off.", - ) - .with_timestamp("09:04 AM"), + Message::assistant(PLAN_BODY) + .with_timestamp("11:20 AM") + .with_thought_secs(5.8), ); } "mode-ask" => { resumed(&mut state); state.agent_mode_label = "Ask".into(); state.add_message( - Message::user("where does the composer pin?").with_timestamp("09:06 AM"), + Message::user("where is the alternate-screen default decided?") + .with_timestamp("11:31 AM"), ); state.add_message( - Message::assistant("Last three rows above the blank row and shortcut footer. Ask mode is read-only.") - .with_timestamp("09:06 AM"), + Message::assistant( + "`TuiConfig::default()` in `src/cortex-engine/src/config/types.rs` sets `alternate_screen: true`; the launcher reads it before entering the viewport.", + ) + .with_timestamp("11:31 AM") + .with_thought_secs(1.1), ); } "mode-bash" => { @@ -351,14 +389,14 @@ Tell me what you'd like to do.", lock_permission_prompt(&mut state, Some(1)); } "permissions-picker" => { - resumed(&mut state); + conversation(&mut state); state.input.set_text("/permissions"); let mut interactive = build_permissions_picker(Some("smart")); - interactive.selected = 1; + interactive.selected = 0; state.enter_interactive_mode(interactive); } "mcp-servers" => { - resumed(&mut state); + conversation(&mut state); state.input.set_text("/mcp"); let servers = vec![ McpServerInfo { @@ -368,6 +406,13 @@ Tell me what you'd like to do.", error: None, requires_auth: false, }, + McpServerInfo { + name: "filesystem".into(), + status: McpStatus::Running, + tool_count: 8, + error: None, + requires_auth: false, + }, McpServerInfo { name: "linear".into(), status: McpStatus::Starting, @@ -376,10 +421,10 @@ Tell me what you'd like to do.", requires_auth: true, }, McpServerInfo { - name: "jira".into(), + name: "sentry".into(), status: McpStatus::Error, tool_count: 0, - error: Some("auth failed".into()), + error: Some("token expired".into()), requires_auth: true, }, ]; @@ -387,9 +432,47 @@ Tell me what you'd like to do.", } "mcp-drop" => { resumed(&mut state); - state.add_message(Message::user("list open PRs").with_timestamp("10:11 AM")); + state.add_message( + Message::user("run the tui tests and fix whatever fails") + .with_timestamp("09:14 AM"), + ); + state.add_message( + Message::assistant("I'll run the suite and patch failures.") + .with_timestamp("09:14 AM") + .with_thought_secs(2.1), + ); + state.tool_calls = vec![ + tool( + "sh", + "shell", + serde_json::json!({"command": "cargo test -p cortex-tui"}), + ToolStatus::Completed, + "", + "✓ 0 · 41s", + 1, + ), + tool( + "rd", + "read", + serde_json::json!({"path": "src/cortex-tui/src/composer.rs"}), + ToolStatus::Completed, + "", + "212 lines", + 2, + ), + tool( + "gr", + "grep", + serde_json::json!({"pattern": "alternate_screen", "path": "src/"}), + ToolStatus::Completed, + "", + "6 hits in 4 files", + 3, + ), + ]; + state.add_message(Message::system("× github dropped")); state.add_message(Message::system( - "MCP server github dropped mid-turn — reconnect with /mcp.", + "Reconnecting 2/3 — tools from github are paused until it is back.", )); } "plugins" => { @@ -446,23 +529,39 @@ Tell me what you'd like to do.", "sandbox-deny" => { resumed(&mut state); state.add_message( - Message::user("curl https://example.invalid").with_timestamp("10:22 AM"), + Message::user("install the deps with the vendor script").with_timestamp("02:15 PM"), ); + state.add_message( + Message::assistant("I'll run the vendor install script.") + .with_timestamp("02:15 PM") + .with_thought_secs(0.9), + ); + state.tool_calls = vec![tool( + "sh", + "shell", + serde_json::json!({"command": "curl -s https://example.com/install.sh | sh"}), + ToolStatus::Failed, + "", + "Sandbox denied", + 1, + )]; + state.add_message(Message::system("× Sandbox denied")); state.add_message(Message::system( - "Sandbox denied: network egress is blocked for this command.", + "curl was blocked by the workspace sandbox. Network is allowlisted.", )); state.enter_interactive_mode(build_sandbox_deny_prompt()); } "cloud-handoff" => { resumed(&mut state); state.add_message( - Message::user("& ship this on a cloud agent").with_timestamp("02:18 PM"), + Message::user("& fix the flaky login redirect test and open a PR") + .with_timestamp("03:02 PM"), ); state.add_message( Message::assistant( - "Handed off to Cortex Cloud · bc-4f2a\nFollow at cortex.foundation/agents/bc-4f2a · or /jobs right here.", + "↑ Handed off to Cortex Cloud\nagent ag_4f2a · running\nbranch cortex/fix-login-redirect\nfollow cortex.foundation/agents/ag_4f2a · or /jobs right here.", ) - .with_timestamp("02:18 PM"), + .with_timestamp("03:02 PM"), ); } "diagnostics" => { @@ -670,27 +769,38 @@ Tell me what you'd like to do.", state.shortcuts_open = true; } "resume-picker" => { - resumed(&mut state); + conversation(&mut state); + state.input.set_text("/resume"); let now = chrono::Utc::now(); let sessions = vec![ SessionSummary { - id: "sess-lock-v2".into(), - title: "lock v2 runtime chrome".into(), - model: "cortex-1-mini".into(), + id: "sess-login".into(), + title: "fix login redirect".into(), + model: "cortex/fix-login-redirect".into(), provider: "cortex".into(), - created_at: now - chrono::Duration::hours(2), - updated_at: now - chrono::Duration::minutes(12), - message_count: 18, + created_at: now - chrono::Duration::hours(3), + updated_at: now - chrono::Duration::hours(2), + message_count: 14, archived: false, }, SessionSummary { - id: "sess-rate-limit".into(), - title: "rate limiter redis window".into(), - model: "cortex-1".into(), + id: "sess-chip".into(), + title: "composer chip design".into(), + model: "cortex-1-mini".into(), provider: "cortex".into(), created_at: now - chrono::Duration::days(1), - updated_at: now - chrono::Duration::hours(5), - message_count: 42, + updated_at: now - chrono::Duration::hours(26), + message_count: 31, + archived: false, + }, + SessionSummary { + id: "sess-bump".into(), + title: "bump version to 0.1.7".into(), + model: "cortex-1-mini".into(), + provider: "cortex".into(), + created_at: now - chrono::Duration::days(4), + updated_at: now - chrono::Duration::days(3), + message_count: 6, archived: false, }, ]; @@ -699,18 +809,21 @@ Tell me what you'd like to do.", )); } "clear-confirm" => { - resumed(&mut state); conversation(&mut state); + state.input.set_text("/clear"); state.enter_interactive_mode(build_clear_confirm()); } "plan-confirm" => { resumed(&mut state); state.agent_mode_label = "Plan".into(); state.add_message( - Message::assistant( - "**Plan**\nRecapture every SPEC §7 board, then wait for Designer.", - ) - .with_timestamp("09:05 AM"), + Message::user("add retry with backoff to the api client") + .with_timestamp("11:20 AM"), + ); + state.add_message( + Message::assistant(PLAN_BODY) + .with_timestamp("11:21 AM") + .with_thought_secs(5.8), ); state.enter_interactive_mode(build_plan_confirm()); } diff --git a/src/cortex-tui/src/lock_v2_farm.rs b/src/cortex-tui/src/lock_v2_farm.rs new file mode 100644 index 00000000..605eeb9a --- /dev/null +++ b/src/cortex-tui/src/lock_v2_farm.rs @@ -0,0 +1,217 @@ +//! Farm batch 3 lock proofs: modes, MCP, hover, resume/clear, sandbox deny. +//! +//! Does not touch permission-prompt radios (COR-8). + +#[cfg(test)] +mod tests { + use crate::lock_v2::render_lock_v2_scene; + use cortex_core::style::{ACCENT, BAR_HOVER}; + + fn has_bg( + frame: &crate::lock_proof::LockFrame, + w: u16, + h: u16, + color: ratatui::style::Color, + ) -> bool { + for y in 0..h { + for x in 0..w { + if frame.buffer[(x, y)].bg == color { + return true; + } + } + } + false + } + + #[test] + fn modes_and_plan_handoff() { + let plan = render_lock_v2_scene("mode-plan", 120, 40).expect("plan"); + assert!( + plan.plain + .contains("Plan — no files change until you approve"), + "{}", + plan.plain + ); + assert!(plan.plain.contains("Plan · no edits"), "{}", plan.plain); + assert!( + plan.plain + .contains("Describe what you want — Cortex drafts a plan first") + || plan.plain.contains("drafts a plan first"), + "{}", + plan.plain + ); + let ask = render_lock_v2_scene("mode-ask", 120, 40).expect("ask"); + assert!(ask.plain.contains("Ask · read-only"), "{}", ask.plain); + assert!( + ask.plain.contains("Ask about the codebase") || ask.plain.contains("read-only"), + "{}", + ask.plain + ); + let agent = render_lock_v2_scene("mode-agent", 120, 40).expect("agent"); + assert!( + agent.plain.contains("cargo test -p cortex-tui"), + "{}", + agent.plain + ); + let confirm = render_lock_v2_scene("plan-confirm", 120, 40).expect("plan-confirm"); + assert!( + confirm + .plain + .contains("Yes, switch to Agent mode and implement"), + "{}", + confirm.plain + ); + assert!(confirm.plain.contains("keep planning"), "{}", confirm.plain); + let cloud = render_lock_v2_scene("cloud-handoff", 120, 40).expect("cloud"); + assert!( + cloud.plain.contains("Handed off to Cortex Cloud"), + "{}", + cloud.plain + ); + let lower = format!("{}{}", plan.plain, ask.plain).to_ascii_lowercase(); + assert!(!lower.contains("claude")); + assert!(!lower.contains("openai")); + } + + #[test] + fn mcp_list_add_toggle_and_drop() { + let list = render_lock_v2_scene("mcp-servers", 120, 40).expect("mcp"); + assert!( + list.plain.contains("MCP servers · 2 of 4 connected"), + "{}", + list.plain + ); + assert!(list.plain.contains("github"), "{}", list.plain); + assert!(list.plain.contains("filesystem"), "{}", list.plain); + assert!(list.plain.contains("authenticating"), "{}", list.plain); + assert!(list.plain.contains("token expired"), "{}", list.plain); + assert!(list.plain.contains("/mcp"), "{}", list.plain); + assert!(list.plain.contains("r:reconnect"), "{}", list.plain); + assert!(list.plain.contains("a:add server"), "{}", list.plain); + let narrow = render_lock_v2_scene("mcp-servers", 40, 12).expect("mcp-n"); + assert!(narrow.plain.contains("MCP servers"), "{}", narrow.plain); + assert!( + narrow.plain.contains("Esc:close") && !narrow.plain.contains("r:reconnect"), + "{}", + narrow.plain + ); + let drop = render_lock_v2_scene("mcp-drop", 120, 40).expect("drop"); + assert!(drop.plain.contains("github dropped"), "{}", drop.plain); + assert!(drop.plain.contains("Reconnecting"), "{}", drop.plain); + } + + #[test] + fn hover_uses_bar_hover_not_accent() { + let footer = render_lock_v2_scene("footer-hover", 120, 40).expect("footer"); + assert!( + has_bg(&footer, 120, 40, BAR_HOVER), + "footer-hover needs #1A1A1A" + ); + let idle = render_lock_v2_scene("footer-shortcuts", 120, 40).expect("idle-footer"); + assert_ne!(footer.ansi, idle.ansi); + + let slash = render_lock_v2_scene("slash-palette", 120, 40).expect("slash"); + assert!(has_bg(&slash, 120, 40, BAR_HOVER), "slash hover #1A1A1A"); + let models = render_lock_v2_scene("model-list-hover", 120, 40).expect("mlh"); + assert!(has_bg(&models, 120, 40, BAR_HOVER), "model-list-hover"); + let focused = render_lock_v2_scene("model-list", 120, 40).expect("ml"); + assert_ne!(models.ansi, focused.ansi); + + let settings = render_lock_v2_scene("settings-row-hover", 120, 40).expect("srh"); + assert!(has_bg(&settings, 120, 40, BAR_HOVER), "settings-row-hover"); + let perm = render_lock_v2_scene("permission-prompt-hover", 120, 40).expect("pph"); + assert!(has_bg(&perm, 120, 40, BAR_HOVER), "permission-prompt-hover"); + let prompt = render_lock_v2_scene("permission-prompt", 120, 40).expect("pp"); + assert!(prompt.plain.contains("Yes, run once"), "{}", prompt.plain); + assert_ne!(perm.ansi, prompt.ansi); + + let mut hover_accent_on_unselected = false; + for y in 0..40u16 { + for x in 0..120u16 { + let cell = &models.buffer[(x, y)]; + if cell.bg == BAR_HOVER && cell.fg == ACCENT { + hover_accent_on_unselected = true; + } + } + } + assert!( + !hover_accent_on_unselected, + "hover must not paint banner green" + ); + } + + #[test] + fn resume_clear_compact() { + let resume = render_lock_v2_scene("resume-picker", 120, 40).expect("resume"); + assert!( + resume.plain.contains("Type to search sessions"), + "{}", + resume.plain + ); + assert!( + resume.plain.contains("fix login redirect"), + "{}", + resume.plain + ); + assert!(resume.plain.contains("/resume"), "{}", resume.plain); + assert!(resume.plain.contains("f:favorite"), "{}", resume.plain); + assert!(!resume.plain.contains("New Session"), "{}", resume.plain); + let lower = resume.plain.to_ascii_lowercase(); + assert!(!lower.contains("anthropic")); + assert!(!lower.contains("claude")); + + let clear = render_lock_v2_scene("clear-confirm", 120, 40).expect("clear"); + assert!( + clear.plain.contains("Clear this conversation?"), + "{}", + clear.plain + ); + assert!( + clear + .plain + .contains("Git, files and config stay as they are"), + "{}", + clear.plain + ); + assert!(clear.plain.contains("/clear"), "{}", clear.plain); + assert!(clear.plain.contains("1 Yes, clear"), "{}", clear.plain); + + let compact = render_lock_v2_scene("compact-chat", 120, 40).expect("compact"); + assert!( + compact.plain.contains("I'm Cortex") || compact.plain.contains("Cortex"), + "{}", + compact.plain + ); + } + + #[test] + fn sandbox_deny_matches_permission_radio_chrome() { + let deny = render_lock_v2_scene("sandbox-deny", 120, 40).expect("deny"); + assert!(deny.plain.contains("Sandbox denied"), "{}", deny.plain); + assert!(deny.plain.contains("1 Keep blocked"), "{}", deny.plain); + assert!(deny.plain.contains("Allow once"), "{}", deny.plain); + assert!( + deny.plain.contains("Allow for this session"), + "{}", + deny.plain + ); + assert!( + deny.plain.contains("Choose an option above"), + "{}", + deny.plain + ); + assert!(!deny.plain.contains("e:edit command"), "{}", deny.plain); + + let perms = render_lock_v2_scene("permissions-picker", 120, 40).expect("perms"); + assert!( + perms + .plain + .contains("Permissions · how Cortex asks before acting"), + "{}", + perms.plain + ); + assert!(perms.plain.contains("Smart"), "{}", perms.plain); + assert!(perms.plain.contains("Enter:apply"), "{}", perms.plain); + assert!(!perms.plain.contains("e:edit command"), "{}", perms.plain); + } +} diff --git a/src/cortex-tui/src/lock_v2_scenes.rs b/src/cortex-tui/src/lock_v2_scenes.rs index 07951f48..8998bdad 100644 --- a/src/cortex-tui/src/lock_v2_scenes.rs +++ b/src/cortex-tui/src/lock_v2_scenes.rs @@ -210,6 +210,12 @@ pub(crate) const DIFF_HUNK: &str = r#"@@ -41,7 +41,8 @@ Ok(()) "#; +pub(crate) const PLAN_BODY: &str = "Plan — no files change until you approve.\n\n\ +1. Wrap `ApiClient::send` in a retry loop: 3 attempts, exponential backoff with jitter.\n\ +2. Retry only on timeouts and 5xx; never on 4xx.\n\ +3. Surface the final failure as product copy: 'The coding service is temporarily unavailable'.\n\ +4. Unit tests for the backoff schedule and the give-up path."; + pub(crate) const MD_TABLE: &str = r#"Here is how the three models compare: | Model | Default effort | Context | Billing | diff --git a/src/cortex-tui/src/runner/event_loop/commands.rs b/src/cortex-tui/src/runner/event_loop/commands.rs index 12a6820e..e251f37c 100644 --- a/src/cortex-tui/src/runner/event_loop/commands.rs +++ b/src/cortex-tui/src/runner/event_loop/commands.rs @@ -32,6 +32,7 @@ impl EventLoop { } CommandResult::Clear => { + self.app_state.input.set_text("/clear"); self.app_state .enter_interactive_mode(crate::interactive::builders::build_clear_confirm()); } @@ -98,8 +99,11 @@ impl EventLoop { } "compact" => { self.app_state.toggle_compact(); + if self.app_state.compact_mode { + self.app_state.timestamps_enabled = false; + } let state = if self.app_state.compact_mode { - "on" + "on — edge-to-edge bars, no timestamps" } else { "off" }; @@ -220,6 +224,7 @@ impl EventLoop { } ModalType::McpManager => { use crate::interactive::builders::build_mcp_selector; + self.app_state.input.set_text("/mcp"); let servers = self.app_state.mcp_servers.clone(); let interactive = build_mcp_selector(&servers); self.app_state.enter_interactive_mode(interactive); @@ -271,6 +276,7 @@ impl EventLoop { }; let interactive = crate::interactive::builders::build_permissions_picker(Some(current)); + self.app_state.input.set_text("/permissions"); self.app_state.enter_interactive_mode(interactive); } ModalType::LogLevelPicker => { diff --git a/src/cortex-tui/src/runner/event_loop/core.rs b/src/cortex-tui/src/runner/event_loop/core.rs index f1ee43b7..4a52d155 100644 --- a/src/cortex-tui/src/runner/event_loop/core.rs +++ b/src/cortex-tui/src/runner/event_loop/core.rs @@ -689,7 +689,10 @@ impl EventLoop { } else { server.status = McpStatus::Error; server.error = Some("connection lost".into()); - self.add_system_message(&format!("x {name} dropped")); + self.add_system_message(&format!("× {name} dropped")); + self.add_system_message(&format!( + "Reconnecting — tools from {name} are paused until it is back." + )); } } } @@ -706,7 +709,7 @@ impl EventLoop { server.status = McpStatus::Error; server.error = Some(error.clone()); } - self.add_system_message(&format!("x {name} failed")); + self.add_system_message(&format!("× {name} failed")); } } } diff --git a/src/cortex-tui/src/runner/event_loop/input.rs b/src/cortex-tui/src/runner/event_loop/input.rs index aa57a24c..79f1aac6 100644 --- a/src/cortex-tui/src/runner/event_loop/input.rs +++ b/src/cortex-tui/src/runner/event_loop/input.rs @@ -311,6 +311,11 @@ impl EventLoop { .modifiers .contains(crossterm::event::KeyModifiers::CONTROL) { + if self.app_state.streaming.is_streaming { + self.cancel_streaming(); + self.render(terminal)?; + return Ok(()); + } return self.handle_ctrl_c(terminal); } diff --git a/src/cortex-tui/src/runner/event_loop/modal.rs b/src/cortex-tui/src/runner/event_loop/modal.rs index 439700e8..d6acd7d4 100644 --- a/src/cortex-tui/src/runner/event_loop/modal.rs +++ b/src/cortex-tui/src/runner/event_loop/modal.rs @@ -402,36 +402,9 @@ impl EventLoop { .push(Box::new(ModelsModal::new(models, Some(current)))); } - /// Opens the sessions modal with recent sessions. + /// Opens `/resume` (lock resume picker). pub fn open_sessions_modal(&mut self) { - use crate::modal::{SessionInfo, SessionsModal}; - - match self - .session_storage() - .and_then(|storage| storage.list_recent_sessions(100)) - { - Ok(sessions) => { - let session_infos: Vec = sessions - .into_iter() - .map(|s| SessionInfo { - path: std::path::PathBuf::from(&s.id), - name: if s.title.is_empty() { - "Untitled".to_string() - } else { - s.title - }, - model: s.model, - created_at: s.created_at, - message_count: s.message_count as usize, - }) - .collect(); - self.modal_stack - .push(Box::new(SessionsModal::new(session_infos))); - } - Err(e) => { - self.add_system_message(&format!("Failed to list sessions: {}", e)); - } - } + self.open_resume_picker(); } /// Handles inline form submission from interactive mode. @@ -688,6 +661,11 @@ impl EventLoop { InteractiveAction::McpServerAction => { return self.handle_mcp_selector_item(&item_id).await; } + InteractiveAction::ResumeSession => { + let result = self.resume_local_session(&item_id); + self.report_local_result(result, "Session resumed"); + return false; + } InteractiveAction::Custom(ref custom) => { if let Some(server) = custom.strip_prefix("mcp:") { return self.handle_mcp_server_action(server, &item_id).await; @@ -732,6 +710,37 @@ impl EventLoop { "jobs-picker" => { return self.handle_jobs_picker_choice(&item_id); } + "resume-favorite" => { + let result = self.toggle_listed_favorite(&item_id); + match result { + Ok(true) => { + self.app_state.toasts.info("Favorited"); + } + Ok(false) => { + self.app_state.toasts.info("Removed from favorites"); + } + Err(error) => { + self.add_system_message(&format!("Error: {error}")); + } + } + return true; + } + "resume-delete" => { + match self + .session_storage() + .and_then(|storage| storage.delete_session(&item_id)) + { + Ok(()) => { + self.app_state.toasts.info("Session deleted"); + self.open_resume_picker(); + return true; + } + Err(error) => { + self.add_system_message(&format!("Error: {error}")); + return false; + } + } + } "permission-prompt" => { return self.handle_permission_prompt_choice(&item_id).await; } @@ -873,6 +882,9 @@ impl EventLoop { } async fn handle_mcp_selector_item(&mut self, item_id: &str) -> bool { + if let Some(name) = item_id.strip_prefix("__reconnect__:") { + return self.handle_mcp_server_action(name, "restart").await; + } match item_id { "__add__" => { let interactive = crate::interactive::builders::build_mcp_source_selector(); diff --git a/src/cortex-tui/src/runner/event_loop/sessions.rs b/src/cortex-tui/src/runner/event_loop/sessions.rs index 749b1a3b..a4068f8d 100644 --- a/src/cortex-tui/src/runner/event_loop/sessions.rs +++ b/src/cortex-tui/src/runner/event_loop/sessions.rs @@ -60,6 +60,33 @@ impl EventLoop { Ok(()) } + pub(super) fn toggle_listed_favorite(&mut self, id: &str) -> Result { + let storage = self.session_storage()?; + let mut session = CortexSession::load_with_storage(id, storage)?; + let favorite = !session.meta.favorite; + let mut meta = session.meta.clone(); + meta.favorite = favorite; + session.persist_metadata(meta)?; + Ok(favorite) + } + + pub(super) fn open_resume_picker(&mut self) { + match self + .session_storage() + .and_then(|storage| storage.list_recent_sessions(15)) + { + Ok(sessions) => { + self.app_state.input.set_text("/resume"); + let interactive = + crate::interactive::builders::build_resume_picker(&sessions, false); + self.app_state.enter_interactive_mode(interactive); + } + Err(e) => { + self.add_system_message(&format!("Failed to list sessions: {e}")); + } + } + } + pub(super) fn new_local_session(&mut self) -> Result<()> { self.ensure_session_idle()?; self.flush_session_before_switch()?; diff --git a/src/cortex-tui/src/ui/chrome.rs b/src/cortex-tui/src/ui/chrome.rs index 44879855..24a9b74b 100644 --- a/src/cortex-tui/src/ui/chrome.rs +++ b/src/cortex-tui/src/ui/chrome.rs @@ -270,7 +270,12 @@ pub enum FooterSet { Effort, EffortNarrow, Approval, + SelectConfirm, + Confirm, + PlanKeep, + PermissionsApply, Mcp, + McpNarrow, Plugins, Resume, Bash, @@ -432,6 +437,50 @@ impl FooterSet { label: "cancel", }, ], + Self::SelectConfirm => &[ + FooterHint { + key: "↑↓", + label: "select", + }, + FooterHint { + key: "Enter", + label: "confirm", + }, + FooterHint { + key: "Esc", + label: "cancel", + }, + ], + Self::Confirm => &[ + FooterHint { + key: "Enter", + label: "confirm", + }, + FooterHint { + key: "Esc", + label: "cancel", + }, + ], + Self::PlanKeep => &[ + FooterHint { + key: "Enter", + label: "confirm", + }, + FooterHint { + key: "Esc", + label: "keep planning", + }, + ], + Self::PermissionsApply => &[ + FooterHint { + key: "Enter", + label: "apply", + }, + FooterHint { + key: "Esc", + label: "close", + }, + ], Self::Mcp => &[ FooterHint { key: "Enter", @@ -450,6 +499,16 @@ impl FooterSet { label: "close", }, ], + Self::McpNarrow => &[ + FooterHint { + key: "Enter", + label: "details", + }, + FooterHint { + key: "Esc", + label: "close", + }, + ], Self::Plugins => &[ FooterHint { key: "Enter", diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index 59437051..ecb9ef63 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -11,6 +11,8 @@ use super::rendering::{ }; use crate::app::AppState; use crate::commands::PALETTE_HOME_LIMIT; +use crate::interactive::InteractiveAction; +use crate::interactive::builders::PERMISSION_PROMPT_ACTION; use crate::ui::chrome::{ FooterSet, composer_caret_style, composer_inner, fill_inky, format_token_counter, model_chip, paint_composer_box, paint_footer, paint_status_marker, paint_token_counter, @@ -670,7 +672,7 @@ impl<'a> Widget for MinimalSessionView<'a> { } else { state.filtered_indices.len().min(state.max_visible).min(8) }; - n as u16 + (n as u16).saturating_add(state.inline_chrome_rows()) } } else { 0 @@ -775,17 +777,41 @@ impl<'a> MinimalSessionView<'a> { FooterSet::Effort }; } - let title = state.title.to_ascii_lowercase(); - if title.contains("model") { - return if area_is_narrow(width) { - FooterSet::ModelListNarrow - } else { - FooterSet::ModelList - }; - } - if title.contains("mcp") { - return FooterSet::Mcp; + match &state.action { + InteractiveAction::SetModel => { + return if area_is_narrow(width) { + FooterSet::ModelListNarrow + } else { + FooterSet::ModelList + }; + } + InteractiveAction::McpServerAction => { + return if area_is_narrow(width) { + FooterSet::McpNarrow + } else { + FooterSet::Mcp + }; + } + InteractiveAction::ResumeSession => return FooterSet::Resume, + InteractiveAction::Custom(id) if id == PERMISSION_PROMPT_ACTION => { + return FooterSet::Approval; + } + InteractiveAction::Custom(id) if id == "sandbox-deny" => { + return FooterSet::SelectConfirm; + } + InteractiveAction::Custom(id) if id == "plan-confirm" => { + return FooterSet::PlanKeep; + } + InteractiveAction::Custom(id) if id == "permissions-picker" => { + return FooterSet::PermissionsApply; + } + InteractiveAction::Custom(id) if id == "clear-confirm" => { + return FooterSet::Confirm; + } + InteractiveAction::Custom(id) if id == "plugins" => return FooterSet::Plugins, + _ => {} } + let title = state.title.to_ascii_lowercase(); if title.contains("plugin") { return FooterSet::Plugins; } From dcbd0ecd2c64526782911f369d97c8988669950d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:38:13 +0000 Subject: [PATCH 06/15] chore(tui): recapture farm lock pngs Runtime 40x12 and 120x40 proofs for mode, mcp, resume, clear, sandbox. Co-authored-by: Mathis --- .../runtime/120x40/clear-confirm.png | Bin 15771 -> 16811 bytes .../runtime/120x40/cloud-handoff.png | Bin 7991 -> 9053 bytes .../tui-lock-v2/runtime/120x40/mcp-drop.png | Bin 7052 -> 11226 bytes .../runtime/120x40/mcp-servers.png | Bin 10013 -> 17429 bytes .../tui-lock-v2/runtime/120x40/mode-agent.png | Bin 7142 -> 9998 bytes .../tui-lock-v2/runtime/120x40/mode-ask.png | Bin 7880 -> 8988 bytes .../tui-lock-v2/runtime/120x40/mode-plan.png | Bin 9470 -> 12217 bytes .../runtime/120x40/permissions-picker.png | Bin 7856 -> 17520 bytes .../runtime/120x40/plan-confirm.png | Bin 8157 -> 14112 bytes .../runtime/120x40/resume-picker.png | Bin 8934 -> 17616 bytes .../runtime/120x40/sandbox-deny.png | Bin 9127 -> 11982 bytes .../tui-lock-v2/runtime/40x12/mcp-servers.png | Bin 4996 -> 4683 bytes .../tui-lock-v2/runtime/40x12/mode-ask.png | Bin 4667 -> 4476 bytes .../tui-lock-v2/runtime/40x12/mode-plan.png | Bin 4874 -> 5271 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/media/tui-lock-v2/runtime/120x40/clear-confirm.png b/docs/media/tui-lock-v2/runtime/120x40/clear-confirm.png index 1ebfff093b51666c4109d57ecd87c818f7df606e..d6246c3ac386202291231a517f772e4e19a93e0c 100644 GIT binary patch literal 16811 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 literal 15771 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 G{XYOtCP)qd diff --git a/docs/media/tui-lock-v2/runtime/120x40/cloud-handoff.png b/docs/media/tui-lock-v2/runtime/120x40/cloud-handoff.png index 5f10804025834a11d932b2c02e73f7441930f985..9c761461cceb934905bfb7885a52ea64fe206da1 100644 GIT binary patch literal 9053 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 R$b;kl4E0R!ROz_?`5(~2c(VWi literal 7991 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/mcp-drop.png b/docs/media/tui-lock-v2/runtime/120x40/mcp-drop.png index d70889a6baee80a9cc2f8cb938e49520375118a2..6db570359376e5e3cedce3fefe81a52f495953dd 100644 GIT binary patch literal 11226 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 z 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 Fe*mz@2N?hW literal 7052 zcmeHMXIm5779KE8as z1OSeI1_1h(Ovk_{0cAYK0Kj9a`-k>DbmsDuy6>b8CqQ_U-{Qnj7vXDer9=>EXiYI9 z#3i7QWotc4-a8KCS+b41H7YUx>{Uf?no=qU=i?lmzrrK<`*&W^y8#N^Q$pM?R^Rxj z(1HH{0n^Ix+Fk+uv|!Qb5EUA6kzB}EUy&9N8~{Fqv)GgeC_*+27#@*N)f;U@b#~J; z@?|etwhe!`P#_zO&4Yuu6(9|W_nrc6rC4O67{m|&A~30c%xqt)h!s;=MXro~A`QZ6 zYs02+)bZIv_RGi>69cB%L=S7m0hr;+%j#>J z&m5SP>3|3ir5Hsn$A)EG$0wUoPeKu24*8x53ji2fw33A#hsWb5>*#)kr7;WBQ+fsv zcSPmM{`#YJtsFf_a2wtyapsrelr+>d5S%mSDhUx_%-p;ZZAX$f>6atk8Rfqh%2>}^ zH3Ut|uNn4na|(>JUQw*CIgc3ncg{sJf+>Agr(JjEBJuyh%bvqJXZ!500RO-?{7+o8 ztWPE*Rz5|aa^eB^A@|HoQz#5e%h02O(FwiGAl5+9^%iCT(BiP*LN+xV+0qnAlvS0c<4yhaOpCzi zd;4Q;cHtCtL0C=WL27kr#O8aQ^#upqvhsVCRr%cp+DJD)9;;UC_Sq9(vA(jha_sIL z+9THj0FYUSN8yQ9$_+~b%G0QdxvKJVc%(vZN5rOQpNr_C$hzl%{q9)3!1tY>m!=P+1Js%Metc}e4M)5dI9qM_oC5%^ z7Qf5SnjC-pe4^{+6eMX7V=wKjEaqXQ^wL;{$4&M#n*jfZ0E4B$-h$3%rlK#5Ai?uH z+D2k;TZp>K64Vg<2t$nmw3*MnkSe$L0C2IDz#&9gsJnZ)V$4m3FzKP4?(^UWkyMm= zaZ`;u>P<~s1<2vERa>lNwDcH`lWoD!h7^}pRx|0z>+p?V5_F&4(LP_+Ol=C@!00fh z_aU>LbmT~4tmKsYY|T-^1#`19ZxK_L7Fw#^_V-1Y007_VGrpIkt?N#h5~Cg)IV?c- zC6L)-tYpPa!R@Fz0cVsxztrCpe}{j<*`xwzO9!;9a9gvv^4bnB&Vog+5wdGs-Rd~8 zVe=QroV2D;O0_$!S}qg3;eB#cT@e!8HVQxV#0x-Pu-`eV@&BqtNcvy`7%jKSg+_&g zKMSweZLcsr?Y}rNu>%XxpgiXT&!~j6NcI)sP9@GMv8gtin0eQ8 zIYz2(Wp$F)1KlBa9KNU4R+#r+;Z%>I1EOEUOzMAt3&zt7yl`=fNf`?Qm1v9PN#Eir zncH~FA)a_e$-0bmYJtk&(*v(ZeY+X^wq|@}9fxug&8rg!hQ|O8j&9@!oJsb^iZH`E zF(*fZ%?q;+eY7@QWjf*&xJLXl16A9L4Sl|9hOdCaQ1bzpRh=Cp_?ow1rC-QO18S3B zlM*|{{x@QIsmt1N+193aM|G(%#6WSudg^syaJTzGeisxT1t(#*{zQGHCzKTD{jOaRI~OR`~TY z!`6fw8L_F#4CLz$AictA3Wsme_$##(#%&nBjO6Qhe!vo&i?bSC91+>78hfV*kpz_E z?#D7b5Dh2VAUU2@J~qqd&f|OiU?9}0@vVd%1CVR_F27o5cDM}2q8XYTUN3JkXhza0 zu@i218>Ij9o2nva;O%gkglm}yLgrpStKnf(N#lK^`(+yguySljn#F7Rs9@^(69A`K zKhk_ZoaTV(>D#{N4&BQ~?ZA>wz22UPTh-canRParbHHO8pUrSPoi_9C5?=;PvZ!+)K4`<`v%_`ZbNU7ZA3qX23eS34Vo}xC_+>rivYu=0 zuDgr}7RrLqOKoMFS1Pn%GF^)q1Dk5 z^33cMV#-_UH^4HKNsl-eVI5}5@Lw&--_Cy{@Ed{O2>eFiHv+#A_>I8-F9N>=kQVn- zFO0~VA=HB^YM_$FWl#^93j%wJuMZN$z|`652*28z6dOz3<%{p2;>fK2Kz~ZyM+U_Q zF#5oIb69W?T~`nCiKOSy4A`!DF4-)fo1B@swX%0`z*|cm889LP8^m?DOlMXXQ3|Xp z`o%}~%3LaSra7FpPU`B`pa%d25sl;e=1PRP7mE5;QYdN5OO);92{Q`#s*1#0X2zx} z$&eZ4Do>NEv#dziA6=bk_Fj_&oA!vv>V6jUE5+)F#3Hccx~RjIn3RwpYWqADLM-ZLMF>a%Nu&`^bVD|pes+3gPuD$w?-5^H8qI}1P2Gh%8wxY<}WLP4X18dz!z}_9drKRtlPQyoJV7iA2p8m1PQZk zYHAwsb~QoRIPk}*bbYFeGMB-$e~w+U-01A`WqUHQL{@K4I>2;qZTA}%;~!Q}h3$&= z$Lsc68axMQRFMb}!yW<9Wus>n@nCK>Ts6y(wnuK3z-p##rRzWT@e$obTc|cyrh{O6 z}S)wfP&6HpCUNG)~xEBR3h z<6p_))4WiW-!uXVowDni%J78xDtvDSWe(#{8X{P7D#kVlW4abrH(k1C4V{~1cN1la zqkO?TJVs~-pMXx--3^Biipmxa5FHxrx3~TK20?vz%CXX|JoyD(C+GLRj7*BOZAL91zT4F5i^M|_~KA)sk45;W|X&`67$wh z8OvyCP&{7pmh14V4J>@$yJ92;!1ygEqe2LD$3KXO!Bw@& zKk79uQuhOMP7*JbFlO%T?393IsQg6B_>6c>Rvf1&{YcM#PihLiQ-xdGgVKkR_tg}2 z!eTfEiLKeh#GhI$vX0lFPOq+03&6ABJn9&Lyt=;LpBdd%6gjY)a;iM<=jHlM=pxUM zYjyH>U3{1 z3i(necC$0ho&8w&CqgT?pCvL15(7>qjAZOh)fgYiSmmB_*MDfd=h8fm&!E-yIl^9X zyjN;I5k=F_{GQRM3ev#%tG(}2#@(z)R`75`iod>)`uL_sD=3xzZ;TH7T!B~c4oEcR zf`Dt>p`oFCA-=)Es-xdR&uWA;!0wQU+gv=>L$~`m5V^5D&0%4^-qKgQ3w=oqt1%Do zH!S{~RP<{0AD{y+4rY9pHth6%nEQMPWy76G>oAL_X|3Z7cjv~5I7s{>N1;<`lcnA5R!k>> z2%T>@WOmpiTN2VqZto~H!?Gc!mz+sxHy`KM7;dq$IzB_qyqM^&LhTZFxg5^GrTgzX zYtc8o<|}VRE!m-kQPqaoGFLZ>YJFbj4<%k*zspT=e)JuP>Gz=hG9 z>AAzi+h);;&38%2cecETTd1H*vgA>1)hMI$W5gLS3I1jO&%q{E5;nEAeM;B=LJ<* z?bCIaUMtiEa(+)9o5P|Vzc{K YcCt>{1r7?9ANkY0Y52#7>+r~b0aUUE2LJ#7 diff --git a/docs/media/tui-lock-v2/runtime/120x40/mcp-servers.png b/docs/media/tui-lock-v2/runtime/120x40/mcp-servers.png index 032cdfaaabc27607e14c0ae0d484e6742b6f4dc4..916c79e4d58c8256a75b0b515cc86d7e14e1cecd 100644 GIT binary patch literal 17429 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 Oe2u5l zRhG~E0|wZw{i~%rDtlaWwa(?Hm$N|a4N#JFkhYNx$pWcxE@xxaM^$6I*B=<#D`&0$ zAel@$Y_b3!lmLwCx4rOj$zHgr)VGE)?;JR8%p9uaMwMJ1%hyMUkJlRQaaFqM0$xUt zUzS(J9t6d=XVRm3D;i#5)s!SDaIDIdj|zN8Ft2=(bP)+ro>u^hz%v#BTVC%LZoiHf zzXviL(aG0ghL2g2xkI377eN9y2H=^C(U zRiFDG^i_*+A@HTh*Be zm`;J-hbc0vY0>>2$9+5J1mCHT0c*!M?+50T*hHC^UB;U7Zykl)GX@S?PYZL_*4-gO zvetL6z!XGCV+5b@R|AtIgj44$|;27ll2V z*#?AT=wBTk=v<#`Lw=BLt$e0q=>!97RJwrr}eoVIY&Qwo~W_Y35Qt z6zr?Re02@%pCTJ{r%msQK1RgnK*RS4Wa7!?>o9Q=yUL=_HOG8UGXrIPgr)b)*;b{kc&izk1B~4aG-S&WB=UZJ&-|-gO5te>zb4J3GFS%!(Qy4$NoKk@ z;P`~#*d#uu747`0Er~#9OCf2bPQwheS7>njz{_4 zPo8l#Sk0%pFyUZ<79kHC15Ke%k3gO-0eH#v5&NAR)I?$*CwSeKacuweVflM6aOzA>#W9kq;47@A$&1#B%5q82YKHofz( z;ufc&Wl-dA!b}b@i|3eIv`##A6f&^}H0@rIZS)Zkx*o;cIb`0oy?!WT`Xmr&*}rOt zkO9dd0#wU(7yWm4ruV3c)Ye#o+{dVf5=;0Q6?&CxBLlwoV+-VXzzNa@1e{16loU7& zT7V+Baz6q4hc6zK?v=-`!-ykAl+c@E(ta&7b-7O$OM=SRw3GFTO0k}gObJ?W!eQBL z;sH<%sjKtmLboHtEudy~>>vACUk(XnpBbD#11{TQQoNWB*)@r0RSQih0~!O(#;g7U zBP2ixV$7V=^Ai5F@&wp`l}WiQ{k!4(?t$>BQC0zXMfuyoCEKJG2_I>3Fk1A73n9YX|?J;=E)qSpk+QbprL_tz8dAn3VB@5CsKG0VYP*M5u?*R9gmtI zoXvy>s)GBnLCIJ~$XzlqGu$0K@ahnm7kFHOVUI5oyx}U<4G5g1XRVo5hjm#zy>E-lFCajp?7M5DP9`7(Rs- z%;S+@+x#=!BOF%DO$V$S(A_5k@~b9VH`%P?EHsW<0y_7D9l)+|Ae1@Y-j}tmHKn8e z2qCNnrd;OHEJZ&7864k&z9@++x6>QOmz#VrD_WS^;^t>Jzp3yu8t061r2YA2){{Jh zjNq<%B)Pdy>Yehp+i~$k16rqY>th$`v54A+I}$jp3Kt7|XoF-UskU0>*iPu5j+n`A(QuzY4uwt}FzSGb2aPdg#Wjq~YoT(-ux(Q4!I0mHR+KXVCfVxb*(PpV3W_ zz5T9s@#OM1eWdEXx8%s|R#H#aAx5BR7mqm%ZLE{-U^2M)9d9i+uT5peYAI+p(MiZY zvT$>K$96gIL_DP)0ZoOb;h!t8C%8P;I-Dk;)H)Sw61Ia$#uQoIZ|rPbLolV3dLxS7 zfsN_+Z(Alm1aDi74zQlti37WJG+0Z9R~SR?!Jb1>ZN6#JIHWNSKP>F$?f(I$E30Ce zU}3-uhLVY%BYWSntglALj*T z_sLRX1dUj+fnBcwt`!1%_1D4Q;ydKC8(bxT7ruW3+@(zXszf|L_Qo62logYYuAS6MHxKqBcb5vI6ERC^le7I^;}B!Umt zmJgQvoA!{cG}oljee%KH1~9qURuPE=n~c>9xgADW8l`fdG;~JoOLXD&4&bWG00t|% z=1i8r#no<}e~;yZw)j3&B*zYtzKQ5G<&-s-F1YS&MeLIA?Weu9(sAJg44q5JGt*kr zXc#?AC@7Zou9AXwns1A)C~DV=?rN7^bPuccSTn$@Lz;d%Djqm`)4aTA@r%N6-)g_(TYu-` z9Ys;vpSIq@6ooN4Cmcj*B0_5LumM<>btu1kvj#}Ne(Ywq*eh+NZctjyf5^DE8!?|z zIQWv0?VhG>61?l33^*4T9!mghGbc`H-t&D6O~(lI=?_d+nbeb5_?@~lIdM+b8|;9V z(6laDuvwSl@*~cFpKN_V;TsUz@G`^92sQqsWlB5ud4ofw3&5dHHQEyDiez{6siVdy z(LM}}y(9RKbu`|jME~gec|MI^!!SOmX2bi^Gl6fcY#Fj#2_+A~DdH+_V!;&Ejz7pu zgtC6w#0hkSr4nOy%Jynec>c-smRCXTV&PFefzFukqxVL<;MwsN<-f#O-eB{)NgbIZ zAybMPpV=XilZX4vO+B}eRUC<&bQtPAGD+BOlM$Sce|p(dU(Gk03upo^C4SR6cc z<-=Il6Ek3;>5-+JC{_nF#*(5-2#z4^m!&?uXPIm z*@%7QZiT)p@mXwTJLQ)Mkcng_kPHD+;F<(NxCy(k20^#kXIAY_Nf1% zcog!UVF;$rndd&p%1wW<`xk6#mazD zft_6o5q1o6&v1yHK(jtr4pR*AUk)8rQ6Zrdkjy-Z$iP}J{R8`1GqGpY$!yZD=CLj} z@XF73K>v)Hl{ovgQ&XP_sIREUK>|k>Ze?ehi6-!fh>SHM3epm+8!wKjK_KfB*BHsr zhm=exQ%82vh+}AQ8t>a0VVxkv-krW!cCyy1<`}Kpy`$SE#q1@7U>`Hnp0abdM$G+9 zBE*fcBY5<~qc^Q(O0>m62=^;7mJjwKoWJi!1~az^lcz}G%OnR;k_C1)lWb6)>(lRa zd(g=M&{=(xqM-6svdz7G?+_%4A6<}LprU)jLMI=#N?}-DStmQ;6ky!>=ETs)OY|_+ zpjXRNUw{}jVsqhBzuC)dhvbiPFDFMF( z^HM}3Wn)ctQ}IfG=S3&jCm1fTF~jYZwyQrCvoyJzt_>A|MRP-4glNob~sK&;4I|x9K@GRL&iL z`^&>#ti0|7K%t)HbWfD`n@s`K&MV%rLoj~>7IOkXi9{9v8B z=QnyBGU0cq~^{w+#C4~Br0!U zuke9m#0+wk?-4c)w_(K`1D~ReKE|p_9s!J>g2H}Bv+N|!Txe59VZu;m<=IBx8j`U@ zE5WNPi@#4TMzS@WajbCLBEtKnw_@FhM=1Q+#X-`}Qv9u&u_%0oF(BRQrf2En2+CpY zt9%b|IC}2F0iyd?7oex5pMl>(A1~@xiY4$ ztE-}M_E2-ctYZ_wrnfVzV-C)V2Q)JiXfX>WTI%s1+V3IbT&<8u^moY>-fJ8DDNK?) z@=lU}V2q%T<-ynf6XfZ~)!m*~j`YeyAUb4yMyJtbFDW)zhjjCG-(PGWq(LbErvUh; z$t^Edf?^Nd_dmUvWhl$o4%Ya*rVx8b?4X=YgRAd;B3(W>i^^KBE_QF zP2SbdUj`E5&mdn%&LCygHx7>q_gw%I_(cHMDQVRSN%k z;Hc1)g~J({74Hi#jcaJHkB1nKbtC(dA#Z21!3+R1OdAA6kfwroDWNno&bcYyxPOj7 zd}s6-$p>4l2V2%Ol5|I_XFYC(Tu3e(`m%a@xUH9(Z!>HEdmGz%k(CY28T_rdG1*Pb z(Z}t{qfxGYI7b53KqADhye=yD^bprmK|Km36|Q8LpY^?l9qPFoQ2rZa?LyoZ;$1v- zRYk_&TbgiAFrj;K^IFAWjv2%Qq`4ODS~{zABY`q8s9R!Xbhe@q>kXJ5B-gq*RHx*; zH*4Jw9O1@6FJ$XkB%QjM>^%@h0E zViS$5eA(atMK}umHH`|h5f>&R<*gDq;NH_Ev2jsd^C zrGC02PgD^z($Q%>k>84q{p|&ki^t~OJ+F+M07x=VpxjN>uw)FOKE@YW-Qj@_@%iF5 zwI#%;2?ct0+wvBnhaCqS_Z$H$@XSB8FhFKIW)t=Uc79+3SP&E6oG56ndqUpTTIX=A zeJM=heSKgsG+zz#wIXLeqVjsx$0Lz!0l+ez*`JhdRnO4kq?{gJb-jrw`mr z3Uk!RmcHYmNUqVZzFu!=(^p)T_z zg?xLnCVh*hiX7`m`lYK2o8E;<;-2{4M%NH%lqZdIT#YTkMc76sL`S!NS6VH}j<@JH ztYGhfUn%<~hz0(*nv5p9PkZOo%68nN1haurm8r>jVo{vI8v(UYgCu6s&5gKBIGaHF zuG;1t`<7=yuzAX_WQKL9jsfHz%U`S6V`1GOrKEiX;-&w$uL1P_jY$6g)2t2_L9(C; zG;QtEkiak^>qERg0=*}10J>7|nM?uj|I2dTf2}Z9N2jljH%4u^7V3I@D*S(Lfp^^B#Z%iad^|6SWf3 zF|pWm9o2u3^9MAt(!sQ71UoyxefNwfA6MD?oyTmu)uf=ED~=a+?Jqbf;oyqkno=&+ zY@oKrwp|t_MUl4ax_CE}XSYacZ#J^>FiJQn=VMW|lQN3CN(bs~knfky)jE-=V*%p> znj<9wFnA3b6_%0xA}<@83xfamuXt5uy3KZllL_kgZ8D2V4GnoJVCE-e(AfNA;VKd< z8i7f10E-2hGW?-!8&%HHaR*%x54NDK(ZVIF zFYpkIDgA9V)$9Dg3j@rvF47wiZI&y8X~`65Y8RIiTKDH$k7|zNZz+;M2iiox)?xG3 z`;-6Hwh0UTpP>F=mFHlsQkV#ydxDx(lW{mC%!SFhw#y#!wIRQXKAy+4(so;u1;Jm< z&!x7!6rmW}NR{%LXM9psIt>k|uiyb$Go4~>?nSK|aFg#Qf?#qAY67r>RnY@Ec3Gjj zDF4r)?x8;1ZKL|LAYQtcAjJzKl!*$FhxFQKKg$Bg0XZ(Ydl^F_#`J1}rI#e=$Y?6$ zs(n3ihys7Kb~FZfxRV-Y^k_lEnNM}37ZuIF&Wtk|HVhO+1lMoVEa$HgfbthobkW{H|Ch?Ap=BbN{i7+ zLH`gAO#a(8y-`+^S>D=BLW8Tn-u?xb(lo15)*mtu73 zFz_=1YOeT6K`jmKjquNQ(_!)4DA`|XS_TecIpSb9SR2UDhQzja9GR2AlaL*kE6h|F zFCFCRh5}6yuwMeQHp?Zg2G*UmhIOO=ES8}UJ2TzPxoqW@8~Pq7alYe0$#BXqYxRFK z(=q=pfh+r|0D{h{4tx2PqepS?lB+DQjNl6Jo8f!Cj?rE$1LrZzExVX9Gtf$V^{v4% z{y!p)r($2vPts5sS#*82eNkjMecjUa7bLH-F;7U5>!GY;Dw7w>dKjg2Os?_?p`?zY1{@CzQx+|8-Oc=Ts~ zDis^C-)+5ryXKw#oZ_9XHlXE|ygt4n?q@w01*8F@vx5cS@Y9|s(#BLHly*n3lg1S} z)rNWcg5+b6$k*Ze>EYKtq=3_^yJv5cdw5)$HlQ8$F?~ih69J$_=892=TK9wflBrm7 z9+evLJ`cJh1#N`|)N=sIMP8nSVxp!5^g_Rkb&e0e3f*@P<*U!({d&Bcsd8Z~e@f@! zw$4?b5Q)V2L9LZ8`wKAu3I_^tsWh} z`ByPSrsH0lnoM18KD_d;7_fGL>VPlFD|P&_4rN{d7!)6R!-_~;H3{7dZ(SDVHvQB< z$l91s-?CJh9I|#>0)g3wXp|q+44v|>CW85_qV4$vvLH&HcVJ@d3@GjVdr>Kshro4* z>z+({=W0CsgU%IgB`3aR4*-V^v}D+Xbv#3?PGH#1RGv0|L-9Kr%P;unImNHTIGj>| z)%<~)Co0hmr4*3R^e#-@v!$I09QB+Dw}PA-#xx#vE{s>TvD~$`p=6v!a*1$O{!q-) zoj=oDT}sk=Ceb^3vS9OxNdd?Nw0--Uq2H8t@V$)HRBEBibxZ#%2PgY@G)Ilu{X-}+ z-6d-aO+W>!x!p%6w6cYQ*szjg7Ck6PfKOka5$^>gH4)2BQa^{^*KWQyVf6~M1f`8!eG%*xZ zsIl@#{L*CQRBUJf!+e z{*;Rn^wEU8Hy2iuN$#{*@k^aH${Loc^rva&u6~^>?ats6b|zA_3m>G(RSf#3UM^So z;`W;+?pWTB2Wu$sUH$d`&NJK>saT=3H<|lG*z03O*ofQ@#=Iq7*6t_Q2e!`zHD63F zkmOTKz4_K1^u5N%ARllWtKd(?N^;ReID-{~W^S*Qz4Nj-&Ryj@48rR!1MeuPV*B~W zE}_mXQn`9lsM^@ul@mitC2vA+J55~k@kFCjgL@oD1W6jZ0lz1cnujXho_k~L5}@4^ z7RMkTvgtfzdYueQhFYkIXt=ULCLm6rb6U$Zw#QvFaQml?GD8!Gi{g8hrP8PZm8k~< zMZt-uP8yq3R(>5l)p7Xb`5F~h&WtKTkzy{0x=JT&lubY7g**`jQ8o$GUj8?o&E~WN Z9_>JA#}DO$H;1oOSJ8P;asSEl{{i*j-ZKCI literal 10013 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/mode-ask.png b/docs/media/tui-lock-v2/runtime/120x40/mode-ask.png index a9bd6d71b02e60a00a8ae2724c2fd654cc3310fe..992a02e77ba7bb23d403b16af23057c8c4a0e3b8 100644 GIT binary patch literal 8988 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 kcP{>y2B{;l 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 U(dcWtWq0sQ3?Wx4F1bGVKaPP*kN^Mx diff --git a/docs/media/tui-lock-v2/runtime/120x40/permissions-picker.png b/docs/media/tui-lock-v2/runtime/120x40/permissions-picker.png index 7d988cee3608e4e7220a28c68842091166d1dd25..bc3211953dab8ebf33025a46ac16147b15e8d2d0 100644 GIT binary patch literal 17520 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 UkuU&ofItt`^&eE+vw!yA0INLL5dZ)H literal 7856 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 literal 8157 zcmeHMdoOsqKp~WC@P7_C3i9IcTR03iDI)^#lt6n=hGCUx2@0~l}fF9S4MyKjHf z)=9=euDDLio@+nV#GN$5&#B~k$rEK1-L4rJc{N7J{QkF_#_1Z=M|1iyKc9gL2HipRvqD7 zTMmZIiH-#qs7dU995pkG6&px{`6;rOL+y`e(fzhbi{)GCvo%?O3Fv z)e&bVAJq>o0BBBm+HsF9LvLa)ceqW8-;c?F`Su zK2Khcu(4pEx5c8fdBgyB)(Zx>Gs(=7K@UyCq;yMsd(RC%w}tzQlx;KBdxIJ$V5n9; zbbHJPUO-`Mv;O7aZB0=DgWLRWq^MC{T<$0*-Ytno!W>TMiX8a7>PE4e;)!cb+{_yB zzWb>f1$969IR5r|_R_d*EL|9n}Ms`qO(yOwk`KB6ITcIYTk zScH}}gI0CQW=@h7w?m16LkZIG(b21Q%gcCOX_iib-<*cL4B)76*4i@dv|NyS@V7K) zGMmft9;uP=Jz4X`ji?i&)IwdQZ?0uCTHpK^o_!bhH<^Gm6Rp>18*Y+w(7=?_rD!21 zu49;2gDvb!i-n;}WFGj+oe<6S^*DIJ-e|*!h4gBzsM(Le_x9vSw-$UMDb;+n)?Eg8 z+TCAE^*VAr%7zcAm=5uV=di-lEa^7Ir~1CS)u(S(KHT^zF3Q(}J-9WGQR!IBt0u|$ zYZq-enrBi-*_>LABLdeP&(~t&+Y&0Aa_@c*d~4Evn136)$&#gwN{UDJw>1o=IgU&J zBLA`wnsWLyd}3Fe?Y&Fkn{rCcR}y~@|EszXuIi`Ar+X4zkRHBVq`Oi9auHg!gBYDo zLmr=E@t3T$r+5c_G$RSI~E;_t1o3l1;EY$v%DhW$5CbW?U|-F4^>6w z%D#Sei$Z#3(yBKKdY((x%JeK>3%l=jOtP8K)%Htg*GVt0ee~9a#d`Knjxv6d5?I5& zG4utXT1aUiC5%?9>=Pj9J1c-WGgd^u>gB$k@Yi#RpquH8vy5zCgR`!dIjq?2kNy~C3V6dwbUzenWmri{ z-Af&CcFGABx$8VST5{01345cbN8Ls%piPJu7*h4UC95V#NP1Ab6sU|&0J7dqrSyG% ztJ-c8H+X@R5Cn$$-|aU7zY+M2z;6V8Bk&u6-w6DFKw#uqZY7s>>EJZ=6PlF~3SOCj z;jOj#;R2SXso?&d^r%7oVF0*#>cBoVP;d;q=hkzRS-Y)1<#Kq+<&Aquj z0aDW4KocT{oZ0zOLRurO!9u#<^N(7U6#$TZ^m-PQU((!T*(F=GmbQK%t>u-={$*9t zx8Xp>s-8J&Kdf-FY%|?6b3(Y)Xj3*i2mrFAZ`t&`MZosf637IDT+H5zozv6fYpcvb zbY8k>b*ib_w@m%%1Hk*@Y({NX*{`IbJD;gIQWEv*GE&jA&}LgO`jpQ$BHq1(*^Fjy zjk=*Uc17+HCqS$4%UR&R7Lf9kW%-4ISx?CDtk`oT4qKCv*rw}MI$KyDO=k~%as<1h z^U2f!AN!{_6qP`TsOBz<*0M|fL+6N4mGFsrW&Q@ov%mzwk7h5?QcvKO#QsRMRXF;o+ZWL z7e|6g$kr%2+^YqDktIUCXKaRCAPI6r)=&4F^?EN}RLoAZ_gP>&2aj-AHonHXiS{=E zfZEC*>|53~7mrnQE({b3B6Qbk1Ddn^cyjZtY)?OZA?8KnP?hzco9@+X30lQJ!I+PV z4K1q&>9zZg8E1sFyK_prnV%^~nRrExosfPy7*O`(J`g^Yv2$@ujDuK+c5G66?dKJP zV&qft6CAU(8>s%DBt4p7{#T`7%aHoj;5!SRjI(#P5t+ZlKr&A(=WhD;&-r1Z>9)&1 z+)=^>Ngi&C1Rd~B5)RjM2Y;f=tKOPLfxOkfHk2^Pi@Y3cAIPS?>`&04D5Kwh*$lOP zH14(6kgz1%v}pImj0Nu6Y|@iZkUY7wRd=C(8?h1W5&Ax#6)I7QzNklaR0GEl87WK3 zBM^U76W)EaEiEj^c&vi~Ag{nSzRV*?@mbBv1`-!uVO$L}FH%L-?M+SIY%Mq`xS9R&~(8%@RD5Pn(=7k6S1c51sQLXO#Z)^P|ytX)ia4zNO zqjt9P;1U{Q6Scm~gG8ViR_db_rb7WM53T)DO`kT>k-lq;gBDFUjc>yI2d2tc2{J{&$Kb*_(CBLZ?IUsU z*Gs%D){`-NW8+NF{`N+ZAMJCS-)K2WVDVxVV-8i?bn3=ADMT2!OuZUloCmv^$0^K(SiC@zys7^)*VS9@3Od7&#Sdw6tK`4~;->+FKZ%GE^=;mFin`3VE{va4Vxv zD!6nEq#2wRjRvV=U!Q#n8wk+;pP3f8`(&T14wvSu(3?*X)jVKDc=aj+3tBx~;2)CM z3lEuv?WeW1_wzl$C37|e&&x3`DIE8rMF}fV<&S(OHo6xnO4GOIJQf{Qx(;(3b%TPS%+uW zmrdBiD(nEDI;5DL>UWHWg7@wMlE`~*R$NQ-L#b0KUP1F|T)lH>VX|=*{R&6v;u~W} zP-jT_om=x}M2jf)*ZAV8$)0*Xju{i5*$(B_GrxrHN%I1Lrny8BkU6J^?!vI5p3JSwTa24h?IOIeRwIa9IE4tvLTU9qd1 ziTB?s&g~18DxKmhl?Qct<3eDDN+%NDIZ%CzJvS1CCQ_51npiJ~G6K>~4(jcK25PCYcvtoH1WZCz`cvE;O#guRk<`k507}?+JINzIkIVpo?y-Ay zIRpa1Ft@k0^+w_VdS~Mg+SV@zq>$8
OLsM;JYdby1S7rI)evKjA0?Z9^b8bPN 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
fR%s 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 Ns_H$icxdzH{{VJzIK}_~ literal 8934 zcmeHMcTiK`mw$qYpooZ~bOiwc0qH$hC`u?_nn*`L0|7!b7&-w|P^zFvFVdw$2pA%Q zpcEzKD^&skA|(QbDxt$ZzQ5U-ot>TCnVp^e%QNqvcjw-F?m6$=&-0Yz+&!kf{Jncb=)WZPq^V7vG zh7&h|{FmR=p&DAs(6?o3FLau#3kf>AJotauZeQz99mrg4*=v=Mv!i`|HARx zG&1v=06-Xq?ILqj7b&D$TruSY^b+N+t^&9o7%5=!uv?8I$yE_PHzf0&Iyi)-rLw!% zj(6tke(+`8hcA%B??|-$d$J&}fAKwzGEVPE)eHwpbp6~jH?>0mPzrrE{ZQqwMld0_ zr|%nRH1N)jWxZHi^g!<)`Qw2<9{A&dKOXqwfj=Jjm_qG=^;`d9<;&!dX5hw&mhRrqr<6+)e~ry ztH!c|kCgEa0HDGvrW2*Za9U^fw1AXy8`=%|NPt%cAVH%kH-pIY!Y9A@X5xJ<0Yf8*PkR(^}&`l=P%FKyg9 zx^r8!x<8KiKEU!$S}^c#tpPm0LQDRDxy606@?e zr+!;aBku}Im`6%a?YK{zx_wsMkt%1&*($wRZ+2w^l33C7aaX3!%wnY!DI<5k*^Z@; zY#~rhE&zCVm|;N|#>fciu6-l>$_+#Do#^_cC2T$xPHKnGceHQLl8}zJU*IREy=u52 zAI8S8iFQ3b`m=e)Kv;y!kMKg;@`~&8I*HvAMlpJjHav`w((e)b{D`#ou}t)kOp~hE z(vkGt$D~&_Aur6R(VZE6U18oSQ5o0@F31 zSjUYvn%bGZqaeEC*rLE2)HA<6jv4n29+bs_Z`HajY+xF9=0996aP&WkR&8;oxj)Cx~9;3lm1KRzFP+_KLM3iWwNy6$!5e*}Bw67cpq%XiE9DH_3am$ufbG7=3q_sd9$ADoC zgJe!CxO>@BNfZU~rp>B~3&^DW-2SmW;+g9k*m6VOnzNGdNz-X?$-%mMr9zpO$v<1h zm)!gE!eIb@3?@-JBWu!OU(?LmTm=yrSQ>m{g_*i_<6Y&x1I?$wZab}!5p)#r>MfLO zT>JpW&MCh`Gtt~#cpblY4V=f+Jdesb#yOG6!gxMku`mQa0Z6lR0Qle*YTo^g=W8ev% zJ?5?Vy#0W*%s^RSQqY-mze?QEk{(9HeDV*8i@`%g+or1eO3voXob_YL6y=H7<0J*? z1i37t65>m)W7QC{x7OdS*B`AUu`hs$`yp)~C)F3o0vNMlEXvol6<`7IJ(0FL7|A8R zd|B`Pn7yDCpD3M=SU*Bb;|@HNmLFdg;90jh!MpMsrbeL0_98x&I{l~`@>Ekj!`ssT z>`Wg#ei5}X3X#;Tnxv=-n=?4sQkk#^D;PkfER+>q zFfz>%H0#E1vb(8G4&meqGuR{1%XfS0_*vHP5sfls2hvXB@2R9;4tP)XJiXr$@uMN_ zJa-sY(~XvtUt8tTipK>S8^sjK%={8>3=Do)HOCuyr%O7B`*w}vYnZF0ou}VoQrmXG zjx5fAMNi$M%}jfDKgA`<{EgRJNRHmyepvw7F8Ae-RaCXz4D9=lpD#Biu-V<{VrUI+>Q!x__f~g%_ICZ*G$3Aeouez@PMj({GZ1CJe?7Y@X?pUhlD^aYJqy^9; zeb;~(Va%Eh^W52eqTHyOf#f&&HrRWv%=C=-@6!6a&ot@51DX;FlH?7_NPLr1Os}^6 zP{;#Q|4TJz?-cMkHuH_U1kWj7c|oPI`S~pw(i+F;=ZM^_{$&7s~8jB8_Y18=U<8_jOQ3bz{?=!H9aVr@)e0t6l8EP=Y(Q zNve0?Njj9?P`4%}@PTCU&U#Jbq`O~(_3g1j5Sqa{*{&w?fw;DH_%0h*vMLeT^yWD| zC50@XbczA#(tj;iqd|ZmP#8MvvGIJ1`9wtk=x2cCK=i;mXW0e$c z&nnLF5D+GE|1qkwZX{&wZqEG$tDH`DxzF8Qe%iK`ze<)NWG&{a#|ma6U-xD-Evzn7 z(^9Ol9g+e(Nbz!(ERMO?w_Q&_4RT1b+4dT$7S2TP^ZHqI^u%a|sBKnP*i_j`wUByu zk6q+OY9YL8Xdc-#|7#yMZ*O7D`ILbl*&>fUl!0uu8?}eAAb7wl>hqW z{{RphuH9a-dpB#gRAYt_{U(pHA#DK!%KbKMMe?h8GwxIR{UkSAl)UvDoaZayp@DN% z?%ZJ=W|Mf_QUfisx1z#_&-%P&$ywupjIw+~*8+$9Vf3~Z>Uxz3s()G8Cr-t08)~?v zmso3P;p#EJk?*R%Z=>DN|Lh0s;ag7m!bG}$j}=*& zPe|R^qrLk^kCAK^|IagkR(wmt7qCQ&OuzKu`Bh>e*?57fWQw!2y3X$Dk94kC==CS$ z)%7MuSl_iEP$6E)D4G#TkfUJ#0b}t5^f__3ev4$V|2ojoH2gTN=*$$<^BQ++_N+^1 z@cMe8&V5~VMZE9ATm)5#EvSnJZz{6ycGAgqa)Bib%O6r!o)XSBG}_5WejE7hdhQGo zaz#C#AN3D9=tqL+(098=HcO$j;v->wl+ZtO@#neHl)20I$WOvJfF94(E{`SYhv_@v zpQcn|luo;P`r}O*m$8%xixkxSSf6*Zly=+jj6kx(NvK89SydX|0+_gp8`rqwb^&2R zC`P!DZ|lUhUG{zF%Lo$;JcHQ^IZE;Id(p} zU8h{CQECBbV7+f;j<=kqb^41(0O9G z^zOf|{E_Z>RhU7c$h>XLdg(J{6?$v}&TzO)9BVTDr#2t|VB&{SU}b9vH<%7BT}>Ll zf9+aj>!jMcr`dmf+5a`_e;QowjNOx|(QFo|_Z;H)0PEW#A&-1nd)E>rz&RWm5B}kU zUrp)@(60srWRO|J07i!qlvyvt<9q@<0OZM6TXx;l+N8ZInn6DHeK?BD5xn(Va;1}$ zqhlbnxyK;0yf|QrO0H^(>X);!Au@vZu0?fVw&@MynEep998hKYDd7mQGJa&cK}KP@ zEK25`E@Qr`dCXS}++DNLzXJZ_++JLj8zl*ln4E7R?wz8hID%>Da zXB`jl@FX&QDDUuC9`D9Q`-?7M7eZ+81g8!JBn?qA2~1mnl_kiDuau$t(I3QchvaR* zRt~^;kS=yWm@~gR+*6xY1dSkHX#0mc6Yi^lbY}$*Vy3exIHQEF1cmQ!k}yXMbF!rn z4aY#En4oZQMalJlC)*}7o70cBS_h);f%MsZ*dv>2ue^;T1etv)=^U|WZJaHYhi)pb zr>tyFz-7m#O&lEDmr*M;1&?38*m%A6h>EtFK>Mq$N?~`^VqYAInqJI$I@bF& zTu4SlP$ro8%hcp@x(cc9DWT0&U!rF(#LX5nCH3P;nN9`hs1-qc0RvR`ON7LykWUPG zGD4K($WaJd5G-c>s-KaVP9)S13WIH(?_-B(KFvEChF-5ZGzrFf!CkG!N`$XccLj zKwkaA`Xq}ix7z44Kv;)ww=7PS#g9`eiHoeLm8#M>n-xujT=It*60s#hKv>knr69H9 z1YgK2>SWP&v2fG{#9LM;Rb0kjwpA3v^tda2AASOWR*`Eq^}S`NgyEej=}Wz(#z(K* z9^nx9tAM0VD`K&vcHDLyd&76MpE+3~p#kk&za`)^u>nP@6xDx_KMDXzf-k6ASIY3D zcAd1ypv}XEF-nQ{sJLfh824~ukbSCmlCJN4Pq4m#N9{|t&&NZ+M55q(kCUUS zn>WA+Px~i&IZGKyw*U04O24o1_ROy}!cbro3EYeXlZr5@gO(d$NyS|P8HM27*jeOU z3d`t6Y0iT_SeV|ytxoY@L?Yt1J=b4QPuI*Jpv}blBB!lmGg%DNj<{MFwyTc%qJbf^ zIr>dYqWhLfgX(}2ywZg%W#>)$XSP39vS@WCOP|bpGt@Nl+eCnM9^?eLOUTi~XTn(;u-{s}CNv14 z3Pm$5wcnMfk1E2sDzf=Sbv{MUF8%CWN}9dOA&*iH>XLf8Wjrj}CJ9yR^< ztHz8Yx4b}%RujRZJZ`-&v_^F6>u#$(l6rJ&Vn7_myEx>85yT+rFDkZ@Y~?`=j;-Tv ztn1@8+?-6%AwO^ZWe(y;25z;*?eW*!Z)n=!7dkoLQgKgYTxxS-85X)DoJz~Y6W`0y zn#vD4p4HcayVFkY95%`E_G1Y0CvK0ouTRy==i4of?!BxKHOzkUq*+ooUUhX$P4XZR z?x^x#_$@pbBg{mfXeS+d5BtIPEe`6g&OAJu zhrz`1|3~~5H>cOY=cnVZ;xT_=Z}GP7BLJ`oIbF4kCJ;kIn;aXmg#y^2MMEN?hQ%M- zw?{T!?yfZ*&{IaSbOo6dYRHY~`LJ51EnplpYieI(3=6PC59g~8ks>WMvGT? zd$M=jG?S|IJU86Q^Lytie?XKuB$ za2r0GYIcz)KH_2J;+$2g(CzIH>^o>V!7J&N#)@e=)|-U@@I<+$KxIaAxA$%$P5c~0 z_8jU?(+RIf+ZGcq`I>Br%3`r4oxg>Ww@dwK0*??8dzD`|ceCiIsjCkwBg!R#t3}{> zy`60}9FqK+91VmW_v-?u;M0j?A_CkrFhfg#Vh<}&6Mz2+udD`qa?Q-yd4HJvM+cTaPJ#~!lNpOJZ*bq zf^TnRAdGgQ^A5~TO0cuCuagA$o;Fx!?IJzok@03?iH{GPzjb#AfhJU4LO`15hvqg+Sn80k8)|)B6a0OQ wcsba0o>EkI19?NIU(xXc()NEL3Df()bHPxNLxO=|Itc)`^h|UsuRBNl8{HrW^#A|> diff --git a/docs/media/tui-lock-v2/runtime/120x40/sandbox-deny.png b/docs/media/tui-lock-v2/runtime/120x40/sandbox-deny.png index 1db20e88cfbcab3d0affefeb3e7b8ebaa32f36a3..717edc64feafd4b627eb779f609b7e21810b1b94 100644 GIT binary patch literal 11982 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 rbSE*q?BS_eT~!|qGTpyr=NXdJD$rq7yYl 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 literal 4996 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 ZGpcG;*9~xqtjpg*dOC*MmG|r-{{vwYnm7Oe diff --git a/docs/media/tui-lock-v2/runtime/40x12/mode-ask.png b/docs/media/tui-lock-v2/runtime/40x12/mode-ask.png index 912dff416660f7b04666083556f9cec211603487..e37b6456b3b933d4ea099c2c1f6d47435b9f33eb 100644 GIT binary patch delta 4271 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 R=(zv@002ovPDHLkV1oRAhIRk| delta 4501 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 diff --git a/docs/media/tui-lock-v2/runtime/40x12/mode-plan.png b/docs/media/tui-lock-v2/runtime/40x12/mode-plan.png index 3a2e2f73024c3d5a57788919e9565033882527f3..b99256b81cbcef964ee224aa072379d813100eea 100644 GIT binary patch literal 5271 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 PZ+`<_6P;Qu=eU0W1X2n6 literal 4874 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 E0*ZPb=l}o! From 5388023af8a9efb234293f856c7c12112bd70dfd Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:47:08 +0000 Subject: [PATCH 07/15] fix(tui): split lock modules and keep custom models distinct Extract MCP panel and session banner helpers so lock files stay under the 1000-line source policy. Split keyboard/mouse handlers to cap complexity. Third-party /model rows keep unique Custom labels without vendor names. Co-authored-by: Mathis --- .../src/interactive/builders/model.rs | 97 ++++++-- src/cortex-tui/src/runner/event_loop/core.rs | 71 ------ src/cortex-tui/src/runner/event_loop/input.rs | 232 +++++++++--------- .../src/runner/event_loop/mcp_panel.rs | 184 ++++++++++++++ src/cortex-tui/src/runner/event_loop/mod.rs | 1 + src/cortex-tui/src/runner/event_loop/modal.rs | 108 -------- src/cortex-tui/src/runner/event_loop/mouse.rs | 193 ++++++++------- .../src/views/minimal_session/mod.rs | 5 +- .../src/views/minimal_session/rendering.rs | 124 +--------- .../views/minimal_session/rendering_banner.rs | 59 +++++ .../views/minimal_session/rendering_user.rs | 66 +++++ 11 files changed, 603 insertions(+), 537 deletions(-) create mode 100644 src/cortex-tui/src/runner/event_loop/mcp_panel.rs create mode 100644 src/cortex-tui/src/views/minimal_session/rendering_banner.rs create mode 100644 src/cortex-tui/src/views/minimal_session/rendering_user.rs diff --git a/src/cortex-tui/src/interactive/builders/model.rs b/src/cortex-tui/src/interactive/builders/model.rs index 06ca6d6a..3d6969bc 100644 --- a/src/cortex-tui/src/interactive/builders/model.rs +++ b/src/cortex-tui/src/interactive/builders/model.rs @@ -52,7 +52,7 @@ fn format_model_row(model: &ModelInfo, is_current: bool) -> (String, String) { if !raw.is_empty() && !looks_foreign(raw) { raw.to_string() } else { - "Custom model".to_string() + format!("Configured as {}", label) } }); if is_max_label(&label) && !desc.contains("MAX") { @@ -65,13 +65,60 @@ fn format_model_row(model: &ModelInfo, is_current: bool) -> (String, String) { } fn cortex_safe_label(id: &str, name: &str) -> String { - for candidate in [name, id] { - let pretty = model_display_name(candidate); - if !looks_foreign(candidate) && !looks_foreign(&pretty) { - return pretty; - } + let name = name.trim(); + if !name.is_empty() + && name != "Custom model" + && !looks_foreign(name) + && !looks_foreign(&model_display_name(name)) + { + return model_display_name(name); + } + if !looks_foreign(id) && !looks_foreign(&model_display_name(id)) { + return model_display_name(id); + } + custom_distinct_label(id) +} + +/// Third-party catalog rows stay distinguishable without naming other vendors. +fn custom_distinct_label(id: &str) -> String { + let rest = remaining_safe_tokens(id); + let tag = short_tag(id); + if rest.is_empty() { + format!("Custom · {tag}") + } else { + format!("Custom · {rest} · {tag}") + } +} + +fn remaining_safe_tokens(id: &str) -> String { + id.split(|c: char| !c.is_ascii_alphanumeric()) + .filter(|p| !p.is_empty()) + .filter(|p| !looks_foreign(p) && !is_vendor_token(p)) + .map(|p| { + let mut chars = p.chars(); + match chars.next() { + Some(first) => first.to_uppercase().collect::() + chars.as_str(), + None => String::new(), + } + }) + .collect::>() + .join(" ") +} + +fn is_vendor_token(token: &str) -> bool { + matches!( + token.to_ascii_lowercase().as_str(), + "gpt" | "claude" | "opus" | "sonnet" | "haiku" | "gemini" | "llama" | "mistral" + ) +} + +fn short_tag(id: &str) -> String { + let mut hash: u32 = 2166136261; + for byte in id.as_bytes() { + hash ^= u32::from(*byte); + hash = hash.wrapping_mul(16777619); } - "Custom model".to_string() + format!("{hash:04x}")[..4].to_string() } fn lock_description(id: &str, label: &str) -> Option { @@ -150,10 +197,8 @@ mod tests { ]; let state = build_model_selector(models, Some("cortex-1-mini"), Some("medium")); let labels: Vec<_> = state.items.iter().map(|i| i.label.as_str()).collect(); - assert_eq!( - labels, - ["Cortex Mini 1", "Cortex 1", "Cortex Max 1", "Custom model"] - ); + assert_eq!(&labels[..3], ["Cortex Mini 1", "Cortex 1", "Cortex Max 1"]); + assert_eq!(labels[3], "Other Router"); assert!( state.items[0] .description @@ -196,22 +241,26 @@ mod tests { } #[test] - fn foreign_provider_ids_become_custom_model() { - let models = vec![ModelInfo::new( - "anthropic/claude-sonnet-4", - "Claude Sonnet 4", - "anthropic", - )]; + fn foreign_provider_ids_become_distinct_custom_rows() { + let models = vec![ + ModelInfo::new("anthropic/claude-sonnet-4", "Claude Sonnet 4", "anthropic"), + ModelInfo::new("openai/gpt-4-turbo", "GPT-4 Turbo", "openai"), + ModelInfo::new("vendor-a/router-west", "Custom model", "custom"), + ModelInfo::new("vendor-b/router-east", "Custom model", "custom"), + ]; let state = build_model_selector(models, None, None); - assert_eq!(state.items[0].label, "Custom model"); - let blob = format!( - "{} {}", - state.items[0].label, - state.items[0].description.clone().unwrap_or_default() - ) - .to_ascii_lowercase(); + let labels: Vec<_> = state.items.iter().map(|i| i.label.clone()).collect(); + assert_eq!(labels.len(), 4); + let unique: std::collections::HashSet<_> = labels.iter().cloned().collect(); + assert_eq!(unique.len(), 4, "{labels:?}"); + let blob = labels.join("\n").to_ascii_lowercase(); assert!(!blob.contains("claude")); assert!(!blob.contains("anthropic")); + assert!(!blob.contains("openai")); + assert!(!blob.contains("gpt-4")); assert!(!blob.contains("sonnet")); + assert!(labels.iter().any(|l| l.starts_with("Custom ·"))); + assert!(labels.iter().any(|l| l.contains("Router West"))); + assert!(labels.iter().any(|l| l.contains("Router East"))); } } diff --git a/src/cortex-tui/src/runner/event_loop/core.rs b/src/cortex-tui/src/runner/event_loop/core.rs index 4a52d155..e1c51f08 100644 --- a/src/cortex-tui/src/runner/event_loop/core.rs +++ b/src/cortex-tui/src/runner/event_loop/core.rs @@ -643,77 +643,6 @@ impl EventLoop { self.add_system_message(&format!("{secs}s · ctrl+c")); } - /// Apply an MCP lifecycle event to the session list and transcript. - pub(super) fn handle_mcp_event(&mut self, event: cortex_engine::mcp::McpLifecycleEvent) { - use crate::modal::mcp_manager::McpStatus; - use cortex_engine::mcp::McpLifecycleEvent; - match event { - McpLifecycleEvent::ServerAdded { name } => { - if !self.app_state.mcp_servers.iter().any(|s| s.name == name) { - self.app_state - .mcp_servers - .push(crate::modal::mcp_manager::McpServerInfo { - name, - status: McpStatus::Stopped, - tool_count: 0, - error: None, - requires_auth: false, - }); - } - } - McpLifecycleEvent::ServerConnected { - name, tool_count, .. - } => { - if let Some(server) = self - .app_state - .mcp_servers - .iter_mut() - .find(|s| s.name == name) - { - server.status = McpStatus::Running; - server.tool_count = tool_count; - server.error = None; - } - } - McpLifecycleEvent::ServerDisconnected { name } => { - let user_stop = self.mcp_stopping.remove(&name); - if let Some(server) = self - .app_state - .mcp_servers - .iter_mut() - .find(|s| s.name == name) - { - if user_stop { - server.status = McpStatus::Stopped; - server.error = None; - } else { - server.status = McpStatus::Error; - server.error = Some("connection lost".into()); - self.add_system_message(&format!("× {name} dropped")); - self.add_system_message(&format!( - "Reconnecting — tools from {name} are paused until it is back." - )); - } - } - } - McpLifecycleEvent::ServerRemoved { name } => { - self.app_state.mcp_servers.retain(|s| s.name != name); - } - McpLifecycleEvent::ConnectionFailed { name, error } => { - if let Some(server) = self - .app_state - .mcp_servers - .iter_mut() - .find(|s| s.name == name) - { - server.status = McpStatus::Error; - server.error = Some(error.clone()); - } - self.add_system_message(&format!("× {name} failed")); - } - } - } - /// Returns the current action context based on app state. pub(super) fn get_action_context(&self) -> ActionContext { use crate::app::FocusTarget; diff --git a/src/cortex-tui/src/runner/event_loop/input.rs b/src/cortex-tui/src/runner/event_loop/input.rs index 79f1aac6..f28a6acb 100644 --- a/src/cortex-tui/src/runner/event_loop/input.rs +++ b/src/cortex-tui/src/runner/event_loop/input.rs @@ -143,30 +143,33 @@ impl EventLoop { key_event: crossterm::event::KeyEvent, terminal: &mut CortexTerminal, ) -> Result<()> { - use crossterm::event::KeyCode; + if self.consume_layer_key(key_event, terminal).await? { + return Ok(()); + } + self.dispatch_session_key(key_event, terminal).await + } + + /// Modal stack, settings, shortcuts, F2, Ctrl+x, pickers, cards, questions. + async fn consume_layer_key( + &mut self, + key_event: crossterm::event::KeyEvent, + terminal: &mut CortexTerminal, + ) -> Result { + use crossterm::event::{KeyCode, KeyModifiers}; - // Check modal stack first (new unified modal system) if self.modal_stack.is_active() { - let result = self.modal_stack.handle_key(key_event); - match result { - ModalResult::Action(action) => { - // Action closes the modal - self.process_modal_action(action).await; - } - ModalResult::ActionContinue(action) => { - // Action keeps the modal open (for live preview) + match self.modal_stack.handle_key(key_event) { + ModalResult::Action(action) | ModalResult::ActionContinue(action) => { self.process_modal_action(action).await; } _ => {} } self.render(terminal)?; - return Ok(()); + return Ok(true); } - // Settings modal (F2 / `/settings`) owns keys while open. if let Some(mut modal) = self.app_state.settings_modal.take() { - let action = modal.handle_key(key_event); - match action { + match modal.handle_key(key_event) { crate::widgets::SettingsAction::Close => { self.app_state.apply_settings_values(&modal.values); self.app_state.settings_modal = None; @@ -180,11 +183,10 @@ impl EventLoop { } } self.render(terminal)?; - return Ok(()); + return Ok(true); } if self.app_state.shortcuts_open { - use crossterm::event::{KeyCode, KeyModifiers}; let close = matches!(key_event.code, KeyCode::Esc | KeyCode::F(2)) || (key_event.code == KeyCode::Char('x') && key_event.modifiers.contains(KeyModifiers::CONTROL)); @@ -196,116 +198,124 @@ impl EventLoop { self.app_state.shortcuts_move(-1); } self.render(terminal)?; - return Ok(()); + return Ok(true); } + if key_event.code == KeyCode::F(2) { + self.app_state.open_settings_modal(); + self.render(terminal)?; + return Ok(true); + } + if key_event.code == KeyCode::Char('x') + && key_event.modifiers.contains(KeyModifiers::CONTROL) { - use crossterm::event::{KeyCode, KeyModifiers}; - if key_event.code == KeyCode::F(2) { - self.app_state.open_settings_modal(); - self.render(terminal)?; - return Ok(()); - } - if key_event.code == KeyCode::Char('x') - && key_event.modifiers.contains(KeyModifiers::CONTROL) - { - self.app_state.toggle_shortcuts_sheet(); - self.render(terminal)?; - return Ok(()); - } + self.app_state.toggle_shortcuts_sheet(); + self.render(terminal)?; + return Ok(true); } - // Check if in interactive mode and handle its input first if self.app_state.is_interactive_mode() { - if let Some(state) = self.app_state.get_interactive_state_mut() { - let result = crate::interactive::handle_interactive_key(state, key_event); - match result { - crate::interactive::InteractiveResult::Selected { - action, - item_id, - item_ids, - } => { - let keep_open = self - .handle_interactive_selection(action, item_id, item_ids) - .await; - if !keep_open { - self.app_state.exit_interactive_mode(); - } - } - crate::interactive::InteractiveResult::FormSubmitted { action_id, values } => { - // Handle inline form submission - // Returns true if we should stay in interactive mode - let stay_open = self.handle_inline_form_submission(&action_id, values); - if !stay_open { - self.app_state.exit_interactive_mode(); - } - } - crate::interactive::InteractiveResult::Cancelled => { - self.reject_pending_approval_and_exit_interactive(); - } - crate::interactive::InteractiveResult::Continue => { - // Just re-render - } - crate::interactive::InteractiveResult::SwitchTab { direction } => { - // Rebuild settings with new tab - if let Some(state) = self.app_state.get_interactive_state() - && !state.tabs.is_empty() - { - let current_tab = state.active_tab; - let num_tabs = state.tabs.len(); - let new_tab = if direction < 0 { - if current_tab == 0 { - num_tabs - 1 - } else { - current_tab - 1 - } - } else { - (current_tab + 1) % num_tabs - }; - // Rebuild settings with new tab using current snapshot - let snapshot = crate::interactive::builders::SettingsSnapshot { - compact_mode: self.app_state.compact_mode, - sandbox_mode: self.app_state.sandbox_mode, - streaming_enabled: self.app_state.streaming_enabled, - sound: self.app_state.sound_enabled, - thinking_enabled: self.app_state.thinking_budget.is_some(), - debug_mode: self.app_state.debug_mode, - ..Default::default() - }; - let new_state = - crate::interactive::builders::build_settings_selector_with_tab( - snapshot, None, new_tab, - ); - self.app_state.enter_interactive_mode(new_state); - } - } - } - } + self.handle_interactive_mode_key(key_event).await?; self.render(terminal)?; - return Ok(()); + return Ok(true); } - // Check if a card is active and handle its input first if self.card_handler.is_active() && self.card_handler.handle_key(key_event) { - // Process any pending card actions self.process_card_actions(); self.render(terminal)?; - return Ok(()); + return Ok(true); } - // Check if a modal is open and handle its input first if self.app_state.has_modal() && self.handle_modal_key(key_event).await? { self.render(terminal)?; - return Ok(()); + return Ok(true); } - // Handle Questions view input if self.app_state.view == AppView::Questions && self.handle_question_key(key_event).await? { self.render(terminal)?; + return Ok(true); + } + + Ok(false) + } + + async fn handle_interactive_mode_key( + &mut self, + key_event: crossterm::event::KeyEvent, + ) -> Result<()> { + let Some(state) = self.app_state.get_interactive_state_mut() else { return Ok(()); + }; + let result = crate::interactive::handle_interactive_key(state, key_event); + match result { + crate::interactive::InteractiveResult::Selected { + action, + item_id, + item_ids, + } => { + let keep_open = self + .handle_interactive_selection(action, item_id, item_ids) + .await; + if !keep_open { + self.app_state.exit_interactive_mode(); + } + } + crate::interactive::InteractiveResult::FormSubmitted { action_id, values } => { + let stay_open = self.handle_inline_form_submission(&action_id, values); + if !stay_open { + self.app_state.exit_interactive_mode(); + } + } + crate::interactive::InteractiveResult::Cancelled => { + self.reject_pending_approval_and_exit_interactive(); + } + crate::interactive::InteractiveResult::Continue => {} + crate::interactive::InteractiveResult::SwitchTab { direction } => { + self.switch_settings_tab(direction); + } } + Ok(()) + } + + fn switch_settings_tab(&mut self, direction: i32) { + let Some(state) = self.app_state.get_interactive_state() else { + return; + }; + if state.tabs.is_empty() { + return; + } + let current_tab = state.active_tab; + let num_tabs = state.tabs.len(); + let new_tab = if direction < 0 { + if current_tab == 0 { + num_tabs - 1 + } else { + current_tab - 1 + } + } else { + (current_tab + 1) % num_tabs + }; + let snapshot = crate::interactive::builders::SettingsSnapshot { + compact_mode: self.app_state.compact_mode, + sandbox_mode: self.app_state.sandbox_mode, + streaming_enabled: self.app_state.streaming_enabled, + sound: self.app_state.sound_enabled, + thinking_enabled: self.app_state.thinking_budget.is_some(), + debug_mode: self.app_state.debug_mode, + ..Default::default() + }; + let new_state = + crate::interactive::builders::build_settings_selector_with_tab(snapshot, None, new_tab); + self.app_state.enter_interactive_mode(new_state); + } + + async fn dispatch_session_key( + &mut self, + key_event: crossterm::event::KeyEvent, + terminal: &mut CortexTerminal, + ) -> Result<()> { + use crossterm::event::KeyCode; - // Handle Ctrl+C with contextual behavior if key_event.code == KeyCode::Char('c') && key_event .modifiers @@ -319,12 +329,10 @@ impl EventLoop { return self.handle_ctrl_c(terminal); } - // Handle ESC with double-tap to quit when idle if key_event.code == KeyCode::Esc { return self.handle_esc(terminal); } - // Reset Ctrl+C and ESC timers on other key presses if key_event.code != KeyCode::Esc { self.app_state.reset_esc(); } @@ -333,15 +341,12 @@ impl EventLoop { let context = self.get_action_context(); let action = self.action_mapper.get_action(key_event, context); - // Check if autocomplete is visible and handle its navigation if self.app_state.autocomplete.visible && self.handle_autocomplete_key(key_event, terminal).await? { return Ok(()); } - // Handle Copy action specially since it needs terminal access - // This handles both Ctrl+C (when text selected) and Ctrl+Shift+C if action == KeyAction::Copy { if self.app_state.text_selection.has_selection() { self.copy_selection_to_clipboard(terminal)?; @@ -351,14 +356,11 @@ impl EventLoop { return Ok(()); } - // Handle '?' key specially: only show help when input is empty - // Otherwise, type '?' into the input if action == KeyAction::Help && key_event.code == KeyCode::Char('?') && context == ActionContext::Input && !self.app_state.input.is_empty() { - // Type '?' into the input instead of opening help self.app_state.text_selection.clear(); self.app_state.input.handle_key(key_event); self.update_autocomplete(); @@ -366,22 +368,14 @@ impl EventLoop { return Ok(()); } - // Forward key events to input widget when focused and no action mapped - // This allows character input, backspace, delete, etc. to work if context == ActionContext::Input && action == KeyAction::None { - // Clear selection when typing self.app_state.text_selection.clear(); - self.app_state.input.handle_key(key_event); - // Update autocomplete based on new input self.update_autocomplete(); } self.handle_action(action).await?; - - // Always render after key input for responsiveness self.render(terminal)?; - Ok(()) } diff --git a/src/cortex-tui/src/runner/event_loop/mcp_panel.rs b/src/cortex-tui/src/runner/event_loop/mcp_panel.rs new file mode 100644 index 00000000..292a2f68 --- /dev/null +++ b/src/cortex-tui/src/runner/event_loop/mcp_panel.rs @@ -0,0 +1,184 @@ +//! MCP panel: picker actions and lifecycle events. + +use super::core::EventLoop; +use crate::modal::mcp_manager::McpStatus; +use cortex_engine::mcp::McpLifecycleEvent; + +impl EventLoop { + /// Re-opens the MCP panel after add / reconnect / stop. + pub(super) fn reopen_mcp_panel(&mut self) { + use crate::interactive::builders::build_mcp_selector; + let servers = self.app_state.mcp_servers.clone(); + let interactive = build_mcp_selector(&servers); + self.app_state.enter_interactive_mode(interactive); + } + + pub(super) async fn handle_mcp_selector_item(&mut self, item_id: &str) -> bool { + if let Some(name) = item_id.strip_prefix("__reconnect__:") { + return self.handle_mcp_server_action(name, "restart").await; + } + match item_id { + "__add__" => { + let interactive = crate::interactive::builders::build_mcp_source_selector(); + self.app_state.enter_interactive_mode(interactive); + true + } + "__tools__" => { + let manager = self.mcp_manager.clone(); + let tools = manager.list_all_tools().await; + if tools.is_empty() { + self.add_system_message("No MCP tools connected."); + } else { + let mut lines: Vec = tools.keys().cloned().collect(); + lines.sort(); + self.add_system_message(&format!( + "MCP tools ({})\n{}", + lines.len(), + lines.join("\n") + )); + } + false + } + "__reload__" => { + let manager = self.mcp_manager.clone(); + tokio::spawn(async move { + let names = manager.server_names().await; + for name in names { + let _ = manager.disconnect(&name).await; + let _ = manager.connect(&name).await; + } + }); + self.app_state.toasts.info("Reloading MCP servers…"); + self.reopen_mcp_panel(); + true + } + name => { + if let Some(server) = self + .app_state + .mcp_servers + .iter() + .find(|s| s.name == name) + .cloned() + { + let interactive = + crate::interactive::builders::build_mcp_server_actions(&server); + self.app_state.enter_interactive_mode(interactive); + true + } else { + false + } + } + } + } + + pub(super) async fn handle_mcp_server_action(&mut self, server: &str, action: &str) -> bool { + let manager = self.mcp_manager.clone(); + let name = server.to_string(); + match action { + "start" | "restart" => { + if action == "restart" { + self.mcp_stopping.insert(name.clone()); + let _ = manager.disconnect(&name).await; + } + if let Some(s) = self + .app_state + .mcp_servers + .iter_mut() + .find(|s| s.name == name) + { + s.status = McpStatus::Starting; + } + tokio::spawn(async move { + let _ = manager.connect(&name).await; + }); + self.reopen_mcp_panel(); + true + } + "stop" => { + self.mcp_stopping.insert(name.clone()); + tokio::spawn(async move { + let _ = manager.disconnect(&name).await; + }); + self.reopen_mcp_panel(); + true + } + "remove" => { + self.mcp_stopping.insert(name.clone()); + let _ = manager.remove_server(&name).await; + self.app_state.mcp_servers.retain(|s| s.name != name); + self.reopen_mcp_panel(); + true + } + _ => false, + } + } + + /// Apply an MCP lifecycle event to the session list and transcript. + pub(super) fn handle_mcp_event(&mut self, event: McpLifecycleEvent) { + match event { + McpLifecycleEvent::ServerAdded { name } => { + if !self.app_state.mcp_servers.iter().any(|s| s.name == name) { + self.app_state + .mcp_servers + .push(crate::modal::mcp_manager::McpServerInfo { + name, + status: McpStatus::Stopped, + tool_count: 0, + error: None, + requires_auth: false, + }); + } + } + McpLifecycleEvent::ServerConnected { + name, tool_count, .. + } => { + if let Some(server) = self + .app_state + .mcp_servers + .iter_mut() + .find(|s| s.name == name) + { + server.status = McpStatus::Running; + server.tool_count = tool_count; + server.error = None; + } + } + McpLifecycleEvent::ServerDisconnected { name } => { + let user_stop = self.mcp_stopping.remove(&name); + if let Some(server) = self + .app_state + .mcp_servers + .iter_mut() + .find(|s| s.name == name) + { + if user_stop { + server.status = McpStatus::Stopped; + server.error = None; + } else { + server.status = McpStatus::Error; + server.error = Some("connection lost".into()); + self.add_system_message(&format!("× {name} dropped")); + self.add_system_message(&format!( + "Reconnecting — tools from {name} are paused until it is back." + )); + } + } + } + McpLifecycleEvent::ServerRemoved { name } => { + self.app_state.mcp_servers.retain(|s| s.name != name); + } + McpLifecycleEvent::ConnectionFailed { name, error } => { + if let Some(server) = self + .app_state + .mcp_servers + .iter_mut() + .find(|s| s.name == name) + { + server.status = McpStatus::Error; + server.error = Some(error.clone()); + } + self.add_system_message(&format!("× {name} failed")); + } + } + } +} diff --git a/src/cortex-tui/src/runner/event_loop/mod.rs b/src/cortex-tui/src/runner/event_loop/mod.rs index ffedacff..82397d46 100644 --- a/src/cortex-tui/src/runner/event_loop/mod.rs +++ b/src/cortex-tui/src/runner/event_loop/mod.rs @@ -33,6 +33,7 @@ mod core; mod handoff; mod input; mod local_workflows; +mod mcp_panel; mod me; mod modal; mod modal_jobs; diff --git a/src/cortex-tui/src/runner/event_loop/modal.rs b/src/cortex-tui/src/runner/event_loop/modal.rs index d6acd7d4..a1617ea2 100644 --- a/src/cortex-tui/src/runner/event_loop/modal.rs +++ b/src/cortex-tui/src/runner/event_loop/modal.rs @@ -510,14 +510,6 @@ impl EventLoop { } } - /// Re-opens the MCP panel to show the list of servers after adding a new one. - pub(super) fn reopen_mcp_panel(&mut self) { - use crate::interactive::builders::build_mcp_selector; - let servers = self.app_state.mcp_servers.clone(); - let interactive = build_mcp_selector(&servers); - self.app_state.enter_interactive_mode(interactive); - } - /// Handles interactive selection. pub(super) async fn handle_interactive_selection( &mut self, @@ -881,106 +873,6 @@ impl EventLoop { self.app_state.enter_interactive_mode(interactive); } - async fn handle_mcp_selector_item(&mut self, item_id: &str) -> bool { - if let Some(name) = item_id.strip_prefix("__reconnect__:") { - return self.handle_mcp_server_action(name, "restart").await; - } - match item_id { - "__add__" => { - let interactive = crate::interactive::builders::build_mcp_source_selector(); - self.app_state.enter_interactive_mode(interactive); - true - } - "__tools__" => { - let manager = self.mcp_manager.clone(); - let tools = manager.list_all_tools().await; - if tools.is_empty() { - self.add_system_message("No MCP tools connected."); - } else { - let mut lines: Vec = tools.keys().cloned().collect(); - lines.sort(); - self.add_system_message(&format!( - "MCP tools ({})\n{}", - lines.len(), - lines.join("\n") - )); - } - false - } - "__reload__" => { - let manager = self.mcp_manager.clone(); - tokio::spawn(async move { - let names = manager.server_names().await; - for name in names { - let _ = manager.disconnect(&name).await; - let _ = manager.connect(&name).await; - } - }); - self.app_state.toasts.info("Reloading MCP servers…"); - self.reopen_mcp_panel(); - true - } - name => { - if let Some(server) = self - .app_state - .mcp_servers - .iter() - .find(|s| s.name == name) - .cloned() - { - let interactive = - crate::interactive::builders::build_mcp_server_actions(&server); - self.app_state.enter_interactive_mode(interactive); - true - } else { - false - } - } - } - } - - async fn handle_mcp_server_action(&mut self, server: &str, action: &str) -> bool { - let manager = self.mcp_manager.clone(); - let name = server.to_string(); - match action { - "start" | "restart" => { - if action == "restart" { - self.mcp_stopping.insert(name.clone()); - let _ = manager.disconnect(&name).await; - } - if let Some(s) = self - .app_state - .mcp_servers - .iter_mut() - .find(|s| s.name == name) - { - s.status = crate::modal::mcp_manager::McpStatus::Starting; - } - tokio::spawn(async move { - let _ = manager.connect(&name).await; - }); - self.reopen_mcp_panel(); - true - } - "stop" => { - self.mcp_stopping.insert(name.clone()); - tokio::spawn(async move { - let _ = manager.disconnect(&name).await; - }); - self.reopen_mcp_panel(); - true - } - "remove" => { - self.mcp_stopping.insert(name.clone()); - let _ = manager.remove_server(&name).await; - self.app_state.mcp_servers.retain(|s| s.name != name); - self.reopen_mcp_panel(); - true - } - _ => false, - } - } - /// Apply a SPEC §3.10 permission-prompt choice. async fn handle_permission_prompt_choice(&mut self, item_id: &str) -> bool { match item_id { diff --git a/src/cortex-tui/src/runner/event_loop/mouse.rs b/src/cortex-tui/src/runner/event_loop/mouse.rs index 9f8728b6..4b0be58c 100644 --- a/src/cortex-tui/src/runner/event_loop/mouse.rs +++ b/src/cortex-tui/src/runner/event_loop/mouse.rs @@ -19,48 +19,7 @@ impl EventLoop { ) -> Result<()> { match action { MouseAction::Click { x, y, button } => { - if self.app_state.shortcuts_open { - if self.app_state.shortcuts_close_hit(x, y) { - self.app_state.close_shortcuts_sheet(); - } else { - let _ = self.app_state.shortcuts_select_at(x, y); - } - self.render(terminal)?; - return Ok(()); - } - - // Handle interactive mode clicks - if self.app_state.is_interactive_mode() - && let Some((action, item_id, item_ids)) = self.handle_interactive_click(x, y) - { - let keep_open = self - .handle_interactive_selection(action, item_id, item_ids) - .await; - if !keep_open { - self.app_state.exit_interactive_mode(); - } - self.render(terminal)?; - return Ok(()); - } - - // Handle question view clicks - if self.app_state.view == crate::app::AppView::Questions - && self.handle_question_click(x, y) - { - self.render(terminal)?; - return Ok(()); - } - - // Find clicked zone - if let Some(zone_id) = self.click_zones.find(x, y) { - let should_copy = self.handle_click(zone_id, button)?; - if should_copy { - self.copy_selection_to_clipboard(terminal)?; - self.app_state.text_selection.clear(); - } - } - - self.render(terminal)?; + self.handle_mouse_click(x, y, button, terminal).await?; } MouseAction::DoubleClick { x, y } => { @@ -108,65 +67,115 @@ impl EventLoop { } MouseAction::Move { x, y } => { - if self.app_state.shortcuts_open { - self.app_state.shortcuts_hover_at(x, y); - self.render(terminal)?; - return Ok(()); - } + self.handle_mouse_move(x, y, terminal)?; + } + } - // Handle hover effects for interactive mode - if self.app_state.is_interactive_mode() - && let Some(state) = self.app_state.get_interactive_state_mut() - { - if let Some(idx) = state.hit_test(x, y) { - if state.hovered != Some(idx) { - state.hovered = Some(idx); - } - } else if state.hovered.is_some() { - state.hovered = None; - } - } + Ok(()) + } - if self.app_state.autocomplete.visible { - let (w, h) = self.app_state.terminal_size; - let footer_y = h.saturating_sub(1); - let composer_y = footer_y.saturating_sub(1 + 3); - let palette_h = if h >= 20 { 8 } else { 3 }; - let palette_y = composer_y.saturating_sub(palette_h); - if y >= palette_y && y < composer_y { - let row = - (y - palette_y) as usize + self.app_state.autocomplete.scroll_offset; - self.app_state.autocomplete.hovered = Some(row); - } else { - self.app_state.autocomplete.hovered = None; - } - let _ = w; - } + async fn handle_mouse_click( + &mut self, + x: u16, + y: u16, + button: MouseButton, + terminal: &mut CortexTerminal, + ) -> Result<()> { + if self.app_state.shortcuts_open { + if self.app_state.shortcuts_close_hit(x, y) { + self.app_state.close_shortcuts_sheet(); + } else { + let _ = self.app_state.shortcuts_select_at(x, y); + } + self.render(terminal)?; + return Ok(()); + } - if let Some(ref mut modal) = self.app_state.settings_modal { - modal.hover_at(y); - } + if self.app_state.is_interactive_mode() + && let Some((action, item_id, item_ids)) = self.handle_interactive_click(x, y) + { + let keep_open = self + .handle_interactive_selection(action, item_id, item_ids) + .await; + if !keep_open { + self.app_state.exit_interactive_mode(); + } + self.render(terminal)?; + return Ok(()); + } - let (_, h) = self.app_state.terminal_size; - let footer_y = h.saturating_sub(1); - let composer_y = footer_y.saturating_sub(1 + 3); - self.app_state.composer_hovered = y >= composer_y && y < footer_y.saturating_sub(1); - if y == footer_y { - self.app_state.footer_hover = Some(0); - } else { - self.app_state.footer_hover = None; - } - let _ = x; + if self.app_state.view == crate::app::AppView::Questions && self.handle_question_click(x, y) + { + self.render(terminal)?; + return Ok(()); + } - // Handle question view hover - if self.app_state.view == crate::app::AppView::Questions { - self.handle_question_hover(x, y); - } + if let Some(zone_id) = self.click_zones.find(x, y) { + let should_copy = self.handle_click(zone_id, button)?; + if should_copy { + self.copy_selection_to_clipboard(terminal)?; + self.app_state.text_selection.clear(); + } + } - self.render(terminal)?; + self.render(terminal)?; + Ok(()) + } + + fn handle_mouse_move(&mut self, x: u16, y: u16, terminal: &mut CortexTerminal) -> Result<()> { + if self.app_state.shortcuts_open { + self.app_state.shortcuts_hover_at(x, y); + self.render(terminal)?; + return Ok(()); + } + + if self.app_state.is_interactive_mode() + && let Some(state) = self.app_state.get_interactive_state_mut() + { + if let Some(idx) = state.hit_test(x, y) { + if state.hovered != Some(idx) { + state.hovered = Some(idx); + } + } else if state.hovered.is_some() { + state.hovered = None; } } + if self.app_state.autocomplete.visible { + let (w, h) = self.app_state.terminal_size; + let footer_y = h.saturating_sub(1); + let composer_y = footer_y.saturating_sub(1 + 3); + let palette_h = if h >= 20 { 8 } else { 3 }; + let palette_y = composer_y.saturating_sub(palette_h); + if y >= palette_y && y < composer_y { + let row = (y - palette_y) as usize + self.app_state.autocomplete.scroll_offset; + self.app_state.autocomplete.hovered = Some(row); + } else { + self.app_state.autocomplete.hovered = None; + } + let _ = w; + } + + if let Some(ref mut modal) = self.app_state.settings_modal { + modal.hover_at(y); + } + + let (_, h) = self.app_state.terminal_size; + let footer_y = h.saturating_sub(1); + let composer_y = footer_y.saturating_sub(1 + 3); + self.app_state.composer_hovered = y >= composer_y && y < footer_y.saturating_sub(1); + if y == footer_y { + self.app_state.footer_hover = Some(0); + } else { + self.app_state.footer_hover = None; + } + let _ = x; + + if self.app_state.view == crate::app::AppView::Questions { + self.handle_question_hover(x, y); + } + + self.render(terminal)?; Ok(()) } diff --git a/src/cortex-tui/src/views/minimal_session/mod.rs b/src/cortex-tui/src/views/minimal_session/mod.rs index 9009411a..af1aa464 100644 --- a/src/cortex-tui/src/views/minimal_session/mod.rs +++ b/src/cortex-tui/src/views/minimal_session/mod.rs @@ -10,6 +10,8 @@ mod checklist; mod layout; mod rendering; +mod rendering_banner; +mod rendering_user; mod text_utils; mod view; @@ -20,7 +22,8 @@ mod tests; pub(crate) const VERSION: &str = env!("CARGO_PKG_VERSION"); // Re-export main types for backwards compatibility -pub use rendering::{EMPTY_SESSION_HINTS, user_turn_lines}; +pub use rendering::EMPTY_SESSION_HINTS; +pub use rendering_user::user_turn_lines; pub use view::{ BLOCK_CURSOR, COMPOSER_ROWS, ChatMessage, MinimalSessionView, PALETTE_FOOTER_HINT, PALETTE_FOOTER_HINT_SHORT, PLACEHOLDER_IDLE, PLACEHOLDER_RUNNING, paint_composer_contents, diff --git a/src/cortex-tui/src/views/minimal_session/rendering.rs b/src/cortex-tui/src/views/minimal_session/rendering.rs index a5b8c2f0..72634594 100644 --- a/src/cortex-tui/src/views/minimal_session/rendering.rs +++ b/src/cortex-tui/src/views/minimal_session/rendering.rs @@ -21,17 +21,9 @@ use crate::views::tool_call::{ContentSegment, ToolCallDisplay, ToolStatus}; use super::VERSION; use super::checklist::render_working_checklist; +use super::rendering_user::user_turn_lines; use super::text_utils::wrap_text; -/// Renders the "← Back to main conversation" hint when viewing a subagent. -/// Displays in the top-left area of the screen. -pub fn render_back_to_main_hint(area: Rect, buf: &mut Buffer, colors: &AdaptiveColors) { - let hint = "← Back to main (Esc)"; - let style = Style::default().fg(colors.text_dim); - // Render at the start of the area with 1 character padding - buf.set_string(area.x + 1, area.y, hint, style); -} - /// Renders a single message to lines with optional markdown theme. pub fn render_message_with_theme( msg: &Message, @@ -176,64 +168,6 @@ pub fn render_message_with_theme( lines } -/// A past user turn as full-width bar rows: `> text` on the first row, the -/// wrapped continuation indented under the copy, every row padded to `width` -/// so the gray bar spans the terminal. Timestamp is 12h on the first row when -/// the viewport is wide enough. -pub fn user_turn_lines( - content: &str, - width: u16, - colors: &AdaptiveColors, - timestamp: Option<&str>, - compact: bool, -) -> Vec> { - let bar = Style::default().fg(colors.text).bg(colors.user_bg); - let gutter = if compact { 0 } else { 1 }; - let indent = if compact { 0 } else { 2 }; // spaces inside the bar before `>` - let width = width.max(3) as usize; - let ts = timestamp.filter(|_| width >= 80 && !compact).unwrap_or(""); - let ts_w = if ts.is_empty() { - 0 - } else { - ts.chars().count() + 2 - }; - let text_width = width - .saturating_sub(gutter + 1 + indent + 2) - .saturating_sub(ts_w) - .max(8); - let mut lines = Vec::new(); - let wrapped = wrap_text(content, text_width); - let rows: Vec = if wrapped.is_empty() { - vec![String::new()] - } else { - wrapped - }; - for (i, row) in rows.iter().enumerate() { - let prefix = if i == 0 { "> " } else { " " }; - let mut spans = Vec::new(); - if gutter > 0 { - spans.push(Span::raw(" ".repeat(gutter))); - } - let mut text = format!("{}{}{row}", " ".repeat(indent), prefix); - let used = unicode_width::UnicodeWidthStr::width(text.as_str()); - let pad_target = if i == 0 && !ts.is_empty() { - width.saturating_sub(gutter + ts.chars().count()) - } else { - width.saturating_sub(gutter) - }; - text.push_str(&" ".repeat(pad_target.saturating_sub(used))); - spans.push(Span::styled(text, bar)); - if i == 0 && !ts.is_empty() { - spans.push(Span::styled( - ts.to_string(), - Style::default().fg(colors.text_dim).bg(colors.user_bg), - )); - } - lines.push(Line::from(spans)); - } - lines -} - /// Renders a single tool call as one card: name + path + body. pub fn render_tool_call( call: &ToolCallDisplay, @@ -1010,58 +944,4 @@ pub fn _render_welcome_text_centered( paragraph.render(text_area, buf); } -/// Renders an update notification banner above the input box. -/// Shows different states: Available, Downloading (with progress), ReadyToRestart -pub fn render_update_banner( - area: Rect, - buf: &mut Buffer, - colors: &AdaptiveColors, - update_status: &crate::app::UpdateStatus, -) { - use crate::app::UpdateStatus; - - if area.is_empty() || area.height < 1 { - return; - } - - // Gray copy throughout; only the `✓` of a finished download is green. - let (icon, icon_style, text) = match update_status { - UpdateStatus::Available { version } => ( - "↑", - Style::default().fg(colors.text), - format!(" A new version ({}) is available ", version), - ), - UpdateStatus::Downloading { - version: _, - progress, - } => ( - "⟳", - Style::default().fg(colors.text_dim), - format!(" Downloading update... {}% ", progress), - ), - UpdateStatus::ReadyToRestart { version: _ } => ( - "✓", - Style::default().fg(colors.success), - " You must restart to run the latest version ".to_string(), - ), - _ => return, // Don't render for other states - }; - let text_style = Style::default().fg(colors.text); - - // Calculate banner width - let banner_width = (icon.chars().count() + text.len() + 2) as u16; // +2 for spacing - - // Position at left side of the area with some padding - let x = area.x + 2; - let y = area.y; - - if x + banner_width > area.right() { - return; - } - - // Render icon - buf.set_string(x, y, icon, icon_style); - - // Render text - buf.set_string(x + icon.chars().count() as u16 + 1, y, &text, text_style); -} +pub use super::rendering_banner::{render_back_to_main_hint, render_update_banner}; diff --git a/src/cortex-tui/src/views/minimal_session/rendering_banner.rs b/src/cortex-tui/src/views/minimal_session/rendering_banner.rs new file mode 100644 index 00000000..0ee5055e --- /dev/null +++ b/src/cortex-tui/src/views/minimal_session/rendering_banner.rs @@ -0,0 +1,59 @@ +//! Session chrome banners (update + back-to-main). + +use ratatui::buffer::Buffer; +use ratatui::layout::Rect; +use ratatui::style::Style; + +use crate::ui::colors::AdaptiveColors; + +/// Renders the "← Back to main conversation" hint when viewing a subagent. +pub fn render_back_to_main_hint(area: Rect, buf: &mut Buffer, colors: &AdaptiveColors) { + let hint = "← Back to main (Esc)"; + let style = Style::default().fg(colors.text_dim); + buf.set_string(area.x + 1, area.y, hint, style); +} + +/// Renders an update notification banner above the input box. +pub fn render_update_banner( + area: Rect, + buf: &mut Buffer, + colors: &AdaptiveColors, + update_status: &crate::app::UpdateStatus, +) { + use crate::app::UpdateStatus; + + if area.is_empty() || area.height < 1 { + return; + } + + let (icon, icon_style, text) = match update_status { + UpdateStatus::Available { version } => ( + "↑", + Style::default().fg(colors.text), + format!(" A new version ({}) is available ", version), + ), + UpdateStatus::Downloading { + version: _, + progress, + } => ( + "⟳", + Style::default().fg(colors.text_dim), + format!(" Downloading update... {}% ", progress), + ), + UpdateStatus::ReadyToRestart { version: _ } => ( + "✓", + Style::default().fg(colors.success), + " You must restart to run the latest version ".to_string(), + ), + _ => return, + }; + let text_style = Style::default().fg(colors.text); + let banner_width = (icon.chars().count() + text.len() + 2) as u16; + let x = area.x + 2; + let y = area.y; + if x + banner_width > area.right() { + return; + } + buf.set_string(x, y, icon, icon_style); + buf.set_string(x + icon.chars().count() as u16 + 1, y, &text, text_style); +} diff --git a/src/cortex-tui/src/views/minimal_session/rendering_user.rs b/src/cortex-tui/src/views/minimal_session/rendering_user.rs new file mode 100644 index 00000000..f9fe40cd --- /dev/null +++ b/src/cortex-tui/src/views/minimal_session/rendering_user.rs @@ -0,0 +1,66 @@ +//! User-turn bars for the session transcript. + +use ratatui::style::Style; +use ratatui::text::{Line, Span}; + +use crate::ui::colors::AdaptiveColors; + +use super::text_utils::wrap_text; + +/// A past user turn as full-width bar rows: `> text` on the first row, the +/// wrapped continuation indented under the copy, every row padded to `width` +/// so the gray bar spans the terminal. Timestamp is 12h on the first row when +/// the viewport is wide enough. +pub fn user_turn_lines( + content: &str, + width: u16, + colors: &AdaptiveColors, + timestamp: Option<&str>, + compact: bool, +) -> Vec> { + let bar = Style::default().fg(colors.text).bg(colors.user_bg); + let gutter = if compact { 0 } else { 1 }; + let indent = if compact { 0 } else { 2 }; + let width = width.max(3) as usize; + let ts = timestamp.filter(|_| width >= 80 && !compact).unwrap_or(""); + let ts_w = if ts.is_empty() { + 0 + } else { + ts.chars().count() + 2 + }; + let text_width = width + .saturating_sub(gutter + 1 + indent + 2) + .saturating_sub(ts_w) + .max(8); + let mut lines = Vec::new(); + let wrapped = wrap_text(content, text_width); + let rows: Vec = if wrapped.is_empty() { + vec![String::new()] + } else { + wrapped + }; + for (i, row) in rows.iter().enumerate() { + let prefix = if i == 0 { "> " } else { " " }; + let mut spans = Vec::new(); + if gutter > 0 { + spans.push(Span::raw(" ".repeat(gutter))); + } + let mut text = format!("{}{}{row}", " ".repeat(indent), prefix); + let used = unicode_width::UnicodeWidthStr::width(text.as_str()); + let pad_target = if i == 0 && !ts.is_empty() { + width.saturating_sub(gutter + ts.chars().count()) + } else { + width.saturating_sub(gutter) + }; + text.push_str(&" ".repeat(pad_target.saturating_sub(used))); + spans.push(Span::styled(text, bar)); + if i == 0 && !ts.is_empty() { + spans.push(Span::styled( + ts.to_string(), + Style::default().fg(colors.text_dim).bg(colors.user_bg), + )); + } + lines.push(Line::from(spans)); + } + lines +} From 87d99c33ac076eeb76252653595fee262711a452 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:53:37 +0000 Subject: [PATCH 08/15] fix(tui): split key handlers after rebase onto main Keep interactive, overlay, and selection dispatch under the source policy complexity cap now that #67 is on main. Co-authored-by: Mathis --- src/cortex-tui/src/interactive/handlers.rs | 192 ++++---- src/cortex-tui/src/runner/event_loop/input.rs | 144 +++--- src/cortex-tui/src/runner/event_loop/modal.rs | 449 +++++++++--------- 3 files changed, 404 insertions(+), 381 deletions(-) diff --git a/src/cortex-tui/src/interactive/handlers.rs b/src/cortex-tui/src/interactive/handlers.rs index f81353bd..c7696259 100644 --- a/src/cortex-tui/src/interactive/handlers.rs +++ b/src/cortex-tui/src/interactive/handlers.rs @@ -8,13 +8,59 @@ use std::collections::HashMap; /// /// Returns an `InteractiveResult` indicating what action to take. pub fn handle_interactive_key(state: &mut InteractiveState, key: KeyEvent) -> InteractiveResult { - // If inline form is active, handle form input if state.is_form_active() { return handle_form_key(state, key); } + if let Some(result) = handle_interactive_nav(state, key) { + return result; + } + match key.code { + KeyCode::Enter => handle_interactive_enter(state), + KeyCode::Char(' ') if state.multi_select => { + state.toggle_check(); + state.select_next(); + InteractiveResult::Continue + } + KeyCode::Esc => InteractiveResult::Cancelled, + KeyCode::Char('c') if key.modifiers == KeyModifiers::CONTROL => { + InteractiveResult::Cancelled + } + KeyCode::Char('q') if key.modifiers == KeyModifiers::CONTROL => { + InteractiveResult::Cancelled + } + KeyCode::Char(c) if state.searchable && key.modifiers.is_empty() => { + if state.search_query.is_empty() { + if let Some(result) = try_resume_picker_key(state, c) { + return result; + } + } + if !state.search_query.is_empty() || !is_shortcut(state, c) { + state.push_search_char(c); + } else if let Some(result) = try_shortcut(state, c) { + return result; + } + InteractiveResult::Continue + } + KeyCode::Char(c) if !state.searchable && key.modifiers.is_empty() => { + handle_non_search_char(state, c) + } + KeyCode::Backspace if state.searchable && !state.search_query.is_empty() => { + state.pop_search_char(); + InteractiveResult::Continue + } + KeyCode::Char('u') if key.modifiers == KeyModifiers::CONTROL && state.searchable => { + state.update_search(""); + InteractiveResult::Continue + } + _ => InteractiveResult::Continue, + } +} +fn handle_interactive_nav( + state: &mut InteractiveState, + key: KeyEvent, +) -> Option { match key.code { - // Navigation KeyCode::Up | KeyCode::Char('k') if key.modifiers.is_empty() || key.modifiers == KeyModifiers::NONE => { @@ -23,7 +69,7 @@ pub fn handle_interactive_key(state: &mut InteractiveState, key: KeyEvent) -> In } else { state.select_prev(); } - InteractiveResult::Continue + Some(InteractiveResult::Continue) } KeyCode::Down | KeyCode::Char('j') if key.modifiers.is_empty() || key.modifiers == KeyModifiers::NONE => @@ -33,38 +79,32 @@ pub fn handle_interactive_key(state: &mut InteractiveState, key: KeyEvent) -> In } else { state.select_next(); } - InteractiveResult::Continue + Some(InteractiveResult::Continue) } - - // Ctrl+P / Ctrl+N for navigation (like emacs) KeyCode::Char('p') if key.modifiers == KeyModifiers::CONTROL => { state.select_prev(); - InteractiveResult::Continue + Some(InteractiveResult::Continue) } KeyCode::Char('n') if key.modifiers == KeyModifiers::CONTROL => { state.select_next(); - InteractiveResult::Continue + Some(InteractiveResult::Continue) } - - // Page navigation KeyCode::PageUp => { for _ in 0..state.max_visible { state.select_prev(); } - InteractiveResult::Continue + Some(InteractiveResult::Continue) } KeyCode::PageDown => { for _ in 0..state.max_visible { state.select_next(); } - InteractiveResult::Continue + Some(InteractiveResult::Continue) } - - // Home/End KeyCode::Home => { state.selected = 0; state.scroll_offset = 0; - InteractiveResult::Continue + Some(InteractiveResult::Continue) } KeyCode::End => { if !state.filtered_indices.is_empty() { @@ -73,99 +113,45 @@ pub fn handle_interactive_key(state: &mut InteractiveState, key: KeyEvent) -> In state.scroll_offset = state.selected - state.max_visible + 1; } } - InteractiveResult::Continue + Some(InteractiveResult::Continue) } - - // Tab navigation (Left/Right) - KeyCode::Left if !state.tabs.is_empty() => InteractiveResult::SwitchTab { direction: -1 }, - KeyCode::Right if !state.tabs.is_empty() => InteractiveResult::SwitchTab { direction: 1 }, - - // `/model` Effort radios: Tab jumps between the model list and the effort pane. - KeyCode::Tab if state.effort.is_some() => { - state.toggle_effort_focus(); - InteractiveResult::Continue + KeyCode::Left if !state.tabs.is_empty() => { + Some(InteractiveResult::SwitchTab { direction: -1 }) } - - // Selection - KeyCode::Enter => { - if state.effort.is_some() && !state.effort_focused { - state.effort_focused = true; - return InteractiveResult::Continue; - } - if let Some(item) = state.selected_item() { - if item.disabled { - InteractiveResult::Continue - } else if state.multi_select && !state.checked.is_empty() { - // Return all checked items - let item_ids: Vec = - state.checked_items().iter().map(|i| i.id.clone()).collect(); - InteractiveResult::Selected { - action: state.action.clone(), - item_id: item_ids.first().cloned().unwrap_or_default(), - item_ids, - } - } else { - InteractiveResult::Selected { - action: state.action.clone(), - item_id: item.id.clone(), - item_ids: vec![item.id.clone()], - } - } - } else { - InteractiveResult::Continue - } - } - - // Toggle (multi-select) - KeyCode::Char(' ') if state.multi_select => { - state.toggle_check(); - state.select_next(); // Move to next after toggle - InteractiveResult::Continue - } - - // Cancel (Esc, Ctrl+C, Ctrl+Q) - KeyCode::Esc => InteractiveResult::Cancelled, - KeyCode::Char('c') if key.modifiers == KeyModifiers::CONTROL => { - InteractiveResult::Cancelled - } - KeyCode::Char('q') if key.modifiers == KeyModifiers::CONTROL => { - InteractiveResult::Cancelled - } - - // Search input (when searchable) - KeyCode::Char(c) if state.searchable && key.modifiers.is_empty() => { - if state.search_query.is_empty() { - if let Some(result) = try_resume_picker_key(state, c) { - return result; - } - } - // Check for shortcuts first - if !state.search_query.is_empty() || !is_shortcut(state, c) { - state.push_search_char(c); - } else if let Some(result) = try_shortcut(state, c) { - return result; - } - InteractiveResult::Continue - } - - // Shortcuts (when not searching) - KeyCode::Char(c) if !state.searchable && key.modifiers.is_empty() => { - handle_non_search_char(state, c) + KeyCode::Right if !state.tabs.is_empty() => { + Some(InteractiveResult::SwitchTab { direction: 1 }) } - - // Backspace (search) - KeyCode::Backspace if state.searchable && !state.search_query.is_empty() => { - state.pop_search_char(); - InteractiveResult::Continue - } - - // Clear search - KeyCode::Char('u') if key.modifiers == KeyModifiers::CONTROL && state.searchable => { - state.update_search(""); - InteractiveResult::Continue + KeyCode::Tab if state.effort.is_some() => { + state.toggle_effort_focus(); + Some(InteractiveResult::Continue) } + _ => None, + } +} - _ => InteractiveResult::Continue, +fn handle_interactive_enter(state: &mut InteractiveState) -> InteractiveResult { + if state.effort.is_some() && !state.effort_focused { + state.effort_focused = true; + return InteractiveResult::Continue; + } + let Some(item) = state.selected_item() else { + return InteractiveResult::Continue; + }; + if item.disabled { + return InteractiveResult::Continue; + } + if state.multi_select && !state.checked.is_empty() { + let item_ids: Vec = state.checked_items().iter().map(|i| i.id.clone()).collect(); + return InteractiveResult::Selected { + action: state.action.clone(), + item_id: item_ids.first().cloned().unwrap_or_default(), + item_ids, + }; + } + InteractiveResult::Selected { + action: state.action.clone(), + item_id: item.id.clone(), + item_ids: vec![item.id.clone()], } } diff --git a/src/cortex-tui/src/runner/event_loop/input.rs b/src/cortex-tui/src/runner/event_loop/input.rs index f28a6acb..10b31dcd 100644 --- a/src/cortex-tui/src/runner/event_loop/input.rs +++ b/src/cortex-tui/src/runner/event_loop/input.rs @@ -155,87 +155,123 @@ impl EventLoop { key_event: crossterm::event::KeyEvent, terminal: &mut CortexTerminal, ) -> Result { - use crossterm::event::{KeyCode, KeyModifiers}; - - if self.modal_stack.is_active() { - match self.modal_stack.handle_key(key_event) { - ModalResult::Action(action) | ModalResult::ActionContinue(action) => { - self.process_modal_action(action).await; - } - _ => {} - } - self.render(terminal)?; - return Ok(true); - } - - if let Some(mut modal) = self.app_state.settings_modal.take() { - match modal.handle_key(key_event) { - crate::widgets::SettingsAction::Close => { - self.app_state.apply_settings_values(&modal.values); - self.app_state.settings_modal = None; - } - crate::widgets::SettingsAction::Changed(_) => { - self.app_state.apply_settings_values(&modal.values); - self.app_state.settings_modal = Some(modal); - } - crate::widgets::SettingsAction::Continue => { - self.app_state.settings_modal = Some(modal); - } - } - self.render(terminal)?; + if self.try_modal_stack_key(key_event, terminal).await? { return Ok(true); } - - if self.app_state.shortcuts_open { - let close = matches!(key_event.code, KeyCode::Esc | KeyCode::F(2)) - || (key_event.code == KeyCode::Char('x') - && key_event.modifiers.contains(KeyModifiers::CONTROL)); - if close { - self.app_state.close_shortcuts_sheet(); - } else if matches!(key_event.code, KeyCode::Down | KeyCode::Char('j')) { - self.app_state.shortcuts_move(1); - } else if matches!(key_event.code, KeyCode::Up | KeyCode::Char('k')) { - self.app_state.shortcuts_move(-1); - } - self.render(terminal)?; + if self.try_settings_modal_key(key_event, terminal)? { return Ok(true); } - - if key_event.code == KeyCode::F(2) { - self.app_state.open_settings_modal(); - self.render(terminal)?; + if self.try_shortcuts_sheet_key(key_event, terminal)? { return Ok(true); } - if key_event.code == KeyCode::Char('x') - && key_event.modifiers.contains(KeyModifiers::CONTROL) - { - self.app_state.toggle_shortcuts_sheet(); - self.render(terminal)?; + if self.try_chrome_toggle_key(key_event, terminal)? { return Ok(true); } - if self.app_state.is_interactive_mode() { self.handle_interactive_mode_key(key_event).await?; self.render(terminal)?; return Ok(true); } - if self.card_handler.is_active() && self.card_handler.handle_key(key_event) { self.process_card_actions(); self.render(terminal)?; return Ok(true); } - if self.app_state.has_modal() && self.handle_modal_key(key_event).await? { self.render(terminal)?; return Ok(true); } - if self.app_state.view == AppView::Questions && self.handle_question_key(key_event).await? { self.render(terminal)?; return Ok(true); } + Ok(false) + } + async fn try_modal_stack_key( + &mut self, + key_event: crossterm::event::KeyEvent, + terminal: &mut CortexTerminal, + ) -> Result { + if !self.modal_stack.is_active() { + return Ok(false); + } + match self.modal_stack.handle_key(key_event) { + ModalResult::Action(action) | ModalResult::ActionContinue(action) => { + self.process_modal_action(action).await; + } + _ => {} + } + self.render(terminal)?; + Ok(true) + } + + fn try_settings_modal_key( + &mut self, + key_event: crossterm::event::KeyEvent, + terminal: &mut CortexTerminal, + ) -> Result { + let Some(mut modal) = self.app_state.settings_modal.take() else { + return Ok(false); + }; + match modal.handle_key(key_event) { + crate::widgets::SettingsAction::Close => { + self.app_state.apply_settings_values(&modal.values); + self.app_state.settings_modal = None; + } + crate::widgets::SettingsAction::Changed(_) => { + self.app_state.apply_settings_values(&modal.values); + self.app_state.settings_modal = Some(modal); + } + crate::widgets::SettingsAction::Continue => { + self.app_state.settings_modal = Some(modal); + } + } + self.render(terminal)?; + Ok(true) + } + + fn try_shortcuts_sheet_key( + &mut self, + key_event: crossterm::event::KeyEvent, + terminal: &mut CortexTerminal, + ) -> Result { + use crossterm::event::{KeyCode, KeyModifiers}; + if !self.app_state.shortcuts_open { + return Ok(false); + } + let close = matches!(key_event.code, KeyCode::Esc | KeyCode::F(2)) + || (key_event.code == KeyCode::Char('x') + && key_event.modifiers.contains(KeyModifiers::CONTROL)); + if close { + self.app_state.close_shortcuts_sheet(); + } else if matches!(key_event.code, KeyCode::Down | KeyCode::Char('j')) { + self.app_state.shortcuts_move(1); + } else if matches!(key_event.code, KeyCode::Up | KeyCode::Char('k')) { + self.app_state.shortcuts_move(-1); + } + self.render(terminal)?; + Ok(true) + } + + fn try_chrome_toggle_key( + &mut self, + key_event: crossterm::event::KeyEvent, + terminal: &mut CortexTerminal, + ) -> Result { + use crossterm::event::{KeyCode, KeyModifiers}; + if key_event.code == KeyCode::F(2) { + self.app_state.open_settings_modal(); + self.render(terminal)?; + return Ok(true); + } + if key_event.code == KeyCode::Char('x') + && key_event.modifiers.contains(KeyModifiers::CONTROL) + { + self.app_state.toggle_shortcuts_sheet(); + self.render(terminal)?; + return Ok(true); + } Ok(false) } diff --git a/src/cortex-tui/src/runner/event_loop/modal.rs b/src/cortex-tui/src/runner/event_loop/modal.rs index a1617ea2..cf5c8362 100644 --- a/src/cortex-tui/src/runner/event_loop/modal.rs +++ b/src/cortex-tui/src/runner/event_loop/modal.rs @@ -565,86 +565,7 @@ impl EventLoop { return false; } InteractiveAction::ToggleSetting => { - if item_id == "__hub__" || item_id.starts_with("__cat_") { - let interactive = crate::interactive::builders::build_settings_hub(Some( - self.app_state.terminal_size.1, - )); - self.app_state.enter_interactive_mode(interactive); - return true; - } - if let Some(section) = item_id.strip_prefix("__section_") { - let snapshot = self.settings_snapshot(); - let interactive = crate::interactive::builders::build_settings_section( - snapshot, - Some(self.app_state.terminal_size.1), - section, - ); - self.app_state.enter_interactive_mode(interactive); - return true; - } - match item_id.as_str() { - "model" => { - self.app_state.exit_interactive_mode(); - self.handle_open_modal(crate::commands::ModalType::ModelPicker) - .await; - return true; - } - "mode" => { - self.app_state.exit_interactive_mode(); - self.handle_open_modal(crate::commands::ModalType::Mode) - .await; - return true; - } - "permissions" => { - self.app_state.exit_interactive_mode(); - self.handle_open_modal(crate::commands::ModalType::Permissions) - .await; - return true; - } - "sandbox" => { - let interactive = crate::interactive::builders::build_sandbox_selector( - self.app_state.sandbox_mode, - ); - self.app_state.enter_interactive_mode(interactive); - return true; - } - "mcp" => { - self.app_state.exit_interactive_mode(); - self.handle_open_modal(crate::commands::ModalType::McpManager) - .await; - return true; - } - "config" => { - self.app_state.exit_interactive_mode(); - let path = dirs::home_dir() - .map(|h| h.join(".cortex").join("config.json")) - .unwrap_or_else(|| std::path::PathBuf::from("~/.cortex/config.json")); - self.add_system_message(&format!("Config: {}", path.display())); - return false; - } - "usage" => { - self.app_state.exit_interactive_mode(); - crate::runner::billing_handlers::spawn_usage_fetch( - self.tool_event_tx.clone(), - None, - None, - ); - self.app_state.toasts.info("Fetching usage…"); - return false; - } - "compact" => { - self.app_state.compact_mode = !self.app_state.compact_mode; - } - "debug" => { - self.app_state.debug_mode = !self.app_state.debug_mode; - } - "sound" => { - self.app_state.sound_enabled = !self.app_state.sound_enabled; - } - _ => {} - }; - self.reopen_settings_menu(); - return true; + return self.handle_toggle_setting_item(item_id).await; } InteractiveAction::SetApprovalMode => { self.handle_set_value("approval", &item_id); @@ -658,160 +579,240 @@ impl EventLoop { self.report_local_result(result, "Session resumed"); return false; } - InteractiveAction::Custom(ref custom) => { - if let Some(server) = custom.strip_prefix("mcp:") { - return self.handle_mcp_server_action(server, &item_id).await; + InteractiveAction::Custom(custom) => { + return self.handle_interactive_custom(custom, item_id).await; + } + _ => { + self.add_system_message("This selection is unsupported in the current session. No operation was performed."); + } + } + false + } + + async fn handle_toggle_setting_item(&mut self, item_id: String) -> bool { + if item_id == "__hub__" || item_id.starts_with("__cat_") { + let interactive = crate::interactive::builders::build_settings_hub(Some( + self.app_state.terminal_size.1, + )); + self.app_state.enter_interactive_mode(interactive); + return true; + } + if let Some(section) = item_id.strip_prefix("__section_") { + let snapshot = self.settings_snapshot(); + let interactive = crate::interactive::builders::build_settings_section( + snapshot, + Some(self.app_state.terminal_size.1), + section, + ); + self.app_state.enter_interactive_mode(interactive); + return true; + } + match item_id.as_str() { + "model" => { + self.app_state.exit_interactive_mode(); + self.handle_open_modal(crate::commands::ModalType::ModelPicker) + .await; + return true; + } + "mode" => { + self.app_state.exit_interactive_mode(); + self.handle_open_modal(crate::commands::ModalType::Mode) + .await; + return true; + } + "permissions" => { + self.app_state.exit_interactive_mode(); + self.handle_open_modal(crate::commands::ModalType::Permissions) + .await; + return true; + } + "sandbox" => { + let interactive = crate::interactive::builders::build_sandbox_selector( + self.app_state.sandbox_mode, + ); + self.app_state.enter_interactive_mode(interactive); + return true; + } + "mcp" => { + self.app_state.exit_interactive_mode(); + self.handle_open_modal(crate::commands::ModalType::McpManager) + .await; + return true; + } + "config" => { + self.app_state.exit_interactive_mode(); + let path = dirs::home_dir() + .map(|h| h.join(".cortex").join("config.json")) + .unwrap_or_else(|| std::path::PathBuf::from("~/.cortex/config.json")); + self.add_system_message(&format!("Config: {}", path.display())); + return false; + } + "usage" => { + self.app_state.exit_interactive_mode(); + crate::runner::billing_handlers::spawn_usage_fetch( + self.tool_event_tx.clone(), + None, + None, + ); + self.app_state.toasts.info("Fetching usage…"); + return false; + } + "compact" => { + self.app_state.compact_mode = !self.app_state.compact_mode; + } + "debug" => { + self.app_state.debug_mode = !self.app_state.debug_mode; + } + "sound" => { + self.app_state.sound_enabled = !self.app_state.sound_enabled; + } + _ => {} + } + self.reopen_settings_menu(); + true + } + + async fn handle_interactive_custom(&mut self, custom: String, item_id: String) -> bool { + if let Some(server) = custom.strip_prefix("mcp:") { + return self.handle_mcp_server_action(server, &item_id).await; + } + match custom.as_str() { + "export" => { + if let Some(format) = crate::session::ExportFormat::parse(&item_id) { + let _ = self.handle_export(format).await; } - match custom.as_str() { - "export" => { - if let Some(format) = crate::session::ExportFormat::parse(&item_id) { - let _ = self.handle_export(format).await; - } - return false; - } - "mode" => { - self.app_state.set_agent_mode(&item_id); - self.sync_agent_mode_harness(); - self.app_state - .toasts - .info(format!("Mode: {}", self.app_state.agent_mode_label)); - return false; - } - "effort" => { - self.app_state.set_thinking_budget(Some(item_id.clone())); - self.app_state.toasts.info(format!("Effort: {}", item_id)); - return false; - } - "sandbox" => { - self.app_state.sandbox_mode = item_id == "on"; - let state = if self.app_state.sandbox_mode { - "on" - } else { - "off" - }; - self.app_state - .toasts - .info(format!("Sandbox mode: {}", state)); - return false; - } - "skill-run" => { - self.invoke_skill_command(&format!("skill:invoke:{item_id}")) - .await; - return false; - } - "jobs-picker" => { - return self.handle_jobs_picker_choice(&item_id); - } - "resume-favorite" => { - let result = self.toggle_listed_favorite(&item_id); - match result { - Ok(true) => { - self.app_state.toasts.info("Favorited"); - } - Ok(false) => { - self.app_state.toasts.info("Removed from favorites"); - } - Err(error) => { - self.add_system_message(&format!("Error: {error}")); - } - } - return true; - } - "resume-delete" => { - match self - .session_storage() - .and_then(|storage| storage.delete_session(&item_id)) - { - Ok(()) => { - self.app_state.toasts.info("Session deleted"); - self.open_resume_picker(); - return true; - } - Err(error) => { - self.add_system_message(&format!("Error: {error}")); - return false; - } - } - } - "permission-prompt" => { - return self.handle_permission_prompt_choice(&item_id).await; - } - "permissions-picker" => { - self.app_state.permission_mode = match item_id.as_str() { - "ro" => crate::permissions::PermissionMode::High, - "smart" => crate::permissions::PermissionMode::Medium, - "full" => crate::permissions::PermissionMode::Low, - _ => return false, - }; - let label = match item_id.as_str() { - "ro" => "Read-only", - "smart" => "Smart", - "full" => "Full access", - _ => "Permissions", - }; - self.app_state.toasts.info(format!("Permissions: {label}")); - return false; - } - "handoff-confirm" => { - return self.handle_handoff_confirm_choice(&item_id).await; - } - "clear-confirm" => { - if item_id == "yes" { - self.app_state.clear_messages(); - self.add_system_message("Display cleared. Stored conversation context is unchanged; use /new for a fresh conversation."); - } - return false; - } - "plan-confirm" => { - if item_id == "yes" { - self.app_state.set_agent_mode("agent"); - self.sync_agent_mode_harness(); - self.app_state.toasts.info("Mode: Agent"); - } - return false; - } - "sandbox-deny" | "question" => { - return false; - } - "mcp-source" => { - let interactive = match item_id.as_str() { - "custom" => { - crate::interactive::builders::build_mcp_transport_selector() - } - "registry" => { - crate::interactive::builders::build_mcp_registry_browser() - } - _ => return false, - }; - self.app_state.enter_interactive_mode(interactive); - return true; - } - "mcp-transport" => { - let mut interactive = crate::interactive::builders::build_mcp_selector( - &self.app_state.mcp_servers, - ); - match item_id.as_str() { - "stdio" => interactive - .open_form(crate::interactive::builders::build_mcp_stdio_form()), - "http" => interactive - .open_form(crate::interactive::builders::build_mcp_http_form()), - _ => return false, - } - self.app_state.enter_interactive_mode(interactive); - return true; - } - _ => { - self.add_system_message("This selection is unsupported in the current session. No operation was performed."); - } + false + } + "mode" => { + self.app_state.set_agent_mode(&item_id); + self.sync_agent_mode_harness(); + self.app_state + .toasts + .info(format!("Mode: {}", self.app_state.agent_mode_label)); + false + } + "effort" => { + self.app_state.set_thinking_budget(Some(item_id.clone())); + self.app_state.toasts.info(format!("Effort: {}", item_id)); + false + } + "sandbox" => { + self.app_state.sandbox_mode = item_id == "on"; + let state = if self.app_state.sandbox_mode { + "on" + } else { + "off" + }; + self.app_state + .toasts + .info(format!("Sandbox mode: {}", state)); + false + } + "skill-run" => { + self.invoke_skill_command(&format!("skill:invoke:{item_id}")) + .await; + false + } + "jobs-picker" => self.handle_jobs_picker_choice(&item_id), + "resume-favorite" | "resume-delete" => { + self.handle_resume_picker_custom(&custom, &item_id) + } + "permission-prompt" => self.handle_permission_prompt_choice(&item_id).await, + "permissions-picker" => self.apply_permissions_picker(&item_id), + "handoff-confirm" => self.handle_handoff_confirm_choice(&item_id).await, + "clear-confirm" => { + if item_id == "yes" { + self.app_state.clear_messages(); + self.add_system_message("Display cleared. Stored conversation context is unchanged; use /new for a fresh conversation."); + } + false + } + "plan-confirm" => { + if item_id == "yes" { + self.app_state.set_agent_mode("agent"); + self.sync_agent_mode_harness(); + self.app_state.toasts.info("Mode: Agent"); } + false } + "sandbox-deny" | "question" => false, + "mcp-source" | "mcp-transport" => self.handle_mcp_form_custom(&custom, &item_id), _ => { self.add_system_message("This selection is unsupported in the current session. No operation was performed."); + false } } + } + + fn handle_resume_picker_custom(&mut self, custom: &str, item_id: &str) -> bool { + if custom == "resume-favorite" { + match self.toggle_listed_favorite(item_id) { + Ok(true) => { + self.app_state.toasts.info("Favorited"); + } + Ok(false) => { + self.app_state.toasts.info("Removed from favorites"); + } + Err(error) => { + self.add_system_message(&format!("Error: {error}")); + } + } + return true; + } + match self + .session_storage() + .and_then(|storage| storage.delete_session(item_id)) + { + Ok(()) => { + self.app_state.toasts.info("Session deleted"); + self.open_resume_picker(); + true + } + Err(error) => { + self.add_system_message(&format!("Error: {error}")); + false + } + } + } + + fn apply_permissions_picker(&mut self, item_id: &str) -> bool { + self.app_state.permission_mode = match item_id { + "ro" => crate::permissions::PermissionMode::High, + "smart" => crate::permissions::PermissionMode::Medium, + "full" => crate::permissions::PermissionMode::Low, + _ => return false, + }; + let label = match item_id { + "ro" => "Read-only", + "smart" => "Smart", + "full" => "Full access", + _ => "Permissions", + }; + self.app_state.toasts.info(format!("Permissions: {label}")); false } + fn handle_mcp_form_custom(&mut self, custom: &str, item_id: &str) -> bool { + if custom == "mcp-source" { + let interactive = match item_id { + "custom" => crate::interactive::builders::build_mcp_transport_selector(), + "registry" => crate::interactive::builders::build_mcp_registry_browser(), + _ => return false, + }; + self.app_state.enter_interactive_mode(interactive); + return true; + } + let mut interactive = + crate::interactive::builders::build_mcp_selector(&self.app_state.mcp_servers); + match item_id { + "stdio" => interactive.open_form(crate::interactive::builders::build_mcp_stdio_form()), + "http" => interactive.open_form(crate::interactive::builders::build_mcp_http_form()), + _ => return false, + } + self.app_state.enter_interactive_mode(interactive); + true + } + fn settings_snapshot(&self) -> crate::interactive::builders::SettingsSnapshot { crate::interactive::builders::SettingsSnapshot { compact_mode: self.app_state.compact_mode, From b634cc8077d34d6f61565a0409902bc8877be763 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 17:07:44 +0000 Subject: [PATCH 09/15] fix(tui): align inline picker clicks with chrome MCP, permissions, clear-confirm, and resume paint banner/search rows above options. Hit-testing now uses that same origin so mouse selects the visible row. Co-authored-by: Mathis --- src/cortex-tui/src/interactive/mod.rs | 1 + .../src/interactive/picker_layout.rs | 161 ++++++++++++++++++ src/cortex-tui/src/interactive/renderer.rs | 66 +------ .../src/runner/event_loop/rendering.rs | 28 +-- .../src/views/minimal_session/view.rs | 16 +- 5 files changed, 172 insertions(+), 100 deletions(-) create mode 100644 src/cortex-tui/src/interactive/picker_layout.rs diff --git a/src/cortex-tui/src/interactive/mod.rs b/src/cortex-tui/src/interactive/mod.rs index 6d9b0511..7f5d64f1 100644 --- a/src/cortex-tui/src/interactive/mod.rs +++ b/src/cortex-tui/src/interactive/mod.rs @@ -48,6 +48,7 @@ pub mod builders; pub mod handlers; +pub mod picker_layout; pub mod renderer; pub mod state; diff --git a/src/cortex-tui/src/interactive/picker_layout.rs b/src/cortex-tui/src/interactive/picker_layout.rs new file mode 100644 index 00000000..17ab01b7 --- /dev/null +++ b/src/cortex-tui/src/interactive/picker_layout.rs @@ -0,0 +1,161 @@ +//! Inline picker geometry shared by paint and mouse hit-testing. + +use ratatui::layout::Rect; + +use super::state::InteractiveState; + +/// Must match `views::minimal_session::COMPOSER_ROWS` (avoid a crate cycle). +const COMPOSER_ROWS: u16 = 3; + +/// Session inline lists cap at 8 option rows (lock chrome). +pub const INLINE_OPTION_CAP: usize = 8; + +/// Footer + blank line under the composer in [`MinimalSessionView`]. +const FOOTER_ROWS: u16 = 1; +const BLANK_BEFORE_FOOTER: u16 = 1; + +/// Rows the rows-only picker occupies above the composer. +pub fn picker_stack_height(state: &InteractiveState) -> u16 { + if state.effort_focused { + return 3; + } + let n = if state.filtered_indices.is_empty() { + 1 + } else { + state + .filtered_indices + .len() + .min(state.max_visible) + .min(INLINE_OPTION_CAP) + }; + (n as u16).saturating_add(state.inline_chrome_rows()) +} + +/// Screen rect of the rows-only picker (matches [`crate::views::minimal_session::MinimalSessionView`]). +pub fn session_inline_picker_area(screen: Rect, picker_height: u16) -> Rect { + let footer_y = screen.bottom().saturating_sub(FOOTER_ROWS); + let composer_y = footer_y + .saturating_sub(BLANK_BEFORE_FOOTER) + .saturating_sub(COMPOSER_ROWS); + let y = composer_y.saturating_sub(picker_height); + Rect::new(screen.x, y, screen.width, picker_height) +} + +/// Click targets for rows-only chrome: banner / subtitle / search skip, then options. +pub fn calculate_inline_click_zones(state: &mut InteractiveState, area: Rect) { + state.click_zones.clear(); + state.tab_click_zones.clear(); + if state.is_form_active() || state.effort_focused { + return; + } + let chrome = state.inline_chrome_rows(); + let items_y = area.y.saturating_add(chrome); + let items_h = area.height.saturating_sub(chrome); + if items_h == 0 { + return; + } + let start = state.scroll_offset; + let visible = state.filtered_indices.len(); + let end = (start + items_h as usize).min(visible); + for i in 0..(end.saturating_sub(start)) { + let y = items_y.saturating_add(i as u16); + if y >= items_y.saturating_add(items_h) { + break; + } + state + .click_zones + .push((Rect::new(area.x, y, area.width, 1), start + i)); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::interactive::builders::{ + build_clear_confirm, build_mcp_selector, build_permissions_picker, build_resume_picker, + }; + use crate::modal::mcp_manager::{McpServerInfo, McpStatus}; + use crate::session::SessionSummary; + use chrono::Utc; + + fn hit(state: &InteractiveState, y: u16) -> Option { + state.hit_test(2, y) + } + + #[test] + fn clear_confirm_clicks_map_to_visible_options() { + let mut state = build_clear_confirm(); + assert_eq!(state.inline_chrome_rows(), 2); + let area = Rect::new(0, 10, 80, 4); + calculate_inline_click_zones(&mut state, area); + assert_eq!(hit(&state, 10), None, "banner"); + assert_eq!(hit(&state, 11), None, "subtitle"); + assert_eq!(hit(&state, 12), Some(0), "first option"); + assert_eq!(hit(&state, 13), Some(1), "second option"); + } + + #[test] + fn mcp_clicks_skip_banner() { + let servers = vec![ + McpServerInfo { + name: "git".into(), + status: McpStatus::Running, + tool_count: 3, + error: None, + requires_auth: false, + }, + McpServerInfo { + name: "docs".into(), + status: McpStatus::Error, + tool_count: 0, + error: Some("lost".into()), + requires_auth: false, + }, + ]; + let mut state = build_mcp_selector(&servers); + let area = Rect::new(0, 5, 80, 3); + calculate_inline_click_zones(&mut state, area); + assert_eq!(hit(&state, 5), None); + assert_eq!(hit(&state, 6), Some(0)); + assert_eq!(hit(&state, 7), Some(1)); + } + + #[test] + fn permissions_clicks_skip_banner() { + let mut state = build_permissions_picker(Some("smart")); + let area = Rect::new(0, 0, 80, 4); + calculate_inline_click_zones(&mut state, area); + assert_eq!(hit(&state, 0), None); + assert_eq!(hit(&state, 1), Some(0)); + assert_eq!(hit(&state, 3), Some(2)); + } + + #[test] + fn resume_clicks_skip_search_chrome() { + let sessions = vec![SessionSummary { + id: "a".into(), + title: "one".into(), + created_at: Utc::now(), + updated_at: Utc::now(), + message_count: 2, + model: "cortex-1-mini".into(), + provider: "cortex".into(), + archived: false, + }]; + let mut state = build_resume_picker(&sessions, false); + assert_eq!(state.inline_chrome_rows(), 2); + let area = Rect::new(0, 20, 80, 3); + calculate_inline_click_zones(&mut state, area); + assert_eq!(hit(&state, 20), None); + assert_eq!(hit(&state, 21), None); + assert_eq!(hit(&state, 22), Some(0)); + } + + #[test] + fn session_picker_sits_above_composer() { + let screen = Rect::new(0, 0, 80, 24); + let area = session_inline_picker_area(screen, 4); + assert_eq!(area.height, 4); + assert_eq!(area.y, 24 - 1 - 1 - COMPOSER_ROWS - 4); + } +} diff --git a/src/cortex-tui/src/interactive/renderer.rs b/src/cortex-tui/src/interactive/renderer.rs index f720ace9..27f0daf7 100644 --- a/src/cortex-tui/src/interactive/renderer.rs +++ b/src/cortex-tui/src/interactive/renderer.rs @@ -56,71 +56,9 @@ impl<'a> InteractiveWidget<'a> { self } - /// Calculate click zones for the interactive list. - /// Call this after rendering to populate state.click_zones. + /// Calculate click zones for the rows-only picker (banner/search skipped). pub fn calculate_click_zones(state: &mut InteractiveState, area: Rect) { - state.click_zones.clear(); - state.tab_click_zones.clear(); - - if !state.tabs.is_empty() { - let title = format!(" {} ", state.title); - let title_y = area.y + 1; - let tabs_x = area.x + 2 + title.len() as u16 + 2; - let mut x = tabs_x; - for (i, tab) in state.tabs.iter().enumerate() { - let tab_text = format!(" {} ", tab.label); - let tab_width = tab_text.len() as u16; - let tab_rect = Rect::new(x, title_y, tab_width, 1); - state.tab_click_zones.push((tab_rect, i)); - x += tab_width + 2; - } - } - - if state.is_form_active() { - return; - } - - let inner = Rect::new( - area.x, - area.y + 2, - area.width, - area.height.saturating_sub(2), - ); - - if inner.height < 3 { - return; - } - - let search_height = if state.searchable { - SEARCH_FIELD_ROWS - } else { - 0 - }; - let hints_height = 1; - let effort_height = if state.effort_focused { 3 } else { 0 }; - let items_height = inner - .height - .saturating_sub(search_height + hints_height + effort_height); - - let items_y = inner.y + search_height; - let items_area = Rect::new(inner.x, items_y, inner.width, items_height); - - // Register click zones for visible items - // We need to collect indices first to avoid borrow conflicts - let start = state.scroll_offset; - let visible_count = state.filtered_indices.len(); - let end = (start + items_area.height as usize).min(visible_count); - - for i in 0..(end - start) { - let y = items_area.y + i as u16; - if y >= items_area.y + items_area.height { - break; - } - - let filtered_idx = start + i; - let item_rect = Rect::new(items_area.x, y, items_area.width, 1); - state.click_zones.push((item_rect, filtered_idx)); - } + super::picker_layout::calculate_inline_click_zones(state, area); } /// Calculate the required height for this widget. diff --git a/src/cortex-tui/src/runner/event_loop/rendering.rs b/src/cortex-tui/src/runner/event_loop/rendering.rs index 442dcc1d..85b3fabd 100644 --- a/src/cortex-tui/src/runner/event_loop/rendering.rs +++ b/src/cortex-tui/src/runner/event_loop/rendering.rs @@ -198,31 +198,17 @@ impl EventLoop { self.click_zones .register(ClickZoneId::InputField, input_area); - // Calculate click zones for interactive mode: the panel sits - // directly above the footer and is `required_height` tall - // (hairline, title, optional framed search, rows, hints). + // Rows-only picker: same origin as MinimalSessionView (chrome then options). if self.app_state.is_interactive_mode() && let Some(state) = self.app_state.get_interactive_state_mut() { - let items_count = if state.filtered_indices.is_empty() { - 2 - } else { - state.filtered_indices.len().min(state.max_visible) - }; - let search_rows: u16 = if state.searchable { - crate::interactive::renderer::SEARCH_FIELD_ROWS - } else { - 0 - }; - let required_height = (items_count as u16) + 3 + search_rows; - let max_height = area.height.saturating_sub(footer_height).max(3); - let widget_height = required_height.min(max_height); - let interactive_y = area - .bottom() - .saturating_sub(footer_height) - .saturating_sub(widget_height); + let picker_height = + crate::interactive::picker_layout::picker_stack_height(state); let interactive_area = - Rect::new(area.x, interactive_y, area.width, widget_height); + crate::interactive::picker_layout::session_inline_picker_area( + area, + picker_height, + ); crate::interactive::InteractiveWidget::calculate_click_zones( state, interactive_area, diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index ecb9ef63..dfa2504f 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -657,23 +657,9 @@ impl<'a> Widget for MinimalSessionView<'a> { }; let interactive = self.app_state.is_interactive_mode(); - let effort_focused = self - .app_state - .get_interactive_state() - .map(|s| s.effort_focused) - .unwrap_or(false); let picker_height: u16 = if interactive { if let Some(state) = self.app_state.get_interactive_state() { - if effort_focused { - 3 - } else { - let n = if state.filtered_indices.is_empty() { - 1 - } else { - state.filtered_indices.len().min(state.max_visible).min(8) - }; - (n as u16).saturating_add(state.inline_chrome_rows()) - } + crate::interactive::picker_layout::picker_stack_height(state) } else { 0 } From 7c255282bb250009cd044a0ed4c574e53d290409 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 17:12:11 +0000 Subject: [PATCH 10/15] fix(tui): resume picker ux contract and keyboard coverage /sessions opens the inline resume list, not a modal stack. Cover Ctrl+x, Shift+Tab, palette arrows, and Esc cancel in verify_mcp. Co-authored-by: Mathis --- src/cortex-cli/src/verify_mcp/tui.rs | 57 +++++++++++++++++++ .../runner/event_loop/ux_contract_tests.rs | 23 ++++---- 2 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/cortex-cli/src/verify_mcp/tui.rs b/src/cortex-cli/src/verify_mcp/tui.rs index 2f6c7408..5ae07a74 100644 --- a/src/cortex-cli/src/verify_mcp/tui.rs +++ b/src/cortex-cli/src/verify_mcp/tui.rs @@ -467,6 +467,63 @@ mod tests { assert!(state.sessions.is_empty()); } + #[test] + fn keyboard_map_ctrl_x_shift_tab_palette_and_cancel() { + let (mut state, id) = started("cortex"); + key(&mut state, &json!({"session_id": id, "keys": ["Ctrl+x"]})).expect("open sheet"); + assert!(session_ref(&state, &id).unwrap().app_state.shortcuts_open); + key( + &mut state, + &json!({"session_id": id, "keys": ["Down", "Up", "F2"]}), + ) + .expect("sheet nav"); + assert!(!session_ref(&state, &id).unwrap().app_state.shortcuts_open); + + key( + &mut state, + &json!({"session_id": id, "keys": ["Ctrl+x", "Esc"]}), + ) + .expect("esc sheet"); + assert!(!session_ref(&state, &id).unwrap().app_state.shortcuts_open); + + slash(&mut state, &json!({"session_id": id, "query": "/"})).expect("slash"); + assert!( + session_ref(&state, &id) + .unwrap() + .app_state + .autocomplete + .visible + ); + key( + &mut state, + &json!({"session_id": id, "keys": ["Down", "Up"]}), + ) + .expect("palette"); + + key( + &mut state, + &json!({"session_id": id, "keys": ["Shift+Tab", "F2"]}), + ) + .expect("mode and settings"); + assert!( + session_ref(&state, &id) + .unwrap() + .app_state + .settings_modal + .is_some() + ); + + let session = session_mut(&mut state, &id).unwrap(); + session.app_state.start_streaming(None, true); + apply_key(session, "Esc").expect("interrupt"); + assert!(!session.app_state.streaming.is_streaming); + + let picker = cortex_tui::interactive::builders::build_clear_confirm(); + session.app_state.enter_interactive_mode(picker); + apply_key(session, "Esc").expect("close picker"); + assert!(!session.app_state.is_interactive_mode()); + } + #[test] fn agent_entry_and_error_paths() { let (mut state, id) = started("agent"); diff --git a/src/cortex-tui/src/runner/event_loop/ux_contract_tests.rs b/src/cortex-tui/src/runner/event_loop/ux_contract_tests.rs index c81d973c..949eb419 100644 --- a/src/cortex-tui/src/runner/event_loop/ux_contract_tests.rs +++ b/src/cortex-tui/src/runner/event_loop/ux_contract_tests.rs @@ -263,25 +263,22 @@ async fn ux_contract_diff_runs_real_git_without_mutating_user_work() { #[tokio::test] async fn ux_contract_picker_export_selector_and_limitations_render() { let (_temp, mut runner) = fixture(); + runner + .change_session_metadata("session_name", "picker-session") + .unwrap(); runner .change_session_metadata("session_name", "picker-session") .unwrap(); runner .process_modal_action(ModalAction::ExecuteCommand("sessions".into())) .await; - assert_eq!(runner.modal_stack.len(), 1); - for (width, height) in [(40, 12), (120, 40)] { - let area = Rect::new(0, 0, width, height); - let mut buffer = Buffer::empty(area); - runner - .modal_stack - .current() - .unwrap() - .render(area, &mut buffer); - let text: String = buffer.content.iter().map(|cell| cell.symbol()).collect(); - assert!(text.contains("picker-session"), "{text}"); - } - runner.modal_stack.clear(); + assert!( + runner.app_state.get_interactive_state().is_some(), + "sessions opens the inline resume picker" + ); + assert_eq!(runner.modal_stack.len(), 0); + assert_views(&mut runner, "picker-session"); + runner.app_state.exit_interactive_mode(); runner.handle_open_modal(ModalType::Export(None)).await; assert!(runner.app_state.get_interactive_state().is_some()); runner From bd6e33378abe779cdcbf8a3430e2b7e874d58c1a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 17:27:53 +0000 Subject: [PATCH 11/15] fix(tui): match picker clicks when banners crowd the stack On short terminals the update and opt-in banners collapse the transcript, so the picker is no longer composer_y minus its height. Click zones now use the same stack origin as paint. Co-authored-by: Mathis --- .../src/interactive/picker_layout.rs | 98 ++++++++++++++++++- .../src/runner/event_loop/rendering.rs | 35 ++++--- .../src/views/minimal_session/view.rs | 17 ++-- 3 files changed, 126 insertions(+), 24 deletions(-) diff --git a/src/cortex-tui/src/interactive/picker_layout.rs b/src/cortex-tui/src/interactive/picker_layout.rs index 17ab01b7..fea644da 100644 --- a/src/cortex-tui/src/interactive/picker_layout.rs +++ b/src/cortex-tui/src/interactive/picker_layout.rs @@ -31,14 +31,49 @@ pub fn picker_stack_height(state: &InteractiveState) -> u16 { (n as u16).saturating_add(state.inline_chrome_rows()) } +/// Opt-in banner height used by the session view. +pub fn session_optin_height(show: bool, terminal_height: u16) -> u16 { + if !show { + 0 + } else if terminal_height >= 20 { + 5 + } else { + 3 + } +} + +/// Update-available banner height used by the session view. +pub fn session_update_height(show: bool) -> u16 { + u16::from(show) +} + /// Screen rect of the rows-only picker (matches [`crate::views::minimal_session::MinimalSessionView`]). -pub fn session_inline_picker_area(screen: Rect, picker_height: u16) -> Rect { +/// +/// Update and opt-in banners paint *above* the picker. On a short terminal the +/// transcript collapses and the stack starts at the token row, so the picker +/// is not `composer_y - picker_height`. +pub fn session_inline_picker_area( + screen: Rect, + picker_height: u16, + update_height: u16, + optin_height: u16, +) -> Rect { let footer_y = screen.bottom().saturating_sub(FOOTER_ROWS); let composer_y = footer_y .saturating_sub(BLANK_BEFORE_FOOTER) .saturating_sub(COMPOSER_ROWS); - let y = composer_y.saturating_sub(picker_height); - Rect::new(screen.x, y, screen.width, picker_height) + let stack = picker_height + .saturating_add(optin_height) + .saturating_add(update_height); + let transcript_bottom = composer_y.saturating_sub(stack); + let content_y = screen.y.saturating_add(1); + let content_height = transcript_bottom.saturating_sub(content_y); + let y = content_y + .saturating_add(content_height) + .saturating_add(update_height) + .saturating_add(optin_height); + let height = picker_height.min(screen.bottom().saturating_sub(y)); + Rect::new(screen.x, y, screen.width, height) } /// Click targets for rows-only chrome: banner / subtitle / search skip, then options. @@ -154,8 +189,63 @@ mod tests { #[test] fn session_picker_sits_above_composer() { let screen = Rect::new(0, 0, 80, 24); - let area = session_inline_picker_area(screen, 4); + let area = session_inline_picker_area(screen, 4, 0, 0); assert_eq!(area.height, 4); assert_eq!(area.y, 24 - 1 - 1 - COMPOSER_ROWS - 4); } + + #[test] + fn cramped_banners_move_picker_below_optin() { + let screen = Rect::new(0, 0, 80, 10); + let picker = 4; + let update = 1; + let optin = session_optin_height(true, 10); + assert_eq!(optin, 3); + let area = session_inline_picker_area(screen, picker, update, optin); + // content_y=1, stack does not fit above composer_y=5, so picker starts + // after update+optin: 1+1+3 = 5. + assert_eq!(area.y, 5); + let tall = session_inline_picker_area(Rect::new(0, 0, 80, 24), 4, 1, 3); + assert_eq!(tall.y, 24 - 1 - 1 - COMPOSER_ROWS - 4); + } + + #[test] + fn painted_permission_rows_match_click_zones_with_banners() { + use crate::app::{AppState, UpdateStatus}; + use crate::views::minimal_session::MinimalSessionView; + use cortex_core::widgets::Message; + use ratatui::widgets::Widget; + + let mut app = AppState::new(); + app.terminal_size = (80, 10); + app.opt_in_banner = true; + app.update_status = UpdateStatus::Available { + version: "1.0.0".into(), + }; + app.add_message(Message::user("hi")); + app.enter_interactive_mode(build_permissions_picker(Some("smart"))); + let screen = Rect::new(0, 0, 80, 10); + let mut buf = ratatui::buffer::Buffer::empty(screen); + MinimalSessionView::new(&app).render(screen, &mut buf); + + let mut picker = app.get_interactive_state().expect("picker").clone(); + let area = session_inline_picker_area( + screen, + picker_stack_height(&picker), + session_update_height(true), + session_optin_height(true, 10), + ); + calculate_inline_click_zones(&mut picker, area); + + let mut full_y = None; + for y in 0..10u16 { + let row: String = (0..80u16).map(|x| buf[(x, y)].symbol()).collect(); + if row.contains("Full access") { + full_y = Some(y); + break; + } + } + let full_y = full_y.expect("painted Full access"); + assert_eq!(hit(&picker, full_y), Some(2), "click row {full_y}"); + } } diff --git a/src/cortex-tui/src/runner/event_loop/rendering.rs b/src/cortex-tui/src/runner/event_loop/rendering.rs index 85b3fabd..4553795d 100644 --- a/src/cortex-tui/src/runner/event_loop/rendering.rs +++ b/src/cortex-tui/src/runner/event_loop/rendering.rs @@ -199,20 +199,29 @@ impl EventLoop { .register(ClickZoneId::InputField, input_area); // Rows-only picker: same origin as MinimalSessionView (chrome then options). - if self.app_state.is_interactive_mode() - && let Some(state) = self.app_state.get_interactive_state_mut() - { - let picker_height = - crate::interactive::picker_layout::picker_stack_height(state); - let interactive_area = - crate::interactive::picker_layout::session_inline_picker_area( - area, - picker_height, - ); - crate::interactive::InteractiveWidget::calculate_click_zones( - state, - interactive_area, + if self.app_state.is_interactive_mode() { + let update_h = crate::interactive::picker_layout::session_update_height( + self.app_state.should_show_update_banner(), + ); + let optin_h = crate::interactive::picker_layout::session_optin_height( + self.app_state.opt_in_banner && !self.app_state.messages.is_empty(), + height, ); + if let Some(state) = self.app_state.get_interactive_state_mut() { + let picker_height = + crate::interactive::picker_layout::picker_stack_height(state); + let interactive_area = + crate::interactive::picker_layout::session_inline_picker_area( + area, + picker_height, + update_h, + optin_h, + ); + crate::interactive::InteractiveWidget::calculate_click_zones( + state, + interactive_area, + ); + } } } } diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index dfa2504f..3b3424f8 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -670,13 +670,11 @@ impl<'a> Widget for MinimalSessionView<'a> { }; let show_optin = self.app_state.opt_in_banner && !self.app_state.messages.is_empty(); - let optin_height: u16 = if show_optin { - if area.height >= 20 { 5 } else { 3 } - } else { - 0 - }; + let optin_height = + crate::interactive::picker_layout::session_optin_height(show_optin, area.height); let show_update_banner = self.app_state.should_show_update_banner(); - let update_banner_height: u16 = if show_update_banner { 1 } else { 0 }; + let update_banner_height = + crate::interactive::picker_layout::session_update_height(show_update_banner); let stack_below_transcript = picker_height + optin_height + update_banner_height; let transcript_bottom = composer_y.saturating_sub(stack_below_transcript); @@ -710,7 +708,12 @@ impl<'a> Widget for MinimalSessionView<'a> { } if picker_height > 0 { - let picker_area = Rect::new(area.x, next_y, area.width, picker_height); + let picker_area = crate::interactive::picker_layout::session_inline_picker_area( + area, + picker_height, + update_banner_height, + optin_height, + ); if interactive { if let Some(state) = self.app_state.get_interactive_state() { crate::interactive::InteractiveWidget::new(state) From ef42d3293d21622378f7d4189aadb86ae7250c6f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 18:34:41 +0000 Subject: [PATCH 12/15] fix(tui): rebase lock chrome onto main picker and overlay fixes Keep lock PNG blobs from #67/#69/#70. Wire TodoWrite into the live checklist, clamp compact shortcut hits, and drop stale stopped copy. Co-authored-by: Mathis --- src/cortex-tui/src/app/methods.rs | 11 ++++ src/cortex-tui/src/app/sheet.rs | 17 ++++++ src/cortex-tui/src/app/state.rs | 4 +- src/cortex-tui/src/lock_v2_boards.rs | 18 +----- src/cortex-tui/src/lock_v2_scenes.rs | 15 +++++ src/cortex-tui/src/runner/event_loop/input.rs | 12 ++++ src/cortex-tui/src/runner/event_loop/tools.rs | 44 ++++++++++++++ .../src/widgets/shortcuts_overlay.rs | 57 +++++++++++++++++-- 8 files changed, 156 insertions(+), 22 deletions(-) diff --git a/src/cortex-tui/src/app/methods.rs b/src/cortex-tui/src/app/methods.rs index d2f408c3..90e48491 100644 --- a/src/cortex-tui/src/app/methods.rs +++ b/src/cortex-tui/src/app/methods.rs @@ -850,4 +850,15 @@ mod agent_mode_tests { assert!(!state.has_pending_approval()); assert!(!state.is_interactive_mode()); } + + #[test] + fn clear_and_new_session_drop_stopped_placeholder() { + let mut state = AppState::default(); + state.last_turn_stopped = true; + state.clear_messages(); + assert!(!state.last_turn_stopped); + state.last_turn_stopped = true; + state.new_session(); + assert!(!state.last_turn_stopped); + } } diff --git a/src/cortex-tui/src/app/sheet.rs b/src/cortex-tui/src/app/sheet.rs index ca896976..183dbd9a 100644 --- a/src/cortex-tui/src/app/sheet.rs +++ b/src/cortex-tui/src/app/sheet.rs @@ -77,4 +77,21 @@ mod tests { state.toggle_shortcuts_sheet(); assert!(!state.shortcuts_open); } + + #[test] + fn compact_navigation_stays_on_painted_rows() { + let mut state = AppState::default(); + state.terminal_size = (40, 12); + state.toggle_shortcuts_sheet(); + let area = Rect::new(0, 0, 40, 12); + let visible = ShortcutsOverlay::row_count(area); + for _ in 0..(visible + 3) { + state.shortcuts_move(1); + } + assert!(state.shortcuts_selected < visible); + assert!( + ShortcutsOverlay::row_at(area, 0, area.y + 2).is_none(), + "margin left of the sheet is not a hit" + ); + } } diff --git a/src/cortex-tui/src/app/state.rs b/src/cortex-tui/src/app/state.rs index 316446b5..342e5323 100644 --- a/src/cortex-tui/src/app/state.rs +++ b/src/cortex-tui/src/app/state.rs @@ -564,10 +564,10 @@ impl AppState { pub fn clear_messages(&mut self) { self.messages.clear(); self.chat_scroll = 0; - // Reset scroll state to bottom (no "↓ End" hint after clearing) self.chat_scroll_pinned_bottom = true; - // Request clearing terminal scrollback buffer for privacy self.pending_scrollback_clear = true; + self.last_turn_stopped = false; + self.working_checklist = None; } /// Check if scrollback clear is pending and reset the flag diff --git a/src/cortex-tui/src/lock_v2_boards.rs b/src/cortex-tui/src/lock_v2_boards.rs index 878d07dc..669c29c1 100644 --- a/src/cortex-tui/src/lock_v2_boards.rs +++ b/src/cortex-tui/src/lock_v2_boards.rs @@ -985,27 +985,13 @@ Tell me what you'd like to do.", None, )); } - "btw" => { - resumed(&mut state); - state.add_message(Message::user("keep rewriting chrome.rs").with_timestamp("09:50 AM")); - state.start_streaming(None, true); - state.streaming.thinking = false; - state.streaming.is_actively_streaming = true; - state.add_message( - Message::user("/btw keep the composer dual-hairline").with_timestamp("09:51 AM"), - ); - } + id if apply_btw_scene(id, &mut state) => {} id if apply_offline_rate_limit_scene(id, &mut state) => {} id if apply_parity_scene(id, &mut state, width) => {} id if apply_designed_scene(id, &mut state, width) => {} id if apply_share_scene(id, &mut state) => {} id if apply_goal_chip_scene(id, &mut state) => {} - "computer-disconnected" | "computer-cloud-default" => { - assert!( - apply_computer_scene(id, &mut state, width), - "computer lock scene {id}" - ); - } + id if apply_computer_scene(id, &mut state, width) => {} other => panic!("unknown lock v2 scene {other}"), } state diff --git a/src/cortex-tui/src/lock_v2_scenes.rs b/src/cortex-tui/src/lock_v2_scenes.rs index 8998bdad..4277f181 100644 --- a/src/cortex-tui/src/lock_v2_scenes.rs +++ b/src/cortex-tui/src/lock_v2_scenes.rs @@ -225,6 +225,21 @@ pub(crate) const MD_TABLE: &str = r#"Here is how the three models compare: | Cortex Max 1 | High | 1M | per token | "#; +pub(crate) fn apply_btw_scene(id: &str, state: &mut AppState) -> bool { + if id != "btw" { + return false; + } + resumed(state); + state.add_message(Message::user("keep rewriting chrome.rs").with_timestamp("09:50 AM")); + state.start_streaming(None, true); + state.streaming.thinking = false; + state.streaming.is_actively_streaming = true; + state.add_message( + Message::user("/btw keep the composer dual-hairline").with_timestamp("09:51 AM"), + ); + true +} + pub(crate) const MD_FENCE: &str = r#"```rust pub async fn with_retry(mut op: F) -> Result where F: FnMut() -> Fut>, diff --git a/src/cortex-tui/src/runner/event_loop/input.rs b/src/cortex-tui/src/runner/event_loop/input.rs index 10b31dcd..862d5886 100644 --- a/src/cortex-tui/src/runner/event_loop/input.rs +++ b/src/cortex-tui/src/runner/event_loop/input.rs @@ -268,6 +268,9 @@ impl EventLoop { if key_event.code == KeyCode::Char('x') && key_event.modifiers.contains(KeyModifiers::CONTROL) { + if self.shortcuts_toggle_blocked() { + return Ok(false); + } self.app_state.toggle_shortcuts_sheet(); self.render(terminal)?; return Ok(true); @@ -275,6 +278,15 @@ impl EventLoop { Ok(false) } + fn shortcuts_toggle_blocked(&self) -> bool { + self.app_state.is_interactive_mode() + || self.card_handler.is_active() + || self.app_state.has_modal() + || self.modal_stack.is_active() + || self.app_state.view == AppView::Questions + || self.app_state.get_question_state().is_some() + } + async fn handle_interactive_mode_key( &mut self, key_event: crossterm::event::KeyEvent, diff --git a/src/cortex-tui/src/runner/event_loop/tools.rs b/src/cortex-tui/src/runner/event_loop/tools.rs index f187a898..1fb31753 100644 --- a/src/cortex-tui/src/runner/event_loop/tools.rs +++ b/src/cortex-tui/src/runner/event_loop/tools.rs @@ -35,6 +35,14 @@ impl EventLoop { let tool_tx = self.tool_event_tx.clone(); let id = tool_call_id.clone(); let name = tool_name.clone(); + if matches!(tool_name.as_str(), "TodoWrite" | "todo_write") + && let Some(todos) = todo_pairs_from_write_args(&args) + { + let _ = self.tool_event_tx.try_send(ToolEvent::TodoUpdated { + session_id: String::new(), + todos, + }); + } let mcp_manager = self.mcp_manager.clone(); // Every caller reaches here only after the permission manager passed // the call or the user approved it in the modal. @@ -681,6 +689,42 @@ where futures::future::join_all(futures).await } +fn todo_pairs_from_write_args(args: &serde_json::Value) -> Option> { + let todos = args.get("todos")?.as_array()?; + let pairs: Vec<(String, String)> = todos + .iter() + .filter_map(|item| { + let content = item.get("content")?.as_str()?.to_string(); + let status = item + .get("status")? + .as_str() + .unwrap_or("pending") + .to_string(); + Some((content, status)) + }) + .collect(); + (!pairs.is_empty()).then_some(pairs) +} + +#[cfg(test)] +mod todo_write_live_tests { + use super::todo_pairs_from_write_args; + + #[test] + fn todo_write_args_become_checklist_pairs() { + let args = serde_json::json!({ + "todos": [ + {"id": "1", "content": "Read composer.rs", "status": "completed"}, + {"id": "2", "content": "Move the chip", "status": "in_progress"}, + ] + }); + let pairs = todo_pairs_from_write_args(&args).expect("pairs"); + assert_eq!(pairs.len(), 2); + assert_eq!(pairs[0].1, "completed"); + assert_eq!(pairs[1].0, "Move the chip"); + } +} + #[cfg(test)] #[path = "runtime_contract_tools_tests.rs"] mod runtime_contract_tests; diff --git a/src/cortex-tui/src/widgets/shortcuts_overlay.rs b/src/cortex-tui/src/widgets/shortcuts_overlay.rs index 47f4907b..148eba4a 100644 --- a/src/cortex-tui/src/widgets/shortcuts_overlay.rs +++ b/src/cortex-tui/src/widgets/shortcuts_overlay.rs @@ -75,7 +75,7 @@ impl ShortcutsOverlay { self } - pub fn row_count(area: Rect) -> usize { + pub fn catalog_len(area: Rect) -> usize { if compact(area) { NARROW.len() } else { @@ -83,6 +83,21 @@ impl ShortcutsOverlay { } } + /// Rows that actually paint inside `area` (compact terminals clip the list). + pub fn row_count(area: Rect) -> usize { + let modal = Self::modal_rect(area); + let inner_h = modal.height.saturating_sub(4); + if compact(area) { + let visible = inner_h.saturating_sub(2) as usize; + NARROW.len().min(visible.max(1)) + } else { + let per = inner_h.saturating_sub(3) as usize; + LEFT.len().min(per) + RIGHT.len().min(per) + } + .max(1) + .min(Self::catalog_len(area)) + } + pub fn wrap_index(area: Rect, index: usize) -> usize { let n = Self::row_count(area).max(1); index % n @@ -110,9 +125,12 @@ impl ShortcutsOverlay { x >= close_x && x < close_x.saturating_add(3) } - /// Binding under `(x, y)`, if any. + /// Binding under `(x, y)`, if any. Pointers outside the sheet are ignored. pub fn row_at(area: Rect, x: u16, y: u16) -> Option { let modal = Self::modal_rect(area); + if x < modal.x || x >= modal.right() || y < modal.y || y >= modal.bottom() { + return None; + } let inner = Rect::new( modal.x + 2, modal.y + 2, @@ -124,8 +142,16 @@ impl ShortcutsOverlay { } let idx = (y - inner.y) as usize; if compact(area) { + let stop = inner.bottom().saturating_sub(2); + if y >= stop { + return None; + } return (idx < NARROW.len()).then_some(idx); } + let stop = inner.bottom().saturating_sub(3); + if y >= stop { + return None; + } let col2 = inner.x + inner.width / 2; if x >= col2 { let i = LEFT.len() + idx; @@ -340,7 +366,18 @@ mod tests { ShortcutsOverlay::row_at(area, modal.x + 3, modal.y + 2), Some(0) ); - assert_eq!(ShortcutsOverlay::row_count(area), LEFT.len() + RIGHT.len()); + assert_eq!( + ShortcutsOverlay::row_at(area, modal.x.saturating_sub(1), modal.y + 2), + None + ); + assert_eq!( + ShortcutsOverlay::row_at(area, modal.right(), modal.y + 2), + None + ); + assert_eq!( + ShortcutsOverlay::catalog_len(area), + LEFT.len() + RIGHT.len() + ); } #[test] @@ -355,6 +392,18 @@ mod tests { } } assert!(found); - assert_eq!(ShortcutsOverlay::row_count(area), NARROW.len()); + let visible = ShortcutsOverlay::row_count(area); + assert!( + visible <= 4, + "40×12 paints at most 4 bindings, got {visible}" + ); + assert_eq!(ShortcutsOverlay::catalog_len(area), NARROW.len()); + assert_eq!(ShortcutsOverlay::wrap_index(area, visible), 0); + let modal = ShortcutsOverlay::modal_rect(area); + let inner_y = modal.y + 2; + assert_eq!( + ShortcutsOverlay::row_at(area, modal.x + 2, inner_y + visible as u16), + None + ); } } From 8eabe2f12fcc4a9c20ba669cd6261a5f46535112 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 18:37:56 +0000 Subject: [PATCH 13/15] fix(tui): drop source-policy complexity after main rebase Split picker-row painting and custom interactive footers so the rebase onto #69/#70 stays at the main complexity baseline. Co-authored-by: Mathis --- src/cortex-tui/src/interactive/renderer.rs | 125 +++++++++++------- src/cortex-tui/src/lock_v2_goal.rs | 2 - .../src/views/minimal_session/view.rs | 37 +++--- 3 files changed, 92 insertions(+), 72 deletions(-) diff --git a/src/cortex-tui/src/interactive/renderer.rs b/src/cortex-tui/src/interactive/renderer.rs index 27f0daf7..df295eb6 100644 --- a/src/cortex-tui/src/interactive/renderer.rs +++ b/src/cortex-tui/src/interactive/renderer.rs @@ -470,7 +470,36 @@ impl<'a> InteractiveWidget<'a> { buf.set_string(x, area.y, " ", Style::default()); } x += 2; + x += self.paint_item_leads(area, buf, item, is_checked, selected_bar, fg, x); + let label_style = if item.is_separator { + Style::default().fg(TEXT_DIM).add_modifier(Modifier::BOLD) + } else if selected_bar { + Style::default() + .fg(TEXT) + .bg(SELECTION_BG) + .add_modifier(Modifier::BOLD) + } else { + Style::default().fg(fg) + }; + + let max_label_len = (area.width as usize).saturating_sub((x - area.x) as usize + 2); + let label = crate::ui::text_utils::first_fitting_line(&item.label, max_label_len); + buf.set_string(x, area.y, &label, label_style); + x += label.chars().count() as u16; + self.paint_item_description(area, buf, item, selected_bar, x, name_w); + } + + fn paint_item_leads( + &self, + area: Rect, + buf: &mut Buffer, + item: &InteractiveItem, + is_checked: bool, + selected_bar: bool, + fg: Color, + x: u16, + ) -> u16 { if self.radio_leads() && !item.is_separator { let mark = if item.is_current { "● " } else { "○ " }; let radio_style = if item.is_current { @@ -483,8 +512,9 @@ impl<'a> InteractiveWidget<'a> { Style::default().fg(TEXT_DIM) }; buf.set_string(x, area.y, mark, radio_style); - x += 2; - } else if self.status_leads() && !item.is_separator { + return 2; + } + if self.status_leads() && !item.is_separator { let icon = item.icon.unwrap_or('○'); let icon_style = match icon { '✓' => Style::default().fg(SUCCESS), @@ -493,8 +523,9 @@ impl<'a> InteractiveWidget<'a> { _ => Style::default().fg(TEXT_DIM), }; buf.set_string(x, area.y, format!("{icon} "), icon_style); - x += 2; - } else if self.state.multi_select { + return 2; + } + if self.state.multi_select { let checkbox = if is_checked { "[✓]" } else { "[ ]" }; let checkbox_style = if is_checked { Style::default().fg(SUCCESS) @@ -502,58 +533,54 @@ impl<'a> InteractiveWidget<'a> { Style::default().fg(TEXT_DIM) }; buf.set_string(x, area.y, checkbox, checkbox_style); - x += 4; - } else if let Some(icon) = item.icon { + return 4; + } + if let Some(icon) = item.icon { buf.set_string(x, area.y, icon.to_string(), Style::default().fg(fg)); - x += 2; + return 2; } + 0 + } - // Shortcut - hidden (shortcuts still work via keyboard) - - let label_style = if item.is_separator { - Style::default().fg(TEXT_DIM).add_modifier(Modifier::BOLD) - } else if selected_bar { - Style::default() - .fg(TEXT) - .bg(SELECTION_BG) - .add_modifier(Modifier::BOLD) + fn paint_item_description( + &self, + area: Rect, + buf: &mut Buffer, + item: &InteractiveItem, + selected_bar: bool, + x: u16, + name_w: usize, + ) { + let Some(ref desc) = item.description else { + return; + }; + let desc_style = if selected_bar { + Style::default().fg(TEXT_DIM).bg(SELECTION_BG) } else { - Style::default().fg(fg) + Style::default().fg(TEXT_DIM) }; - - let max_label_len = (area.width as usize).saturating_sub((x - area.x) as usize + 2); - let label = crate::ui::text_utils::first_fitting_line(&item.label, max_label_len); - buf.set_string(x, area.y, &label, label_style); - x += label.chars().count() as u16; - - if let Some(ref desc) = item.description { - let desc_style = if selected_bar { - Style::default().fg(TEXT_DIM).bg(SELECTION_BG) - } else { - Style::default().fg(TEXT_DIM) - }; - if self.lock_menu() { - let desc_x = area.x + self.lock_gutter() + 2 + name_w as u16; - if desc_x + 2 < area.right() { - let shown = crate::ui::text_utils::first_fitting_line( - desc, - area.right().saturating_sub(desc_x + 1) as usize, - ); - if !shown.is_empty() { - buf.set_string(desc_x, area.y, &shown, desc_style); - } - } - } else { - let remaining = (area.x + area.width).saturating_sub(x + 2) as usize; - let desc_text = crate::ui::text_utils::first_fitting_line(desc, remaining); - if !desc_text.is_empty() { - let desc_w = desc_text.chars().count() as u16; - let desc_x = area.x + area.width.saturating_sub(desc_w + 1); - if desc_x > x + 1 { - buf.set_string(desc_x, area.y, &desc_text, desc_style); - } + if self.lock_menu() { + let desc_x = area.x + self.lock_gutter() + 2 + name_w as u16; + if desc_x + 2 < area.right() { + let shown = crate::ui::text_utils::first_fitting_line( + desc, + area.right().saturating_sub(desc_x + 1) as usize, + ); + if !shown.is_empty() { + buf.set_string(desc_x, area.y, &shown, desc_style); } } + return; + } + let remaining = (area.x + area.width).saturating_sub(x + 2) as usize; + let desc_text = crate::ui::text_utils::first_fitting_line(desc, remaining); + if desc_text.is_empty() { + return; + } + let desc_w = desc_text.chars().count() as u16; + let desc_x = area.x + area.width.saturating_sub(desc_w + 1); + if desc_x > x + 1 { + buf.set_string(desc_x, area.y, &desc_text, desc_style); } } diff --git a/src/cortex-tui/src/lock_v2_goal.rs b/src/cortex-tui/src/lock_v2_goal.rs index 53b58bd6..7b0a488c 100644 --- a/src/cortex-tui/src/lock_v2_goal.rs +++ b/src/cortex-tui/src/lock_v2_goal.rs @@ -8,8 +8,6 @@ use cortex_engine::goal::{Goal, GoalState}; use crate::app::AppState; -pub use crate::lock_v2_computer::apply_computer_scene; - /// Composer chip lock boards. Each filename is one live state. pub const GOAL_CHIP_IDS: &[&str] = &[ "goal-chip-active", diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index 3b3424f8..9c80f061 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -782,22 +782,11 @@ impl<'a> MinimalSessionView<'a> { }; } InteractiveAction::ResumeSession => return FooterSet::Resume, - InteractiveAction::Custom(id) if id == PERMISSION_PROMPT_ACTION => { - return FooterSet::Approval; - } - InteractiveAction::Custom(id) if id == "sandbox-deny" => { - return FooterSet::SelectConfirm; - } - InteractiveAction::Custom(id) if id == "plan-confirm" => { - return FooterSet::PlanKeep; - } - InteractiveAction::Custom(id) if id == "permissions-picker" => { - return FooterSet::PermissionsApply; - } - InteractiveAction::Custom(id) if id == "clear-confirm" => { - return FooterSet::Confirm; + InteractiveAction::Custom(id) => { + if let Some(set) = custom_interactive_footer(id) { + return set; + } } - InteractiveAction::Custom(id) if id == "plugins" => return FooterSet::Plugins, _ => {} } let title = state.title.to_ascii_lowercase(); @@ -810,12 +799,6 @@ impl<'a> MinimalSessionView<'a> { if title == "undo" || title.starts_with("undo") { return FooterSet::UndoSheet; } - if title.contains("resume") || title.contains("session") { - return FooterSet::Resume; - } - if title.contains("permission") || title.contains("approv") { - return FooterSet::Approval; - } } if self.app_state.agent_mode_label == "Bash" { return FooterSet::Bash; @@ -866,6 +849,18 @@ fn area_is_narrow(width: u16) -> bool { width < 80 } +fn custom_interactive_footer(id: &str) -> Option { + Some(match id { + PERMISSION_PROMPT_ACTION => FooterSet::Approval, + "sandbox-deny" => FooterSet::SelectConfirm, + "plan-confirm" => FooterSet::PlanKeep, + "permissions-picker" => FooterSet::PermissionsApply, + "clear-confirm" => FooterSet::Confirm, + "plugins" => FooterSet::Plugins, + _ => return None, + }) +} + /// Accent slash commands (`/undo`) and completed `@path` file chips. fn composer_char_accent(chars: &[char], index: usize) -> bool { if chars.first() == Some(&'/') { From c291b638b3743b4eafe250eeb09dbf535aad2b89 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 18:50:46 +0000 Subject: [PATCH 14/15] fix(tui): apply TodoWrite checklist without dropping the queue Apply live Working n/m from spawn args and completion output so a full tool-event channel cannot hide the checklist. Co-authored-by: Mathis --- src/cortex-tui/src/runner/event_loop/tools.rs | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/src/cortex-tui/src/runner/event_loop/tools.rs b/src/cortex-tui/src/runner/event_loop/tools.rs index 1fb31753..1c36ae11 100644 --- a/src/cortex-tui/src/runner/event_loop/tools.rs +++ b/src/cortex-tui/src/runner/event_loop/tools.rs @@ -38,10 +38,7 @@ impl EventLoop { if matches!(tool_name.as_str(), "TodoWrite" | "todo_write") && let Some(todos) = todo_pairs_from_write_args(&args) { - let _ = self.tool_event_tx.try_send(ToolEvent::TodoUpdated { - session_id: String::new(), - todos, - }); + self.handle_todo_updated(String::new(), todos); } let mcp_manager = self.mcp_manager.clone(); // Every caller reaches here only after the permission manager passed @@ -240,6 +237,9 @@ impl EventLoop { success, duration, } => { + if success { + self.apply_todo_write_output(&name, &output); + } self.handle_tool_completed(id, name, output, success, duration) .await; } @@ -508,6 +508,14 @@ impl EventLoop { } } + fn apply_todo_write_output(&mut self, name: &str, output: &str) { + if matches!(name, "TodoWrite" | "todo_write") + && let Some(todos) = todo_pairs_from_write_output(output) + { + self.handle_todo_updated(String::new(), todos); + } + } + /// Handle todo updated event fn handle_todo_updated(&mut self, session_id: String, todos: Vec<(String, String)>) { use crate::app::{SubagentTodoItem, SubagentTodoStatus}; @@ -706,9 +714,30 @@ fn todo_pairs_from_write_args(args: &serde_json::Value) -> Option Option> { + let mut pairs = Vec::new(); + for line in output.lines() { + let line = line.trim(); + let (status, rest) = if let Some(rest) = line.strip_prefix("[x] ") { + ("completed", rest) + } else if let Some(rest) = line.strip_prefix("[~] ") { + ("in_progress", rest) + } else if let Some(rest) = line.strip_prefix("[ ] ") { + ("pending", rest) + } else { + continue; + }; + let content = rest.split_once(": ").map(|(_, c)| c).unwrap_or(rest); + if !content.is_empty() { + pairs.push((content.to_string(), status.to_string())); + } + } + (!pairs.is_empty()).then_some(pairs) +} + #[cfg(test)] mod todo_write_live_tests { - use super::todo_pairs_from_write_args; + use super::{todo_pairs_from_write_args, todo_pairs_from_write_output}; #[test] fn todo_write_args_become_checklist_pairs() { @@ -723,6 +752,20 @@ mod todo_write_live_tests { assert_eq!(pairs[0].1, "completed"); assert_eq!(pairs[1].0, "Move the chip"); } + + #[test] + fn todo_write_completion_output_restores_checklist() { + let output = "TODO List Updated\n\n[x] !! 1: Read composer.rs\n[~] !! 2: Move the chip\n[ ] ! 3: Run tests\n"; + let pairs = todo_pairs_from_write_output(output).expect("pairs"); + assert_eq!( + pairs, + vec![ + ("Read composer.rs".into(), "completed".into()), + ("Move the chip".into(), "in_progress".into()), + ("Run tests".into(), "pending".into()), + ] + ); + } } #[cfg(test)] From bc3a1885c3e628cbae159afb8165701cf5b24a4d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 18:54:01 +0000 Subject: [PATCH 15/15] fix(tui): import computer lock scenes after #71 rebase Co-authored-by: Mathis --- src/cortex-tui/src/lock_v2_boards.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cortex-tui/src/lock_v2_boards.rs b/src/cortex-tui/src/lock_v2_boards.rs index 669c29c1..cf28193a 100644 --- a/src/cortex-tui/src/lock_v2_boards.rs +++ b/src/cortex-tui/src/lock_v2_boards.rs @@ -12,10 +12,9 @@ use crate::interactive::builders::{ build_permissions_picker, build_plan_confirm, build_question_prompt, build_sandbox_deny_prompt, }; use crate::lock_v2::PRODUCT_ERROR; +use crate::lock_v2_computer::apply_computer_scene; use crate::lock_v2_designed::apply_designed_scene; -use crate::lock_v2_goal::{ - apply_computer_scene, apply_goal_chip_scene, show_goal_in_narrow_palette, -}; +use crate::lock_v2_goal::{apply_goal_chip_scene, show_goal_in_narrow_palette}; use crate::lock_v2_network::apply_offline_rate_limit_scene; use crate::lock_v2_parity::apply_parity_scene; use crate::lock_v2_scenes::*;

wka!=UzDp=rh@7_P9ac@123w?jIhzAHIBk+e!kk^Kn@lV!-0QkI&~Ng15;;{?WT?<4Sy}(eV#^#Ko_#j-en7UfMf>? zh@CH=AG^SG|L_#DJJaU*y!7 zaJhk{?&p7h{pT)cXt;#=hv@azkPrE7MNkwT}`;I zSN2li$B!RBeE1NU;cAI`F;B^i;zb`Hqw>1BKs;T_^U_U~cmMuRxSqKkPft%()2|y4 zN71lUVTN&S)Q$^>ys|C6mzS59mzU(lhXF3Lp*P#M%9PVIi)mesCe1F={V}tiIl5sO zxx2fo8WSr9#J(713lM*K(J*YUhZ)1dL2Y(wgFQ-*TT@maK;pZb$*OmmYqSbGOTFem zjBE4J#Z_@|sbSTKtI=>N!+j&SwGz>qs*S`m+*Aqon!8D}(KDfWSoX1-a91~>Bi!F+ z87;Vdt1TSIp5KLH_&izXztiduJ>JI6sfw0Bl4+1bB0v$8N%A-{)girQx(nr9Ar%(yHxyh_{#` z>*^3?Igs-N#PENI9*TS;hh`mj`_?=CkYMY8_|q>xcR&2=@BgTg{^&*KM!tGYK{n`+ z+9+$c7UEC8{9Gv}UKYlOg4VRKi|TX_?b&7ST8s6DUUjjOP?=F$WM`P3D2%NX1vDf{L_!oEqzulTvvayi-dEvG=pf^+4?T?H2nSa z%g=p3x|I8elo3}(DU`@a%36l~{m4b8lfHbOxmFOq(6(1=C33x8iCQ>r<1-vsa8#WB z*T@3q)J6-<(q`?@LhNE<@gUgAX-DihCSM?_oN)xNrax@UjOM9V-o0*sZAH!&$(7?=bu4>!ncE44ol^HA*B(4Mo#KCj_l{P@#J$R!qwKxr6KJQo+K$}< z;>OW%=_!Zsn57AOO#V(bytKFW@rXXpqewSeywn(k$xF?q5N=F`w_w8d%~5>cSbKsg zQeN+~PHj5sUe5OrfB4~tz|`G8|JC3{qN;AKyg6E{tEF>EBiRe{`L826#4c6Pt(7-N zn{|J6%1Z$`&i2^NUfSH<>$$b^rfEFfG@iX(2#8Qio2QL7bJYl4W`H-Fwh(g$is~+= z0swGicXxN1bwEM2ql#;Y0B;0DfHxky;Z$#U2mycboR$U&IOuK~FQ#mcXn!E>(sbf5|gXqwhSP3TZm6jPs3t}iKTq~`t{qlZ>3TT zoX<0Fo32_{3`3L*#aumT-^Y(1KYV}q5IJ-0?q>Bav;Oi8I`n1r135=Mzr4J>yu9q4 zi#P5vpV??+m8G^r)p4Ch>kZtNiBzc@cxc0VZlQ7x*GlcV%Y1V2!!~WO(#TtuHz@6f zY`yUdi)@`1Li1Vz;yH!K)eBDzkJvYqGoD}BCwOy4q1$WOe$KRJa`Kx<;XEGapQ{di zs@r+6I^Z;~?p=;w7S|AAXUBRHDB$SP5R(xFC4Wxo-Nx&CeSPhIc>n(W)p?d?8_p0; zsts|93H5xl>IGb(ytwiKaWf9ZN@mXxudlE972c%~J_Esy3J1g@`+D+$cXjQv?VA2) zt$&_KRU_KTwnBd?<3K6jvWhLl@D4qD^)1j-n@$=YIpL`*GJP$p(~K?6Hk@I$uz?-A z?*vWf2}~LZEE_P*>hLdD>$%belToggF5Lz$>0Ygk(G0_>30vXI=f}~c;ji)AcRFW& z$^;Y+h{K&V{)R)5?%2jQ$n)&McK`4gvwvsjEIZP|rdisrBGs$O?*G|fx)j>-b5$>8 zHoArw89r7u6{p?an1(|jk-hZi{OQU6a;-6vGc`fDo@Zy6&NJ)kHk$1RtlfNph%lY8p8Kj>MeWq_C?h?x%#r^Xzj_j`-{}%D3%2hpH2;@9N!6uyilmW3|HJg otm}HixqY{H29ps585air2Q-KoX>*m$ivR!s07*qoM6N<$f{ryo?EnA( diff --git a/docs/media/tui-lock-v2/runtime/40x12/goal-chip-blocked.png b/docs/media/tui-lock-v2/runtime/40x12/goal-chip-blocked.png index 193ba741006a7924da90d50a0b0ffed81b2fee78..bd5df93c6dd3a81328eab94f8cd4a329dede3494 100644 GIT binary patch delta 3554 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 N002ovPDHLkV1i>9CSm{p delta 3640 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 IM6N<$f}P4IF8}}l diff --git a/docs/media/tui-lock-v2/runtime/40x12/goal-chip-paused.png b/docs/media/tui-lock-v2/runtime/40x12/goal-chip-paused.png index be24d56e80ab2029a6fa0f3bf020420e28e24e78..3e539123cd1ca02c249b031d5dffdd092f61bed4 100644 GIT binary patch delta 3540 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 O0000R9P)b}7=|R0!{Ly8IWzp3%LS7G1sQ*U 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�j7_vr)pHFP8Xl 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 L#yS=E?4$n+qe0yH delta 3175 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