From 3d5fe7a54d67d153ce6e062928ff56e367429baa Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:25:45 +0000 Subject: [PATCH 1/7] docs(tui): COR-222/223/224 consent + @file chip + undo sheet lock_v2 Add designer and runtime lock_v2 scenes for local-tools consent, composer @file chip, and /undo /redo /rewind sheet at 40x12 and 120x40. Leave permission-prompt boards unchanged. Co-authored-by: Mathis --- .../tui-lock-v2/120x40/composer-file-chip.png | Bin 0 -> 21506 bytes .../120x40/consent-local-tools.png | Bin 0 -> 41569 bytes docs/media/tui-lock-v2/120x40/undo-sheet.png | Bin 0 -> 77879 bytes .../tui-lock-v2/40x12/composer-file-chip.png | Bin 0 -> 12249 bytes .../tui-lock-v2/40x12/consent-local-tools.png | Bin 0 -> 23690 bytes docs/media/tui-lock-v2/40x12/undo-sheet.png | Bin 0 -> 15668 bytes docs/media/tui-lock-v2/SPEC.md | 6 +- docs/media/tui-lock-v2/index.md | 5 +- docs/media/tui-lock-v2/runtime/README.md | 5 +- docs/media/tui-lock-v2/tools/boards.py | 73 ++++ .../txt/120x40/composer-file-chip.txt | 40 +++ .../txt/120x40/consent-local-tools.txt | 40 +++ .../tui-lock-v2/txt/120x40/undo-sheet.txt | 40 +++ .../txt/40x12/composer-file-chip.txt | 12 + .../txt/40x12/consent-local-tools.txt | 12 + .../tui-lock-v2/txt/40x12/undo-sheet.txt | 12 + scripts/render-tui-lock-v2.sh | 9 +- .../src/bin/generate_tui_lock_screenshots.rs | 22 +- src/cortex-tui/src/lib.rs | 1 + src/cortex-tui/src/lock_v2.rs | 16 +- src/cortex-tui/src/lock_v2_boards.rs | 2 + src/cortex-tui/src/lock_v2_ids.rs | 34 +- src/cortex-tui/src/lock_v2_parity.rs | 322 ++++++++++++++++++ .../src/views/minimal_session/view.rs | 38 ++- 24 files changed, 668 insertions(+), 21 deletions(-) create mode 100644 docs/media/tui-lock-v2/120x40/composer-file-chip.png create mode 100644 docs/media/tui-lock-v2/120x40/consent-local-tools.png create mode 100644 docs/media/tui-lock-v2/120x40/undo-sheet.png create mode 100644 docs/media/tui-lock-v2/40x12/composer-file-chip.png create mode 100644 docs/media/tui-lock-v2/40x12/consent-local-tools.png create mode 100644 docs/media/tui-lock-v2/40x12/undo-sheet.png create mode 100644 docs/media/tui-lock-v2/txt/120x40/composer-file-chip.txt create mode 100644 docs/media/tui-lock-v2/txt/120x40/consent-local-tools.txt create mode 100644 docs/media/tui-lock-v2/txt/120x40/undo-sheet.txt create mode 100644 docs/media/tui-lock-v2/txt/40x12/composer-file-chip.txt create mode 100644 docs/media/tui-lock-v2/txt/40x12/consent-local-tools.txt create mode 100644 docs/media/tui-lock-v2/txt/40x12/undo-sheet.txt create mode 100644 src/cortex-tui/src/lock_v2_parity.rs diff --git a/docs/media/tui-lock-v2/120x40/composer-file-chip.png b/docs/media/tui-lock-v2/120x40/composer-file-chip.png new file mode 100644 index 0000000000000000000000000000000000000000..3408c32ec7c13e431f5871b86690f4d8096da079 GIT binary patch literal 21506 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 CRgoP4 literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/120x40/consent-local-tools.png b/docs/media/tui-lock-v2/120x40/consent-local-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..5cebe9909a31319ccc515ca3756cddde048d37d4 GIT binary patch literal 41569 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 TjSu&~e^iiBkuH}s`}#isX3v16 literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/40x12/consent-local-tools.png b/docs/media/tui-lock-v2/40x12/consent-local-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..218e6f95ee2df5c52178a80824246e0ffb15bfa3 GIT binary patch literal 23690 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 HtDt`Y8Uq1` literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/40x12/undo-sheet.png b/docs/media/tui-lock-v2/40x12/undo-sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..ef86891ef754e3809a5eb53965658fe2d2ea9791 GIT binary patch literal 15668 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 KUMgz%@xKA~QQ9*A literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/SPEC.md b/docs/media/tui-lock-v2/SPEC.md index 6107e15d..a8ef6a6a 100644 --- a/docs/media/tui-lock-v2/SPEC.md +++ b/docs/media/tui-lock-v2/SPEC.md @@ -7,7 +7,7 @@ categorised rows + tip/nav footer, slash autocomplete above the composer, effort radios under `/model`, token counter top-right, footer shortcut strip) and re-skinned to the Cortex chrome. **No runtime code changes ship with this pack.** -- Boards: [`index.md`](index.md) — 84 boards at 120×40, 38 of them also at 40×12 (122 PNGs). +- Boards: [`index.md`](index.md) — 87 boards at 120×40, 41 of them also at 40×12 (128 PNGs). - Grids: `txt//.txt` — the exact character grid of every board (diff a `MockTerminal` capture against these). - Renderer: `tools/render_lock_v2.py` + `tools/boards.py` (Python 3 + Pillow, IBM Plex Mono @@ -419,13 +419,15 @@ Narrow: no bars, `used / total pct%`. | login / first-run | `login`, `login-waiting`, `login-success`, `login-error`, `first-run-tips` | | compact chat (ref 5) | `compact-chat` | | other product surfaces (not in the brief, kept complete) | `shortcuts-overlay`, `resume-picker`, `clear-confirm`, `plan-confirm`, `queue`, `files-picker`, `jobs`, `skills`, `todos`, `question`, `sudo`, `config-tree`, `btw` | +| local-tools consent · @file chip · undo/redo/rewind | `consent-local-tools`, `composer-file-chip`, `undo-sheet` | Narrow (40×12) set: `welcome-cortex`, `welcome-agent`, `first-run-tips`, `session-empty`, `session-user-bars`, `session-thinking-live`, `session-assistant`, `session-optin`, `composer-empty`, `composer-typing`, `composer-hover`, `tokens-topright`, `compact-chat`, `slash-palette`, `goal-chip-active`, `goal-chip-paused`, `goal-chip-done`, `goal-chip-budget`, `goal-chip-blocked`, `slash-model-typed`, `model-list`, `model-effort-high`, `settings-appearance`, `settings-mouse`, `settings-row-hover`, `settings-theme-submenu`, `mode-plan`, `mode-ask`, -`permission-prompt`, `mcp-servers`, `usage`, `diagnostics`, `interrupt-stopped`, `offline`, `rate-limit`, `diff-hunk`, `login`, `shortcuts-overlay`. +`permission-prompt`, `mcp-servers`, `usage`, `diagnostics`, `interrupt-stopped`, `offline`, `rate-limit`, `diff-hunk`, `login`, `shortcuts-overlay`, +`consent-local-tools`, `composer-file-chip`, `undo-sheet`. --- diff --git a/docs/media/tui-lock-v2/index.md b/docs/media/tui-lock-v2/index.md index 8ee26a96..cff79b57 100644 --- a/docs/media/tui-lock-v2/index.md +++ b/docs/media/tui-lock-v2/index.md @@ -114,5 +114,8 @@ Regenerate: `python3 tools/render_lock_v2.py --index` (fetches IBM Plex Mono on | `sudo` | Elevated Shell — password row on gray | [120x40](120x40/sudo.png) | — | | `config-tree` | `/config` read-only key tree | [120x40](120x40/config-tree.png) | — | | `btw` | `/btw` side note during a running turn | [120x40](120x40/btw.png) | — | +| `consent-local-tools` | Consent card — run tools locally in CWD / This PC | [120x40](120x40/consent-local-tools.png) | [40x12](40x12/consent-local-tools.png) | +| `composer-file-chip` | Composer with attached @file chip in prompt | [120x40](120x40/composer-file-chip.png) | [40x12](40x12/composer-file-chip.png) | +| `undo-sheet` | /undo /redo /rewind sheet | [120x40](120x40/undo-sheet.png) | [40x12](40x12/undo-sheet.png) | -**84** boards at 120x40 · **38** at 40x12 · 122 PNGs. +**87** boards at 120x40 · **41** at 40x12 · 128 PNGs. diff --git a/docs/media/tui-lock-v2/runtime/README.md b/docs/media/tui-lock-v2/runtime/README.md index 4955b603..a45e0eeb 100644 --- a/docs/media/tui-lock-v2/runtime/README.md +++ b/docs/media/tui-lock-v2/runtime/README.md @@ -8,6 +8,7 @@ is banner green `#1F4945`; historical violet `#A78BFA` is not the lock. Designer boards (pixel target) live in `docs/media/tui-lock-v2/{40x12,120x40}/`. These runtime frames are what Designer cli signs off against. -SPEC §7: **84** boards at 120×40 and **38** at 40×12. Each filename is one +SPEC §7: **87** boards at 120×40 and **41** at 40×12. Each filename is one distinct live state — no two PNGs share a sha256. Includes `/goal` composer -chips (`goal-chip-*`) plus distinct `offline` and `rate-limit` diagnostics. +chips (`goal-chip-*`), distinct `offline` and `rate-limit` diagnostics, +local-tools consent, composer `@file` chip, and `/undo` `/redo` `/rewind` sheet. diff --git a/docs/media/tui-lock-v2/tools/boards.py b/docs/media/tui-lock-v2/tools/boards.py index 1c6f6e3c..2e03c2c6 100644 --- a/docs/media/tui-lock-v2/tools/boards.py +++ b/docs/media/tui-lock-v2/tools/boards.py @@ -1811,6 +1811,76 @@ def board_btw(s, c): footer(s, c, [("Esc", "interrupt"), ("Enter", "queue follow-up"), ("Ctrl+x", "shortcuts")]) +def board_consent_local_tools(s, c): + """COR-222 — consent card to run tools locally in the CWD / This PC. + + Distinct from ``permission-prompt`` (no ``$`` command block) and + ``session-optin`` (no retain-coding-data privacy copy). + """ + header(s, c) + top = composer(s, c, focused=False, caret=False, placeholder="Choose an option above") + f = Flow(s, c, y=1 if c.narrow else 2, limit=top if c.narrow else top - 1) + if not c.narrow: + f.user("fix the failing test in this repo", "10:18 AM") + f.thought("Thought for 0.6s") + f.line([("●", S_DIM), (" Run tools locally?", S)]) + if c.narrow: + f.dim("This PC · current directory · Cloud is default") + else: + f.dim("Tools run on This PC against the current working directory. Cloud is the default when unset.") + yes = "Yes — run tools here" if c.narrow else "Yes — run tools in this directory" + always = "Always allow project" if c.narrow else "Always allow for this project" + no = "No — keep using Cloud" + f.options([yes, always, no], focused=0) + footer( + s, + c, + [("↑↓", "select"), ("Enter", "confirm"), ("Esc", "cancel")] + if not c.narrow + else [("Enter", "confirm"), ("Esc", "cancel")], + ) + + +def board_composer_file_chip(s, c): + """COR-223 — post-attach composer with an ``@file`` chip (picker closed).""" + header(s, c) + path = "@src/composer.rs" if c.narrow else "@src/cortex-tui/src/composer.rs" + top = composer(s, c, content=[("explain ", S), (path, S_ACC), (" ", S)]) + if not c.narrow: + s.put(c.x0 + 2, top - 2, clip("@ attaches files · ! enters Bash", c.inner_w - 4), S_DIM) + footer( + s, + c, + [("Enter", "send"), ("@", "files"), ("!", "bash")] + if not c.narrow + else [("Enter", "send"), ("@", "files")], + ) + + +def board_undo_sheet(s, c): + """COR-224 — ``/undo`` ``/redo`` ``/rewind`` sheet (not clear / resume).""" + header(s, c) + top = composer(s, c, content=[("/undo", S_ACC), (" ", S)]) + if c.narrow: + f = Flow(s, c, y=1, limit=top) + f.line([("Undo", S)]) + f.options(["Undo last turn", "Redo", "Rewind…"], focused=0) + else: + y = top - 6 + backdrop_tail(s, c, y) + f = Flow(s, c, y=y, limit=top - 1) + f.line([("Undo", S)]) + f.dim("Undo the last turn, redo it, or rewind this Cortex session to a checkpoint.") + f.options(["Undo last turn", "Redo", "Rewind to checkpoint"], focused=0) + footer( + s, + c, + [("↑↓", "select"), ("Enter", "confirm"), ("Esc", "close")] + if not c.narrow + else [("Enter", "confirm"), ("Esc", "close")], + ) + + # --------------------------------------------------------------------------- # # Registry — (id, painter, meta). ``narrow`` = also rendered at 40×12. # --------------------------------------------------------------------------- # @@ -1914,6 +1984,9 @@ def board_btw(s, c): ("sudo", board_sudo, False, "E", "Elevated Shell — password row on gray"), ("config-tree", board_config_tree, False, "E", "`/config` read-only key tree"), ("btw", board_btw, False, "E", "`/btw` side note during a running turn"), + ("consent-local-tools", board_consent_local_tools, True, "E", "Consent card — run tools locally in CWD / This PC"), + ("composer-file-chip", board_composer_file_chip, True, "E", "Composer with attached @file chip in prompt"), + ("undo-sheet", board_undo_sheet, True, "E", "/undo /redo /rewind sheet"), ] BOARDS = [(bid, fn, {"narrow": narrow, "section": sec, "desc": desc}) for bid, fn, narrow, sec, desc in BOARDS_META] diff --git a/docs/media/tui-lock-v2/txt/120x40/composer-file-chip.txt b/docs/media/tui-lock-v2/txt/120x40/composer-file-chip.txt new file mode 100644 index 00000000..d5a51e17 --- /dev/null +++ b/docs/media/tui-lock-v2/txt/120x40/composer-file-chip.txt @@ -0,0 +1,40 @@ + 14K / 500K + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @ attaches files · ! enters Bash + + ╭─ Agent ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ > explain @src/cortex-tui/src/composer.rs │ + ╰─────────────────────────────────────────────────────────────────────────────────────────── Cortex Mini 1 (medium) ─╯ + + Enter:send | @:files | !:bash diff --git a/docs/media/tui-lock-v2/txt/120x40/consent-local-tools.txt b/docs/media/tui-lock-v2/txt/120x40/consent-local-tools.txt new file mode 100644 index 00000000..47201c6f --- /dev/null +++ b/docs/media/tui-lock-v2/txt/120x40/consent-local-tools.txt @@ -0,0 +1,40 @@ + 14K / 500K + + > fix the failing test in this repo 10:18 AM + + ♦ Thought for 0.6s + + ● Run tools locally? + Tools run on This PC against the current working directory. Cloud is the default when unset. + > 1 Yes — run tools in this directory + 2 Always allow for this project + 3 No — keep using Cloud + + + + + + + + + + + + + + + + + + + + + + + + + ╭─ Agent ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ > Choose an option above │ + ╰─────────────────────────────────────────────────────────────────────────────────────────── Cortex Mini 1 (medium) ─╯ + + ↑↓:select | Enter:confirm | Esc:cancel diff --git a/docs/media/tui-lock-v2/txt/120x40/undo-sheet.txt b/docs/media/tui-lock-v2/txt/120x40/undo-sheet.txt new file mode 100644 index 00000000..f45f02e4 --- /dev/null +++ b/docs/media/tui-lock-v2/txt/120x40/undo-sheet.txt @@ -0,0 +1,40 @@ + 14K / 500K + + + > hey 12:49 AM + + ♦ Thought for 0.4s + + Hey — what do you want to work on? 12:49 AM + + Worked for 1.8s + + > tell me about yourself 12:49 AM + + ♦ Thought for 0.4s + + I'm Cortex, a coding agent that runs in your terminal. 12:49 AM + + I mostly help you build and debug software: code, architecture, debugging, reviews, docs, and a bit of research. + Here I run in an interactive terminal, so I can read your files, run commands, and change the project. + + In practice: + • I get straight to the point + • I prefer concrete work over long explanations + • I can also discuss, explain, or help you plan + + Tell me what you'd like to do. + + Worked for 4.6s + + Undo + Undo the last turn, redo it, or rewind this Cortex session to a checkpoint. + > 1 Undo last turn + 2 Redo + 3 Rewind to checkpoint + + ╭─ Agent ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ > /undo │ + ╰─────────────────────────────────────────────────────────────────────────────────────────── Cortex Mini 1 (medium) ─╯ + + ↑↓:select | Enter:confirm | Esc:close diff --git a/docs/media/tui-lock-v2/txt/40x12/composer-file-chip.txt b/docs/media/tui-lock-v2/txt/40x12/composer-file-chip.txt new file mode 100644 index 00000000..5c346dcb --- /dev/null +++ b/docs/media/tui-lock-v2/txt/40x12/composer-file-chip.txt @@ -0,0 +1,12 @@ + 14K / 500K + + + + + + + ╭─ Agent ────────────────────────────╮ + │ > explain @src/composer.rs │ + ╰─────────── Cortex Mini 1 (medium) ─╯ + + Enter:send | @:files diff --git a/docs/media/tui-lock-v2/txt/40x12/consent-local-tools.txt b/docs/media/tui-lock-v2/txt/40x12/consent-local-tools.txt new file mode 100644 index 00000000..ddc6e141 --- /dev/null +++ b/docs/media/tui-lock-v2/txt/40x12/consent-local-tools.txt @@ -0,0 +1,12 @@ + 14K / 500K + ● Run tools locally? + This PC · current directory · Clou… + > 1 Yes — run tools here + 2 Always allow project + 3 No — keep using Cloud + + ╭─ Agent ────────────────────────────╮ + │ > Choose an option above │ + ╰─────────── Cortex Mini 1 (medium) ─╯ + + Enter:confirm | Esc:cancel diff --git a/docs/media/tui-lock-v2/txt/40x12/undo-sheet.txt b/docs/media/tui-lock-v2/txt/40x12/undo-sheet.txt new file mode 100644 index 00000000..264811fd --- /dev/null +++ b/docs/media/tui-lock-v2/txt/40x12/undo-sheet.txt @@ -0,0 +1,12 @@ + 14K / 500K + Undo + > 1 Undo last turn + 2 Redo + 3 Rewind… + + + ╭─ Agent ────────────────────────────╮ + │ > /undo │ + ╰─────────── Cortex Mini 1 (medium) ─╯ + + Enter:confirm | Esc:close diff --git a/scripts/render-tui-lock-v2.sh b/scripts/render-tui-lock-v2.sh index 6a13db4f..578c284f 100755 --- a/scripts/render-tui-lock-v2.sh +++ b/scripts/render-tui-lock-v2.sh @@ -59,8 +59,8 @@ for spec in 40x12 120x40; do python3 scripts/ansi-frames-to-gif.py --frames "$frames" --png-only "$pngs" done -unique_pngs "$output_dir/40x12" 38 -unique_pngs "$output_dir/120x40" 84 +unique_pngs "$output_dir/40x12" 41 +unique_pngs "$output_dir/120x40" 87 python3 - "$output_dir" <<'PY' from pathlib import Path @@ -100,9 +100,10 @@ is banner green `#1F4945`; historical violet `#A78BFA` is not the lock. Designer boards (pixel target) live in `docs/media/tui-lock-v2/{40x12,120x40}/`. These runtime frames are what Designer cli signs off against. -SPEC §7: **84** boards at 120×40 and **38** at 40×12. Each filename is one +SPEC §7: **87** boards at 120×40 and **41** at 40×12. Each filename is one distinct live state — no two PNGs share a sha256. Includes `/goal` composer -chips (`goal-chip-*`) plus distinct `offline` and `rate-limit` diagnostics. +chips (`goal-chip-*`), distinct `offline` and `rate-limit` diagnostics, +local-tools consent, composer `@file` chip, and `/undo` `/redo` `/rewind` sheet. EOF echo "Wrote runtime captures to $output_dir" diff --git a/src/cortex-tui/src/bin/generate_tui_lock_screenshots.rs b/src/cortex-tui/src/bin/generate_tui_lock_screenshots.rs index 74385997..c4db9517 100644 --- a/src/cortex-tui/src/bin/generate_tui_lock_screenshots.rs +++ b/src/cortex-tui/src/bin/generate_tui_lock_screenshots.rs @@ -25,6 +25,7 @@ OPTIONS: -w, --width Terminal width (default: 120) -h, --height Terminal height (default: 40) --v2 Capture lock v2 scenes (real session chrome) + --only Comma-separated lock v2 scene ids (with --v2) --help Show this help " ); @@ -36,6 +37,7 @@ fn main() { let mut width: u16 = 120; let mut height: u16 = 40; let mut v2 = false; + let mut only: Vec = Vec::new(); let mut i = 1; while i < args.len() { @@ -68,6 +70,19 @@ fn main() { "--v2" => { v2 = true; } + "--only" => { + i += 1; + let raw = args.get(i).cloned().unwrap_or_else(|| { + eprintln!("Missing value for --only"); + process::exit(1); + }); + only = raw + .split(',') + .map(str::trim) + .filter(|s| !s.is_empty()) + .map(str::to_string) + .collect(); + } other => { eprintln!("Unknown argument: {other}"); print_help(); @@ -78,7 +93,12 @@ fn main() { } let result = if v2 { - write_lock_v2_frames(width, height, &output) + if only.is_empty() { + write_lock_v2_frames(width, height, &output) + } else { + let ids: Vec<&str> = only.iter().map(String::as_str).collect(); + cortex_tui::lock_v2::write_lock_v2_id_frames(&ids, width, height, &output) + } } else { write_lock_frames(width, height, &output) }; diff --git a/src/cortex-tui/src/lib.rs b/src/cortex-tui/src/lib.rs index 4e90462b..69ae0232 100644 --- a/src/cortex-tui/src/lib.rs +++ b/src/cortex-tui/src/lib.rs @@ -108,6 +108,7 @@ mod lock_v2_boards; mod lock_v2_goal; mod lock_v2_ids; mod lock_v2_network; +mod lock_v2_parity; mod lock_v2_scenes; pub mod readme_hero; pub mod readme_hero_boards; diff --git a/src/cortex-tui/src/lock_v2.rs b/src/cortex-tui/src/lock_v2.rs index 6e659f86..0094973b 100644 --- a/src/cortex-tui/src/lock_v2.rs +++ b/src/cortex-tui/src/lock_v2.rs @@ -33,10 +33,20 @@ struct ManifestFrame { } pub fn write_lock_v2_frames(width: u16, height: u16, output_dir: &Path) -> Result { + write_lock_v2_id_frames(lock_v2_scene_ids(width), width, height, output_dir) +} + +/// Write a subset of lock v2 scenes (used to recapture residual boards). +pub fn write_lock_v2_id_frames( + ids: &[&str], + width: u16, + height: u16, + output_dir: &Path, +) -> Result { std::fs::create_dir_all(output_dir) .with_context(|| format!("create {}", output_dir.display()))?; let mut manifest_frames = Vec::new(); - for id in lock_v2_scene_ids(width) { + for id in ids { let frame = render_lock_v2_scene(id, width, height)?; let file = format!("{}.ans", id); std::fs::write(output_dir.join(&file), &frame.ansi) @@ -128,8 +138,8 @@ mod tests { #[test] fn lock_v2_wide_count_is_spec() { - assert_eq!(LOCK_V2_WIDE_IDS.len(), 84); - assert_eq!(LOCK_V2_NARROW_IDS.len(), 38); + assert_eq!(LOCK_V2_WIDE_IDS.len(), 87); + assert_eq!(LOCK_V2_NARROW_IDS.len(), 41); } #[test] diff --git a/src/cortex-tui/src/lock_v2_boards.rs b/src/cortex-tui/src/lock_v2_boards.rs index f021226a..bb23313c 100644 --- a/src/cortex-tui/src/lock_v2_boards.rs +++ b/src/cortex-tui/src/lock_v2_boards.rs @@ -16,6 +16,7 @@ use crate::interactive::builders::{ use crate::lock_v2::PRODUCT_ERROR; 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::*; use crate::modal::mcp_manager::{McpServerInfo, McpStatus}; use crate::session::SessionSummary; @@ -808,6 +809,7 @@ Tell me what you'd like to do.", ); } id if apply_offline_rate_limit_scene(id, &mut state) => {} + id if apply_parity_scene(id, &mut state) => {} id if apply_goal_chip_scene(id, &mut state) => {} other => panic!("unknown lock v2 scene {other}"), } diff --git a/src/cortex-tui/src/lock_v2_ids.rs b/src/cortex-tui/src/lock_v2_ids.rs index 8b6274a4..77ffa55d 100644 --- a/src/cortex-tui/src/lock_v2_ids.rs +++ b/src/cortex-tui/src/lock_v2_ids.rs @@ -1,7 +1,7 @@ //! Lock v2 scene id lists. Split out of [`crate::lock_v2`] so adding `/goal` //! boards does not grow that file past the source-policy line-count baseline. -/// Narrow (40×12) SPEC §7 set — 38 boards. +/// Narrow (40×12) SPEC §7 set — 41 boards. pub const LOCK_V2_NARROW_IDS: &[&str] = &[ "welcome-cortex", "welcome-agent", @@ -41,9 +41,12 @@ pub const LOCK_V2_NARROW_IDS: &[&str] = &[ "diff-hunk", "login", "shortcuts-overlay", + "consent-local-tools", + "composer-file-chip", + "undo-sheet", ]; -/// Wide (120×40) SPEC §7 set — 84 boards. +/// Wide (120×40) SPEC §7 set — 87 boards. pub const LOCK_V2_WIDE_IDS: &[&str] = &[ "welcome-cortex", "welcome-agent", @@ -129,6 +132,9 @@ pub const LOCK_V2_WIDE_IDS: &[&str] = &[ "sudo", "config-tree", "btw", + "consent-local-tools", + "composer-file-chip", + "undo-sheet", ]; /// Boards captured at both sizes. Narrow (40×12) is a subset. @@ -139,3 +145,27 @@ pub fn lock_v2_scene_ids(width: u16) -> &'static [&'static str] { LOCK_V2_WIDE_IDS } } + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashSet; + + #[test] + fn lock_v2_id_counts_and_unique() { + assert_eq!(LOCK_V2_WIDE_IDS.len(), 87); + assert_eq!(LOCK_V2_NARROW_IDS.len(), 41); + let mut wide = HashSet::new(); + for id in LOCK_V2_WIDE_IDS { + assert!(wide.insert(*id), "duplicate wide id {id}"); + } + let mut narrow = HashSet::new(); + for id in LOCK_V2_NARROW_IDS { + assert!(narrow.insert(*id), "duplicate narrow id {id}"); + assert!( + wide.contains(id), + "narrow id {id} is not in LOCK_V2_WIDE_IDS" + ); + } + } +} diff --git a/src/cortex-tui/src/lock_v2_parity.rs b/src/cortex-tui/src/lock_v2_parity.rs new file mode 100644 index 00000000..4933af9f --- /dev/null +++ b/src/cortex-tui/src/lock_v2_parity.rs @@ -0,0 +1,322 @@ +//! Lock v2 residual chrome: local-tools consent, `@file` chip, undo sheet. +//! +//! Split out of [`crate::lock_v2_boards`] so adding COR-222/223/224 scenes +//! does not grow that file past the source-policy line-count baseline. + +use cortex_core::widgets::Message; + +use crate::app::AppState; +use crate::interactive::builders::build_question_prompt; +use crate::lock_v2_scenes::{radios, resumed}; + +/// Residual parity boards (wide + narrow). +pub const PARITY_IDS: &[&str] = &["consent-local-tools", "composer-file-chip", "undo-sheet"]; + +/// Attached `@file` token shown after the picker closes. +pub const FILE_CHIP_TOKEN: &str = "@src/cortex-tui/src/composer.rs"; + +/// Composer prompt with the attached file chip and a trailing space. +pub const FILE_CHIP_PROMPT: &str = "explain @src/cortex-tui/src/composer.rs "; + +/// Apply a residual parity scene. Returns `false` when `id` is not one of ours. +pub fn apply_parity_scene(id: &str, state: &mut AppState) -> bool { + match id { + "consent-local-tools" => { + apply_consent_local_tools(state); + true + } + "composer-file-chip" => { + apply_composer_file_chip(state); + true + } + "undo-sheet" => { + apply_undo_sheet(state); + true + } + _ => false, + } +} + +fn apply_consent_local_tools(state: &mut AppState) { + resumed(state); + state + .add_message(Message::user("fix the failing test in this repo").with_timestamp("10:18 AM")); + state.add_message( + Message::assistant( + "Run tools locally?\nTools run on This PC against the current working directory. Cloud is the default when unset.", + ) + .with_timestamp("10:18 AM") + .with_thought_secs(0.6), + ); + state.enter_interactive_mode( + build_question_prompt( + "Run tools locally?", + &[ + ( + "yes", + "1 Yes — run tools in this directory", + "This PC · current directory", + ), + ( + "always", + "2 Always allow for this project", + "remember this workspace", + ), + ("no", "3 No — keep using Cloud", "Cloud stays the default"), + ], + 0, + ) + .with_prompt_focus(), + ); +} + +fn apply_composer_file_chip(state: &mut AppState) { + resumed(state); + state.input.set_text(FILE_CHIP_PROMPT); +} + +fn apply_undo_sheet(state: &mut AppState) { + resumed(state); + state.add_message( + Message::assistant( + "Undo\nUndo the last turn, redo it, or rewind this Cortex session to a checkpoint.", + ) + .with_timestamp("10:22 AM"), + ); + state.input.set_text("/undo"); + state.enter_interactive_mode(radios( + "Undo", + &[ + ("undo", "1 Undo last turn", "restore the last turn"), + ("redo", "2 Redo", "re-apply the undone turn"), + ( + "rewind", + "3 Rewind to checkpoint", + "pick a Cortex session checkpoint", + ), + ], + 0, + None, + )); +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::lock_v2::{LOCK_V2_NARROW_IDS, LOCK_V2_WIDE_IDS, render_lock_v2_scene}; + use cortex_core::style::{ACCENT, SELECTION_BG}; + use std::collections::HashSet; + + fn banned_competitors(plain: &str) -> bool { + let lower = plain.to_ascii_lowercase(); + [ + "claude", + "openai", + "anthropic", + "cursor", + "codex", + "devin", + "gemini", + "copilot", + ] + .iter() + .any(|n| lower.contains(n)) + } + + #[test] + fn parity_ids_are_registered_at_both_sizes() { + assert_eq!(PARITY_IDS.len(), 3); + for id in PARITY_IDS { + assert!(LOCK_V2_WIDE_IDS.contains(id), "{id} missing from wide list"); + assert!( + LOCK_V2_NARROW_IDS.contains(id), + "{id} missing from narrow list" + ); + } + } + + #[test] + fn consent_local_tools_is_not_permission_or_optin() { + for (width, height) in [(120u16, 40u16), (40u16, 12u16)] { + let frame = + render_lock_v2_scene("consent-local-tools", width, height).expect("consent"); + assert!( + frame.plain.contains("Run tools locally") + || frame.plain.contains("Yes") && frame.plain.contains("Cloud"), + "consent missing local-tools copy at {width}x{height}:\n{}", + frame.plain + ); + assert!( + frame.plain.contains("This PC") + || frame.plain.contains("directory") + || frame.plain.contains("Cloud"), + "consent missing This PC / directory / Cloud at {width}x{height}:\n{}", + frame.plain + ); + assert!( + !frame.plain.contains("$ npm install"), + "consent must not be a permission-prompt command block:\n{}", + frame.plain + ); + assert!( + !frame + .plain + .to_ascii_lowercase() + .contains("retain coding data"), + "consent must not reuse session-optin privacy copy:\n{}", + frame.plain + ); + assert!( + frame.plain.contains("Choose an option above"), + "consent composer must stay held:\n{}", + frame.plain + ); + assert!(!banned_competitors(&frame.plain), "{}", frame.plain); + assert_ne!( + frame.ansi, + render_lock_v2_scene("permission-prompt", width, height) + .expect("permission-prompt") + .ansi, + "consent-local-tools must differ from permission-prompt" + ); + if width >= 80 { + assert_ne!( + frame.ansi, + render_lock_v2_scene("session-optin", width, height) + .expect("session-optin") + .ansi, + "consent-local-tools must differ from session-optin" + ); + } + let mut sel = false; + for y in 0..height { + for x in 0..width { + if frame.buffer[(x, y)].bg == SELECTION_BG { + sel = true; + } + } + } + assert!(sel, "consent focused row must paint SELECTION_BG"); + } + } + + #[test] + fn composer_file_chip_shows_attached_path() { + for (width, height) in [(120u16, 40u16), (40u16, 12u16)] { + let frame = + render_lock_v2_scene("composer-file-chip", width, height).expect("file-chip"); + assert!( + frame.plain.contains('@') + && (frame.plain.contains("composer.rs") + || frame.plain.contains(FILE_CHIP_TOKEN)), + "file-chip must show @ + path at {width}x{height}:\n{}", + frame.plain + ); + assert!( + frame.plain.contains("explain"), + "file-chip prompt prefix missing at {width}x{height}:\n{}", + frame.plain + ); + assert!( + !frame.plain.contains("rateLimits.json") && !frame.plain.contains("Type to search"), + "file-chip must not open the files-picker menu:\n{}", + frame.plain + ); + assert!(!banned_competitors(&frame.plain), "{}", frame.plain); + if width >= 80 { + assert_ne!( + frame.ansi, + render_lock_v2_scene("files-picker", width, height) + .expect("files-picker") + .ansi, + "composer-file-chip must differ from files-picker" + ); + assert_ne!( + frame.ansi, + render_lock_v2_scene("composer-typing", width, height) + .expect("composer-typing") + .ansi, + "composer-file-chip must differ from composer-typing" + ); + } + let mut accent_at = false; + for y in 0..height { + for x in 0..width { + let cell = &frame.buffer[(x, y)]; + if cell.fg == ACCENT && cell.symbol().contains('@') { + accent_at = true; + } + } + } + assert!( + accent_at || frame.plain.contains(FILE_CHIP_TOKEN) || frame.plain.contains('@'), + "file-chip should paint accent on the @ token at {width}x{height}" + ); + } + } + + #[test] + fn undo_sheet_lists_undo_redo_rewind() { + for (width, height) in [(120u16, 40u16), (40u16, 12u16)] { + let frame = render_lock_v2_scene("undo-sheet", width, height).expect("undo-sheet"); + assert!( + frame.plain.contains("Undo") || frame.plain.contains("/undo"), + "undo-sheet missing Undo at {width}x{height}:\n{}", + frame.plain + ); + assert!( + frame.plain.contains("Rewind") || frame.plain.contains("Redo"), + "undo-sheet missing Rewind/Redo at {width}x{height}:\n{}", + frame.plain + ); + assert!( + !frame + .plain + .to_ascii_lowercase() + .contains("clear conversation") + && !frame.plain.contains("Clear this conversation"), + "undo-sheet must not reuse clear-confirm copy:\n{}", + frame.plain + ); + assert!(!banned_competitors(&frame.plain), "{}", frame.plain); + if width >= 80 { + assert_ne!( + frame.ansi, + render_lock_v2_scene("clear-confirm", width, height) + .expect("clear-confirm") + .ansi, + "undo-sheet must differ from clear-confirm" + ); + assert_ne!( + frame.ansi, + render_lock_v2_scene("resume-picker", width, height) + .expect("resume-picker") + .ansi, + "undo-sheet must differ from resume-picker" + ); + } + let mut sel = false; + for y in 0..height { + for x in 0..width { + if frame.buffer[(x, y)].bg == SELECTION_BG { + sel = true; + } + } + } + assert!(sel, "undo-sheet focused row must paint SELECTION_BG"); + } + } + + #[test] + fn parity_frames_are_unique_from_each_other() { + let mut seen = HashSet::new(); + for id in PARITY_IDS { + let frame = render_lock_v2_scene(id, 120, 40).expect(id); + assert!( + seen.insert(frame.ansi.clone()), + "{id} collided with a sibling at 120x40" + ); + } + assert_eq!(seen.len(), PARITY_IDS.len()); + } +} diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index 4b87fd3b..20159dd0 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -84,14 +84,13 @@ pub fn paint_composer_contents( let shown = crate::ui::text_utils::first_fitting_line(input, budget.saturating_sub(1)); let chars: Vec = shown.chars().collect(); let caret = caret.min(chars.len()); - let slash_end = if shown.starts_with('/') { - shown.find(' ').unwrap_or(shown.len()) - } else { - 0 - }; let mut col = col0; for (i, ch) in chars.iter().enumerate() { - let fg = if i < slash_end { ACCENT } else { TEXT }; + let fg = if composer_char_accent(&chars, i) { + ACCENT + } else { + TEXT + }; if caret_visible && i == caret { buf.set_string( col, @@ -804,6 +803,33 @@ fn area_is_narrow(width: u16) -> bool { width < 80 } +/// Accent slash commands (`/undo`) and completed `@path` file chips. +fn composer_char_accent(chars: &[char], index: usize) -> bool { + if chars.first() == Some(&'/') { + let end = chars.iter().position(|&c| c == ' ').unwrap_or(chars.len()); + if index < end { + return true; + } + } + let mut i = 0; + while i < chars.len() { + let at_token = chars[i] == '@' && (i == 0 || chars[i - 1].is_whitespace()); + if at_token { + let start = i; + i += 1; + while i < chars.len() && !chars[i].is_whitespace() { + i += 1; + } + if index >= start && index < i && i > start + 1 { + return true; + } + } else { + i += 1; + } + } + false +} + fn composer_display_text(state: &AppState) -> String { if let Some(istate) = state.get_interactive_state() { let title = istate.title.to_ascii_lowercase(); From 05647a6b1b785d82fed79d0d951aab2f68a31718 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:31:58 +0000 Subject: [PATCH 2/7] test(tui): render COR-222/223/224 runtime lock_v2 pngs Add MockTerminal captures at 40x12 and 120x40, and keep the @file chip path short enough to stay visible on the narrow composer. Co-authored-by: Mathis --- .../runtime/120x40/composer-file-chip.png | Bin 0 -> 6323 bytes .../runtime/120x40/consent-local-tools.png | Bin 0 -> 11024 bytes .../tui-lock-v2/runtime/120x40/undo-sheet.png | Bin 0 -> 9048 bytes .../runtime/40x12/composer-file-chip.png | Bin 0 -> 2706 bytes .../runtime/40x12/consent-local-tools.png | Bin 0 -> 5215 bytes .../tui-lock-v2/runtime/40x12/undo-sheet.png | Bin 0 -> 4899 bytes src/cortex-tui/src/lock_v2_boards.rs | 2 +- src/cortex-tui/src/lock_v2_parity.rs | 21 +++++++++++++----- 8 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 docs/media/tui-lock-v2/runtime/120x40/composer-file-chip.png create mode 100644 docs/media/tui-lock-v2/runtime/120x40/consent-local-tools.png create mode 100644 docs/media/tui-lock-v2/runtime/120x40/undo-sheet.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/composer-file-chip.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/consent-local-tools.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/undo-sheet.png diff --git a/docs/media/tui-lock-v2/runtime/120x40/composer-file-chip.png b/docs/media/tui-lock-v2/runtime/120x40/composer-file-chip.png new file mode 100644 index 0000000000000000000000000000000000000000..81645f14e8d919bfd2a3b72e6a0140ec14144285 GIT binary patch literal 6323 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 literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/runtime/120x40/consent-local-tools.png b/docs/media/tui-lock-v2/runtime/120x40/consent-local-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..8a618051de2005dc8d7838f467595583ffa83b7d GIT binary patch literal 11024 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 literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/runtime/120x40/undo-sheet.png b/docs/media/tui-lock-v2/runtime/120x40/undo-sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..eedad9a9ad86997c9e3259db306f577fc89371e0 GIT binary patch literal 9048 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 literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/runtime/40x12/composer-file-chip.png b/docs/media/tui-lock-v2/runtime/40x12/composer-file-chip.png new file mode 100644 index 0000000000000000000000000000000000000000..9d2271f2495532cc43978fb8ed371ec10cdf12b1 GIT binary patch literal 2706 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 literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/runtime/40x12/undo-sheet.png b/docs/media/tui-lock-v2/runtime/40x12/undo-sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..81928119c8e6b817d78890b099ab92123310867b GIT binary patch literal 4899 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 literal 0 HcmV?d00001 diff --git a/src/cortex-tui/src/lock_v2_boards.rs b/src/cortex-tui/src/lock_v2_boards.rs index bb23313c..df07d65f 100644 --- a/src/cortex-tui/src/lock_v2_boards.rs +++ b/src/cortex-tui/src/lock_v2_boards.rs @@ -809,7 +809,7 @@ Tell me what you'd like to do.", ); } id if apply_offline_rate_limit_scene(id, &mut state) => {} - id if apply_parity_scene(id, &mut state) => {} + id if apply_parity_scene(id, &mut state, width) => {} id if apply_goal_chip_scene(id, &mut state) => {} other => panic!("unknown lock v2 scene {other}"), } diff --git a/src/cortex-tui/src/lock_v2_parity.rs b/src/cortex-tui/src/lock_v2_parity.rs index 4933af9f..5808e46f 100644 --- a/src/cortex-tui/src/lock_v2_parity.rs +++ b/src/cortex-tui/src/lock_v2_parity.rs @@ -15,18 +15,21 @@ pub const PARITY_IDS: &[&str] = &["consent-local-tools", "composer-file-chip", " /// Attached `@file` token shown after the picker closes. pub const FILE_CHIP_TOKEN: &str = "@src/cortex-tui/src/composer.rs"; -/// Composer prompt with the attached file chip and a trailing space. +/// Wide composer prompt with the attached file chip and a trailing space. pub const FILE_CHIP_PROMPT: &str = "explain @src/cortex-tui/src/composer.rs "; /// Apply a residual parity scene. Returns `false` when `id` is not one of ours. -pub fn apply_parity_scene(id: &str, state: &mut AppState) -> bool { +pub fn apply_parity_scene(id: &str, state: &mut AppState, width: u16) -> bool { + if !PARITY_IDS.contains(&id) { + return false; + } match id { "consent-local-tools" => { apply_consent_local_tools(state); true } "composer-file-chip" => { - apply_composer_file_chip(state); + apply_composer_file_chip(state, width); true } "undo-sheet" => { @@ -70,9 +73,17 @@ fn apply_consent_local_tools(state: &mut AppState) { ); } -fn apply_composer_file_chip(state: &mut AppState) { +/// Narrow composer cannot hold the full crate path after `> explain `. +pub const FILE_CHIP_PROMPT_NARROW: &str = "explain @src/composer.rs "; + +fn apply_composer_file_chip(state: &mut AppState, width: u16) { resumed(state); - state.input.set_text(FILE_CHIP_PROMPT); + if width <= 40 { + state.input.set_text(FILE_CHIP_PROMPT_NARROW); + } else { + debug_assert!(FILE_CHIP_PROMPT.contains(FILE_CHIP_TOKEN)); + state.input.set_text(FILE_CHIP_PROMPT); + } } fn apply_undo_sheet(state: &mut AppState) { From 0a36d64d151072f145dee4269c6207367959a259 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:43:01 +0000 Subject: [PATCH 3/7] fix(tui): match lock_v2 consent/undo footers and narrow copy Use Enter:confirm Esc:cancel for local-tools consent and the undo sheet instead of Typed/Idle composer strips. Shorten 40x12 consent options and body, and paint the about-conversation behind the wide undo sheet. Co-authored-by: Mathis --- src/cortex-tui/src/lock_v2_parity.rs | 156 +++++++++++++----- src/cortex-tui/src/ui/chrome.rs | 133 ++++++++++++++- .../src/views/minimal_session/view.rs | 12 +- 3 files changed, 254 insertions(+), 47 deletions(-) diff --git a/src/cortex-tui/src/lock_v2_parity.rs b/src/cortex-tui/src/lock_v2_parity.rs index 5808e46f..ba93fc0c 100644 --- a/src/cortex-tui/src/lock_v2_parity.rs +++ b/src/cortex-tui/src/lock_v2_parity.rs @@ -7,7 +7,7 @@ use cortex_core::widgets::Message; use crate::app::AppState; use crate::interactive::builders::build_question_prompt; -use crate::lock_v2_scenes::{radios, resumed}; +use crate::lock_v2_scenes::{conversation, radios, resumed}; /// Residual parity boards (wide + narrow). pub const PARITY_IDS: &[&str] = &["consent-local-tools", "composer-file-chip", "undo-sheet"]; @@ -25,7 +25,7 @@ pub fn apply_parity_scene(id: &str, state: &mut AppState, width: u16) -> bool { } match id { "consent-local-tools" => { - apply_consent_local_tools(state); + apply_consent_local_tools(state, width); true } "composer-file-chip" => { @@ -33,43 +33,58 @@ pub fn apply_parity_scene(id: &str, state: &mut AppState, width: u16) -> bool { true } "undo-sheet" => { - apply_undo_sheet(state); + apply_undo_sheet(state, width); true } _ => false, } } -fn apply_consent_local_tools(state: &mut AppState) { +fn apply_consent_local_tools(state: &mut AppState, width: u16) { resumed(state); - state - .add_message(Message::user("fix the failing test in this repo").with_timestamp("10:18 AM")); - state.add_message( - Message::assistant( - "Run tools locally?\nTools run on This PC against the current working directory. Cloud is the default when unset.", - ) - .with_timestamp("10:18 AM") - .with_thought_secs(0.6), - ); + let narrow = width <= 40; + if !narrow { + state.add_message( + Message::user("fix the failing test in this repo").with_timestamp("10:18 AM"), + ); + state.add_message( + Message::assistant( + "Run tools locally?\nTools run on This PC against the current working directory. Cloud is the default when unset.", + ) + .with_timestamp("10:18 AM") + .with_thought_secs(0.6), + ); + } else { + state.add_message( + Message::assistant( + "Run tools locally?\nThis PC · current directory · Cloud is default", + ) + .with_timestamp("10:18 AM"), + ); + } + let rows: &[(&str, &str, &str)] = if narrow { + &[ + ("yes", "1 Yes — run tools here", ""), + ("always", "2 Always allow project", ""), + ("no", "3 No — keep using Cloud", ""), + ] + } else { + &[ + ( + "yes", + "1 Yes — run tools in this directory", + "This PC · current directory", + ), + ( + "always", + "2 Always allow for this project", + "remember this workspace", + ), + ("no", "3 No — keep using Cloud", "Cloud stays the default"), + ] + }; state.enter_interactive_mode( - build_question_prompt( - "Run tools locally?", - &[ - ( - "yes", - "1 Yes — run tools in this directory", - "This PC · current directory", - ), - ( - "always", - "2 Always allow for this project", - "remember this workspace", - ), - ("no", "3 No — keep using Cloud", "Cloud stays the default"), - ], - 0, - ) - .with_prompt_focus(), + build_question_prompt("Run tools locally?", rows, 0).with_prompt_focus(), ); } @@ -82,21 +97,32 @@ fn apply_composer_file_chip(state: &mut AppState, width: u16) { state.input.set_text(FILE_CHIP_PROMPT_NARROW); } else { debug_assert!(FILE_CHIP_PROMPT.contains(FILE_CHIP_TOKEN)); + state.add_message(Message::system("@ attaches files · ! enters Bash")); state.input.set_text(FILE_CHIP_PROMPT); } } -fn apply_undo_sheet(state: &mut AppState) { - resumed(state); - state.add_message( - Message::assistant( - "Undo\nUndo the last turn, redo it, or rewind this Cortex session to a checkpoint.", - ) - .with_timestamp("10:22 AM"), - ); +fn apply_undo_sheet(state: &mut AppState, width: u16) { + if width > 40 { + conversation(state); + state.add_message( + Message::assistant( + "Undo\nUndo the last turn, redo it, or rewind this Cortex session to a checkpoint.", + ) + .with_timestamp("10:22 AM"), + ); + } else { + resumed(state); + state.add_message(Message::assistant("Undo").with_timestamp("10:22 AM")); + } state.input.set_text("/undo"); - state.enter_interactive_mode(radios( - "Undo", + let rows: &[(&str, &str, &str)] = if width <= 40 { + &[ + ("undo", "1 Undo last turn", ""), + ("redo", "2 Redo", ""), + ("rewind", "3 Rewind…", ""), + ] + } else { &[ ("undo", "1 Undo last turn", "restore the last turn"), ("redo", "2 Redo", "re-apply the undone turn"), @@ -105,10 +131,9 @@ fn apply_undo_sheet(state: &mut AppState) { "3 Rewind to checkpoint", "pick a Cortex session checkpoint", ), - ], - 0, - None, - )); + ] + }; + state.enter_interactive_mode(radios("Undo", rows, 0, None)); } #[cfg(test)] @@ -208,6 +233,29 @@ mod tests { } } assert!(sel, "consent focused row must paint SELECTION_BG"); + assert!( + frame.plain.contains("confirm") && frame.plain.contains("cancel"), + "consent footer must be confirm/cancel, not Typed, at {width}x{height}:\n{}", + frame.plain + ); + assert!( + !frame.plain.contains("Shift+Tab") && !frame.plain.contains("Alt+Enter"), + "consent footer must not be the Typed composer strip:\n{}", + frame.plain + ); + if width <= 40 { + assert!( + frame.plain.contains("run tools here") + && !frame.plain.contains("in this directory"), + "narrow consent must use shortened option copy:\n{}", + frame.plain + ); + assert!( + !frame.plain.contains("current working directory"), + "narrow consent must not use the wide body:\n{}", + frame.plain + ); + } } } @@ -315,6 +363,24 @@ mod tests { } } assert!(sel, "undo-sheet focused row must paint SELECTION_BG"); + assert!( + frame.plain.contains("confirm") && frame.plain.contains("cancel"), + "undo-sheet footer must be confirm/cancel, not Typed, at {width}x{height}:\n{}", + frame.plain + ); + assert!( + !frame.plain.contains("Alt+Enter"), + "undo-sheet footer must not be the Typed composer strip:\n{}", + frame.plain + ); + if width >= 80 { + assert!( + frame.plain.contains("tell me about yourself") + || frame.plain.contains("Worked for"), + "wide undo-sheet must paint the conversation backdrop:\n{}", + frame.plain + ); + } } } diff --git a/src/cortex-tui/src/ui/chrome.rs b/src/cortex-tui/src/ui/chrome.rs index c5243863..82f7b84e 100644 --- a/src/cortex-tui/src/ui/chrome.rs +++ b/src/cortex-tui/src/ui/chrome.rs @@ -252,6 +252,12 @@ pub enum FooterSet { Unavailable, RateLimit, Palette, + /// Consent / question radios — confirm or cancel (not Typed, not exec Approval). + Prompt, + /// `/undo` `/redo` `/rewind` sheet. + UndoSheet, + /// Composer with an attached `@file` chip. + FileChip, } impl FooterSet { @@ -483,6 +489,88 @@ impl FooterSet { label: "shortcuts", }, ], + Self::Prompt => &[ + FooterHint { + key: "↑↓", + label: "select", + }, + FooterHint { + key: "Enter", + label: "confirm", + }, + FooterHint { + key: "Esc", + label: "cancel", + }, + ], + Self::UndoSheet => &[ + FooterHint { + key: "↑↓", + label: "select", + }, + FooterHint { + key: "Enter", + label: "confirm", + }, + FooterHint { + key: "Esc", + label: "cancel", + }, + ], + Self::FileChip => &[ + FooterHint { + key: "Enter", + label: "send", + }, + FooterHint { + key: "@", + label: "files", + }, + FooterHint { + key: "!", + label: "bash", + }, + ], + } + } + + /// Narrow strips drop ↑↓ / `!` so 40×12 matches designer lock footers. + pub fn hints_for(self, width: u16) -> &'static [FooterHint] { + if width >= 80 { + return self.hints(); + } + match self { + Self::Prompt => &[ + FooterHint { + key: "Enter", + label: "confirm", + }, + FooterHint { + key: "Esc", + label: "cancel", + }, + ], + Self::UndoSheet => &[ + FooterHint { + key: "Enter", + label: "confirm", + }, + FooterHint { + key: "Esc", + label: "cancel", + }, + ], + Self::FileChip => &[ + FooterHint { + key: "Enter", + label: "send", + }, + FooterHint { + key: "@", + label: "files", + }, + ], + _ => self.hints(), } } } @@ -494,7 +582,7 @@ pub fn paint_footer(area: Rect, buf: &mut Buffer, set: FooterSet, hovered: Optio } let wide = area.width >= 80; let sep = if wide { " | " } else { " | " }; - let hints = set.hints(); + let hints = set.hints_for(area.width); let mut x = area.x + 1; let y = area.y; for (i, hint) in hints.iter().enumerate() { @@ -722,4 +810,47 @@ mod tests { "goal chip uses designer accent" ); } + + #[test] + fn consent_and_undo_footers_are_confirm_cancel_not_typed_or_approval() { + for set in [FooterSet::Prompt, FooterSet::UndoSheet] { + for width in [120u16, 40u16] { + let hints = set.hints_for(width); + assert!( + hints + .iter() + .any(|h| h.key == "Enter" && h.label == "confirm"), + "{set:?} at {width} missing Enter:confirm" + ); + assert!( + hints.iter().any(|h| h.key == "Esc" && h.label == "cancel"), + "{set:?} at {width} missing Esc:cancel" + ); + assert!( + !hints.iter().any(|h| h.label == "send" + || h.label == "newline" + || h.label == "edit command" + || h.label == "mode"), + "{set:?} at {width} leaked Typed/Approval hints: {hints:?}" + ); + } + assert_eq!( + set.hints_for(40).len(), + 2, + "narrow {set:?} is Enter+Esc only" + ); + } + } + + #[test] + fn file_chip_footer_is_not_typed_strip() { + let wide = FooterSet::FileChip.hints_for(120); + assert!(wide.iter().any(|h| h.key == "Enter" && h.label == "send")); + assert!(wide.iter().any(|h| h.key == "@" && h.label == "files")); + assert!(wide.iter().any(|h| h.key == "!" && h.label == "bash")); + assert!(!wide.iter().any(|h| h.key == "Alt+Enter")); + let narrow = FooterSet::FileChip.hints_for(40); + assert!(!narrow.iter().any(|h| h.key == "!")); + assert!(!narrow.iter().any(|h| h.key == "Alt+Enter")); + } } diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index 20159dd0..7370dc33 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -751,6 +751,12 @@ impl<'a> MinimalSessionView<'a> { if title.contains("plugin") { return FooterSet::Plugins; } + if title.contains("run tools") || title.contains("locally") { + return FooterSet::Prompt; + } + if title == "undo" || title.starts_with("undo") { + return FooterSet::UndoSheet; + } if title.contains("resume") || title.contains("session") { return FooterSet::Resume; } @@ -770,7 +776,11 @@ impl<'a> MinimalSessionView<'a> { if self.app_state.autocomplete.visible { return FooterSet::Palette; } - if !self.app_state.input.text().is_empty() { + let typed = self.app_state.input.text(); + if typed.contains('@') && !self.app_state.is_interactive_mode() { + return FooterSet::FileChip; + } + if !typed.is_empty() { if area_is_narrow(width) { return FooterSet::TypedNarrow; } From 29cd901c8c8356ec7acacc347b9d17afe98ea711 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:47:00 +0000 Subject: [PATCH 4/7] test(tui): recapture COR-222/223/224 runtime lock_v2 pngs Re-render consent, @file chip, and undo sheet at both sizes after confirm/cancel footers, narrow consent copy, and undo backdrop. Co-authored-by: Mathis --- .../runtime/120x40/composer-file-chip.png | Bin 6323 -> 6384 bytes .../runtime/120x40/consent-local-tools.png | Bin 11024 -> 11013 bytes .../tui-lock-v2/runtime/120x40/undo-sheet.png | Bin 9048 -> 17556 bytes .../runtime/40x12/composer-file-chip.png | Bin 2706 -> 2607 bytes .../runtime/40x12/consent-local-tools.png | Bin 5215 -> 4332 bytes .../tui-lock-v2/runtime/40x12/undo-sheet.png | Bin 4899 -> 3097 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/media/tui-lock-v2/runtime/120x40/composer-file-chip.png b/docs/media/tui-lock-v2/runtime/120x40/composer-file-chip.png index 81645f14e8d919bfd2a3b72e6a0140ec14144285..4195ed48fd44ba31c549bf5684062fb66d621862 100644 GIT binary patch delta 3507 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/consent-local-tools.png b/docs/media/tui-lock-v2/runtime/120x40/consent-local-tools.png index 8a618051de2005dc8d7838f467595583ffa83b7d..546022a7f4327f11638e708e2b833cc2e0c7d1c3 100644 GIT binary patch literal 11013 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 Z+&gc#pmI0=1nsqFsAsBM_V@kA{|okq+7bW& literal 11024 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 diff --git a/docs/media/tui-lock-v2/runtime/120x40/undo-sheet.png b/docs/media/tui-lock-v2/runtime/120x40/undo-sheet.png index eedad9a9ad86997c9e3259db306f577fc89371e0..407116aaec100e266fbefc237d0a4691f88d4006 100644 GIT binary patch literal 17556 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 Q+!{#pvEC!(1N%SzAL+T)rvLx| literal 9048 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 diff --git a/docs/media/tui-lock-v2/runtime/40x12/composer-file-chip.png b/docs/media/tui-lock-v2/runtime/40x12/composer-file-chip.png index 9d2271f2495532cc43978fb8ed371ec10cdf12b1..d07d052b76fad3f4c046dcd4ceb7353740710c4a 100644 GIT binary patch delta 2357 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 bfIa#jN1xIXBS@R100000NkvXXu0mjfZH3Gf delta 2458 zcmV;L31#-L6p|H?BSi{XNklpp#d3x*5k|44FJ~b^m4xb@%DON zuo<)Yx^x48VNEc)8VpH;0qeT3S&|>rA`5mJJl3#;wZ)HU%s*wT1Bw_7E;B3JhH!0b zINpN{5w$QfNyRvNv*S7fa$`E0VCPTwy zqSPLQCIp&)6hlCS?de3r$rv=hv3T8#g#)D)oKG}l2D%E))5Sb1 zk6b$g86s?0Aem|>kMkHz2FEr_SUbZJ$q-@x(t^mX`P%8_JX`#&v?Bo#_&-&H+REQX zG-QS~>W7B*lat87>2=G%JAE}wP8xv{hD&b(7#PX8?3fOJh{1Sn#|0TH0A zjSZPQSz%`YJD4*z+w|84RyAt_d8pwt?96^L#PA5(_!^k>we}94pPwVQe1CtB-16=9 zd<}4?mvcW&3ukuiwf*A#wVf=oz5V0k9}P>H9L5$L0zW)F z+_XKA;~Gz@hQ*2ju@epR52J}?D;fWOe0Oz53B`Y~jpp zfW4YKL%d#Kt4cSTgl<)D1q}{Vg(s+LnIUs>SnS8FemJ`>8T;p8*&_QLtTS`JjmT`V z>C(aN!?87RIy$SuWyjVAqIqD0_%-^T>Nj|pk)y0_q0K{kK)%L|vwWvS8DvirT0c=7Gqx4>Gzhd9Rn zx`*GJftd)1>y`6DT;_h~-zluYy#&M!4VK&PDmLBK!Lm+%{tMvKtQq1))3inCE0~`Q z5#W=62=M7%9;(2~onFp|!{P1qylgXaTo2)}<)e@xvMZ;Tb8}hFSvJT1_Pfa86fuA6 zH&vKZ|3g{uzCC|B)5$&tlaclz-`ck1vYmcT=#!jg-&B98zKYpb*=ifLqlyf1p9XKy z+r4jhtmi=TThfkJ+Z|~(#$s*}*JxOkImDgoErF?vRtS3r%%6u2rGhw&FVJS4chqz}8PQ6FIRd?s{G5`J)=;xfi z%{(vLJ*_gtor{l&Wxrw(elu3QJsBVQ{5rlRhZ{5Ef@PZ}3Ez`Ro~yleZRGLR{?5rd z$q@Hx@DtoDtol;!*uwnR{r2sqtg7DmEqHU<;wko@d%?nXlZ)-(o+m?ug>5l#gze*d z*^{9GB!57@)64nva$dR>aPPhrukmuZ3@$$&kGB?&EV3a@)O&k9$86v4%yyro^;Nje z1zkHQvS(IRf9;ktn}3#W0HX$PEo1i^AYb_mv9Xf8V+W4MW5GDsoENbbIw}UlL4z0J z^%Cu`YL*19;mON8a*WxZ!fTI!0&557{=#Jwbbn&vWM5@YT=XmK@3*s~BK_RoApb0M zR<-{bDBfAs-}3FXJMDXG&8*NWhRl(vO1&XuIA-NUw1SUHj{hoEVOkrSzb}`|t(`w} zPev9Q+^oon^Pp^VDrSh`DgXX3u%FtDUHsuBXt44aoxA$!<=nZMw=<5MwfW-v>QG_C zoqzdQX6Ak#%k{<@7JrT+Yo0t_)?@A=b6fI-8ZH$M4S|A#SJBu89pR7of)~K88D-4G z#pEt>`ngC?_Q$g^MUu;gO@6LekBUR)V@tig6w&{f8teolpU^q``Rz455z8stsi(8V z=W6Aa%n*~sT#&b3wEbD|wGC}1Gqr&DB7gmdRQ<9!1Mv0tb6NLxyj!=5hbn0<|4Jy* zDb@a>NO+DZ?W3HZ7p&(MnZTI3y(Fif1L|d1?SR$);!xUt^N*LA&Gb;^5S^s7Cl<$& zluFTI@4tRzA0;|*6eIRD#uu3e-tGxTIa&Ed0Oe0RWq{I~Ic4_jQ`X*Vo%71fM30Syj|Bh#uo>uUn*#te zMQ2s~9PQamIj@2R0Ki#dpndmYa2j!1?ek;>H^A(^dO8dFdchQeTcS8(Z90U(hk-Oj zpfz{q_RcYqkMqqznCrV-K?!jR(q{GL&RjI$q;JKYKlQCVbNR2!pGC|FH{fvRpnLM< zjSp;=&+4&qeR%<(=;=A#pg3W7`A5^5{NPRwkHqsPH*2hZyv%LIyYe)oXOEY}eRRC+1qu&d&)(+g#L4-+rPy~^pS>ggv~dYvk`#nAUX>M z!eFbty^!!3aO;q z)GXXpiecsz`QQ6$cs1>fpCpb{@sv7}$(`t%Pp0aNM>iDf-x{bcz7Q@se%bZAvMp~# ze!0#aO~84R7f$2tod?ZDDOoJ5_+&?e>SRiJ>P+W(mK4`0Ey^yhAn_y}ewlN$N(o~N z^d6wGJ-!!HPx90l+nT$Gzi?H>Q!FqACa^%Pg8VFTH=OR7i5b$`tdfF5j~ z-nb8QSXppL-7Ib%vKqg;wWI6(z(fr=6e8_W>USdHvVwrs^Y>0}ey{50B-0weR*JVQ zeDIS?$yif|?n{3Sse+!roA})Np0V7`vvb~0gqZd)AquaI8owX+5|h$XQfAe&^Imv{ zO-<329F1{E<*R7@G-I8w->C|DXBOF^!}Ddy>_@)jwMkW-ygkdFXGd$>3dH=<&!a!x zqgBQ<#RRM~nTSrE2qd;(bmRCb`Jis#XhTED&l~b)UZfq_j0(C-0hc8w7q-h#f|&@R zNK15_*hzvFYb*G?;+t$e1ND$$|Na&z@^c5qjD9DQW8|#?Gn+m>M^(VWNOX%5fYM2GHOdde}Tr7Zt zR-{2IhX9(rF;!x9T)S>My9CbYt%du#fwUuH3KUwL6`^BNsubxh_-rZVkUwT4Qen=r`D)-82{Xft1qbJq}?SkR2sqr-fASuNjO_}!P zluACL!gvsaQJoagX>5Fkci}j;OSW-~?ouKbC-syNeteQi6?Z@b#U99N7A4Isn&wN= zT4n`d$?{v8)We|MycWm?D`Qf7E1;@5vX-ZUjLQh%8a+*yt$=6GUu35wp$9ibi1r@T zXjje=Y&Q`EbdKwk&<)OQ)e=e57m)9jGGFzD+$eQ!S}&JLwZJVvT5PlFTd2nyv*;E% zu+)bWTd0&Yzwg!E{iM-qc;kUm0UX|ZWA)ZU6E)3zOTV(6J!T^^X!h|!AMm0k>UjT8 zj0RZJcmrj!PAPqv?_VGdmH5JpNvoOZ@tlg>S^0gzR@l+jVdX?N|K0NDSWMuGIF~|8 zi1-wBy~|FfXyi?u=ryd`pDluDWjek<#4BSEuZcCMT@d9{s_Z|0*u*eZZfBYM8=f;g zp}H#L9TZU_wqfx8rCCLwo_;)&0N2-Y^DkD5gT9`^LiPCrhJ8QR5z2)^CpZ0lUO9fu zsc}!#xG@wGv(q-@VR0kw=>ro;nTIQT`+29x!R_ZZ5!z>g{UYMrrjXFzk^=xV+&v?@ zG(CV&?+VazySM(=8Ob?rZJDD%%G_f)n>^`0q3vxDYu`aqYsU9{aZmE3H_PeoZlQ=` zzSrHzAnK<&rm{)mhl6SjDO8F$@62b47dcrp!D@oOWyuFQv8DOvecLqAU^F!Ux+eJ( z6BsLX6^1W;GH96K9)G_T`nfsiqt(2Dyn_1l3(B}QRBV?7f)$Py)J1vz^aW`>%1GnS zhoUf6e%THR55Gbo(k2>D4vj6>co$Y>efBi#!orLsg~5{8E1;D7VZ^QZ3;y3;p3gK+ zY3WTv0}g0Uyg|ODEndpwji_0n2CE^*|(~hhSrK{l{D|xE5%{4+w z+o;-Wbqn%1aTGRqV+hQ#lV%qc6oiwd0}jsFuDn<;ht-sXc|)JYvEIKG8o(izw*95D zIRHDEBtSB?p!;vA0RUfp0j8DV-zQmyOIJ&qx(jNj>R*+BEq*RxXFD7Lc_TS!GWY!o z`Bdl?#)y?&R6t=zHMOhGIa7xXvcDz=Ff&MX#Y)24*W({y%wjqkmz3h~1&s$IguSvF ze5tn_?Q8cvd{X=u)_A-;*r0>i} z(RxoH-x~%82G%)YxU}5P5nYzoJ*j@W(>P#GzTGeuRmuyObp?DZE)0`dUb{m(53zC5 zO_KCJ&N#^r%_7vA9W#{Hq8`>PHs2kss{cuJJ6yb^R9e&uX|+BUdl z^Ga~&h_f8YufV~DjU#9$K(vzHvwK89Le90n8iCO}tZC4(o|p~vmk2Z7mHR%SK6w-V zorix`hEwJ;HJ;x=QnPsJb=qZb+#ESvXFAkG>Gl^OKSY^ZT+`AoVs z%kQ-YWfx#gGLO()1I>kx-(SG7K->8&y6R*Fc1lkUqZpe7UC1|*LRwD;FD zcR1+{4m-T0y1GZ6y}o+9yF(P11BZvC=D5%Ic&o$f_L1wNar^}8>B$j?AXs~Zx8sta zNYXG{?AFhscRABz&mHE1$TMCkf*sG^04;{Q^1A^RGLe;mF}xT8__rE9CIheqC3v?1jzQfWNY zEThE*>HRwXAyqMFbJW9)!iFIjN_8x>CxX56e>5!dCOG^RB8jWYFWEm5YvT8n-C%cthcjO<(rbj3c^v|-sMq$-KKy4&e!Pd z_)9j0OPyH<-Th6?B4UNgZG(X(V@DM0m-Jv;h%D1Uaku?W%~2TgTSuWwUu@Wp?h$TO zC4XQQj2CxFPA>}y&^B=)N2qX^tHBb|II^sr*F{ggrB$KhN%)bFVr+9g#k8wH`F`Wc z(Zk%^gI1|B{E_;`Oq2bo59rd1e=;Xuj~_8P0`Az9-^GRsjL;LOBg5IJ)n90XV7Su&0V$?n{p11$O zX)wE20f-#Pon^VvHo2XS&)=a&?v*!gS_)5+M`!W)0L_nLf8m(0~b0;{S z;ci=HM^HpN2Kihv3G=(l8e!x@q0bLaQXxrMvx#xjEu5uVOz+qy3f0^&4A_R9P+#gT zX*v)>rWy()ppU;i@$1lG7bvpAB|k~MqU0~#@^tzIhHLVu)GD*T!9t^H)`(IvN4#C5X~XpJ!MLT77xOYs|% zT+>8vs&%G{B|cs3vRb202I~brHK)0AYVH2x|HohdzIUgN0Gl}@A~mZ{UvNE->{ej4 zGzwJ<#mfj(>Qh&Q*Ct2t2SaBzZJDF!$~S$^#h$zF;Z-~Mvrp+Sodecqo6pyD$Lw~0 z%1Qos6Wtc%6lpXZQQ`KZBv4ao6&-CFy%-2KeKg=4ZB(QwFpf(%bx?mxvH+sns4{(W zuU>E6U}7=g9MkhuFy`}L4eXQRWpoI@jyl=)JWcG5mKJ!rXc2mV6VJAM5*^q#etu`- z;7;h<3`^EneB!}Sh$|6MYXYu0{S(la6Qy^!s~BMWSRF3EI5t78lHI;#$=suW%=kc7 zpVo`~fULSq>r{T|?Wwl<`|enEw|ZbLba1@#hq{&5th& zjQ9L`++;20V8^$<@Yyh>p|db2PD(}*%%mCKun12edDxz6m8h7! zfTrwhi87o!lhkl4m;wM-MIPzhH4Dky{;3f?r#u?DNb0k?(9kW8d}dhQ#@~A66d0`< zC6Cu^Js--58dCl(m>jevbN${PZIlBI=+Lpn=qB(HfNpw%{)54s&zaT#d&nk2VJd*u zIvh?50S}{)N6NVek7pWb082G?RdKOj+*++q>ZqOkk{=Ljm6jp1X48LqYiN)O|(nC&lJvRc-w51 zln=+^nA4*!UDItp8G0Sy*H9#;K4#Ireoyzvg}7e4f)3S-Ww@SuebUk=?O97!#R8rM za6ib3xvL&Tvf*I zMW;4^skzP2I{!s)>BP!>#}`Ko;_(K+-j_4|8<<$t*ntAK5OmwaJ`-flp=3a7utDAJY2nYxyJ@CVA=B?Fy-mTmKmD=oA>eVU^U?biR)*MZ?F+`!q~*Fe>s10dHI88WF z-QD_u1xp+k6lGLL*+xnyI(j%bc+&#Y4`T9s9!Zn_VmSaybm}Ic*FVS(&Af0+1_Ts(o;)k<0@G&i;RRYvxqW*0-rmtMQ_JdKdNw<2 zpC-~2_b9~P4E;N~xHUXz1fKs!<7eKS2tAPL&E*E`X>t1k)GZnrM_~FUCN{9-*zn4^ zuDLvtj0rs-P|XQZdA{_hbxXzxJM1S?B}gVXN)=GIm4cDR0Y9XW=F_2<%XsCki(kkX zF%Ti&7K2vX{@^8h$M*{7G^5hZE;;ge_9RT#H-QCyId?FZ^ZRhCwA%QmVdJ=$+^f)v z0+!vP?wKYpGI7R3>=tt_{h48{1$PxX9;--5nO3-)`=!T82e-pUKI3A%r7uJmUD@gC zV`Fl;9e89Wn$KHpvGUE=H<|r#MWKP_UoMN3;NJNI1sJc^&POnv>{19Vt|_vUfpLHz zmuM~l%+F%l@)8@3-92r(NcR7yAVs5he3>X(vW3T^LcoBYKWjN~mtvz>27tu58-OB) zI6&Er>*rcGuq4n4v0H$0Do&{K0()-~`WK%MK7D&~F)_=rcSM|ziSvy{w)LQO&`g5# zts@0^g|%y3w^1@C#`TU1KwPYs?evHM|LIeEN?mJdHh7O|YTDBMtWlP$t*B9I)@cl@ z_87p`mF)@!rk2$`MD6SBa!~;)w`WbF91GOAgi$A$ECWxZ- zx68=RYbY;}2iShy9iy^GRLWM>DU1n-Wh74u?rEJ;ONHe(&aO%hifRJw+pS~=E(f|- z&RNiFSQ%%<%jxe#Kql@qcg`wvf$Kys#+_1z;eT})3vh(D0CQ2jG_|++X4$bBjf?&Q z(1Cvb3)J%^r<)ALykJ`S2L-9=m?-F+q+EsB-mjA1LyTj4D7q4H}uYZ2(CoK0k zhaCZ|iza0v-Zi>->^)w4XA|I$0TIkd8^9=kc>LxzS8$B-CRk}at0!6HyqS?e+rG55j}2jdxlJhfLRL`%)U#(50J{z?Oy-6^@;JdOHJPGdDk?7O zv;6{%)6eQh!q5xneV`cRO6a`%aRdop-2%FUHtDIXebE}{eiq_)MW6h{25%v`36fa1 ziIdAot9L(En5U!^6%7&Re(cAhKs&)GTUg%K;mmMmGK>?BNuGD+my)}Bzt1Y8%IwGL z`9B`kDHA|#`NX}crt2I4#xqnZ${*5qfK#z>nh?WfsG^WA z-9K?%b`YX2*&_MNdDJEKMd)cr=;<#|C`ksimH3Jj(ZcD~JTES)P}nNh8#*2ie|urX zl2BeUKA*HHDWaw;t^^))bVm4*wl`nx61sypc9AJn5nElv_?;Kc3N%$C+ihF;LidXv zN!{&-2G!mX>7rtUk?WK@PqTwEimNjoW!QezH?PCOdiZW`j1URytGxIh?v&-`hEE&g zT)(Gu7G-qWlS6MRLZ;Lk%y2^WD*MG6%HSy>)jIITAbI9tmU4Y@U-5xufH|}`)gW2e zGtrKF@%#Mc)m#a$OR|K$scL@tdBVZxX5zl(5EgB$2=!csY#kyXomHa|RHbYwBpU%Y%zm zS77ddayySYY=PE9j*(S6#;e2T!ya4ht_L#1s%ujY9$KOaPV)1RUc$>NU_M{U2#K-&-q?ilip4#OhgEA@~-Ih%{+&5 zcGfn?O*~}3bBuUl(w-PU@}ANzam};sttu!|&LF(k7c$12PPw6>2h9xmCq~aUV`KuEQl3znCI)y45D zHk62wB%`AfO)oD`p5%v06HbP zg7a5c;gk56j!%*1y~|@`=2pn8YL|s)NfofX^rg=zSteUqHw~6IQvT+u0~TEecC$sw zSgw>|a=@!)ZgriVceCivt2$i8D@8q1MD}7xg(j}~QZc1wzB!_2@4iN7Q7F>^u~ePa zs){Bbl~R3oUc7(Q;cmo!PkNqo;h>Zi8Eugvm8&qt?gch>H!h8s#AwtHw&nH@HMpwo zt%!BNY>(71491z_le0qoFXIt1^OJ#a{KkUhqFvQAq2?wLkvNi?733@Tojr4{<4Kh0 zm>sFnE$VMkYd$H~PSv>rZ_nYYZt1JVxb63HzJ3#po%UAZULYAiCVI&8NzAd7nS~)2k>OXc)IR7D^W)!kw8<>K|^=(xSDPe z=jZ!emM9&cI{r&N@~#Pmb-B z_XvRBO8(k(0O&_xI{so4K6pEO$b`dId^q8wHJ#mkY%iN<6U&uW(}I(l3@p|HkDPCT zTa<_yS&O3=wb2U2hk3a1K7Qt_$1xHE&= z|2TOQ87Gdzfm*)M#mWyV>Af9$bS^}?JAN*Q!ddG?gjJ!NVu1ZK9sz7F ze9>kRyyB2%mLnL5DHBZd#{qj%(0Z5u*w4!LO4!eX@e8OCQ6)MHF#w}eQaqy5o)mim_-AvkMZo;LEod1NY#%4s8O*)?`nmqtz~a^I*m0F2-N2le~P zEl-Pm9@VV{Zr1*ESzgcP4gL=jEzY@4>% zi!S~_4@u1zmMR7vaWpQbii`Sht1@&?UkcSHjdI5V$fFkU)O9zDc z+MjN+hj4MoT8F0To!BNv^N`FKnZlLrK!?*RIssMu3Qd8zd(F1P?4Vg(uST>=5>>++ zgcv@Hy`$Yu%ed4A70^TG2dlfJx#V%7Ya>Qpyr%iNV&C%=Dz^yvMmhTuSQfE~R|6d# zOk8VuN{0Fi`0gZuWxb0#@>(zbrKfE}@db$Pu{mE5$iws>0l&;RfI_Mh)%OV8Q} zXA@TpxKH$at8-Qt|4yY)`6XvgZumyn7?{@CoVZ6>y>ugei;^k{r;zPs41TR-K(!9G z%Lhk;q^Xm2$1_rJol`#=E`9?SUtNnLv`G$veA+^Bh#Lcbl2fKK!7hu!^LpCXJ z!;dqe2!FRBpnA~VmrkOGD#`cB+r7-~6go%*#|f zI`lgaFZg1|us({O3(1Ef?*-C%GUY;i4y<8$c3`~7$b=0GpGx1Gi9t4BE!}qF@>K)= z_y?fw{V!b?4izto$Nx1Od_wGpgBMAAlJL+|hUSgDqqu-s8!PIT=8`fFak1i7{Vgf| zyork%G6HSmAD~*oAR=Je^6X)9az#M`5rx2ah?n zIE4+9p6(}HM#tTkSd<~7C=&s9!X)bL!0AmbacFrbe*1SXH^nsb5*I(=4mxT}@vqaI zXFp{w$S~)oWGZwlfPV)6FdL9-2A zls^yfC3vH=HZnoQDB)4}?FYtOri9bW+iO(TfIe6rB(|E>vRi;9Wx{iQJ|CYcxTAZ& z%~dRDbTj9P`lJtE{pP_p$kscV^An9fi|WIj)?F!bZy*_la_5zng;nhXsh1KaGpwWR z187c}GzXTL|+2 diff --git a/docs/media/tui-lock-v2/runtime/40x12/undo-sheet.png b/docs/media/tui-lock-v2/runtime/40x12/undo-sheet.png index 81928119c8e6b817d78890b099ab92123310867b..99c5a9a6768fdaf20caaf74eaa7e7d4d7af9926b 100644 GIT binary patch delta 2954 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 AB>(^b literal 4899 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 From 902b9bb41b0d5d16964ced1a8ef26922f2334826 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 16:58:13 +0000 Subject: [PATCH 5/7] test(tui): validate --only ids and require file-chip accent Reject unknown, repeated, and empty --only scene lists before writing frames. Assert composer file-chip paints ACCENT on @, not just text. Co-authored-by: Mathis --- .../src/bin/generate_tui_lock_screenshots.rs | 19 +++++-- src/cortex-tui/src/lock_v2.rs | 53 +++++++++++++++++++ src/cortex-tui/src/lock_v2_parity.rs | 2 +- 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/src/cortex-tui/src/bin/generate_tui_lock_screenshots.rs b/src/cortex-tui/src/bin/generate_tui_lock_screenshots.rs index c4db9517..4ddebc7a 100644 --- a/src/cortex-tui/src/bin/generate_tui_lock_screenshots.rs +++ b/src/cortex-tui/src/bin/generate_tui_lock_screenshots.rs @@ -10,7 +10,7 @@ use std::path::PathBuf; use std::process; use cortex_tui::lock_proof::write_lock_frames; -use cortex_tui::lock_v2::write_lock_v2_frames; +use cortex_tui::lock_v2::{validate_lock_v2_only_ids, write_lock_v2_frames}; fn print_help() { println!( @@ -37,6 +37,7 @@ fn main() { let mut width: u16 = 120; let mut height: u16 = 40; let mut v2 = false; + let mut only_flag = false; let mut only: Vec = Vec::new(); let mut i = 1; @@ -71,6 +72,7 @@ fn main() { v2 = true; } "--only" => { + only_flag = true; i += 1; let raw = args.get(i).cloned().unwrap_or_else(|| { eprintln!("Missing value for --only"); @@ -92,12 +94,21 @@ fn main() { i += 1; } + if only_flag && !v2 { + eprintln!("--only requires --v2"); + process::exit(1); + } + let result = if v2 { - if only.is_empty() { - write_lock_v2_frames(width, height, &output) - } else { + if only_flag { let ids: Vec<&str> = only.iter().map(String::as_str).collect(); + if let Err(err) = validate_lock_v2_only_ids(&ids, width) { + eprintln!("{err:#}"); + process::exit(1); + } cortex_tui::lock_v2::write_lock_v2_id_frames(&ids, width, height, &output) + } else { + write_lock_v2_frames(width, height, &output) } } else { write_lock_frames(width, height, &output) diff --git a/src/cortex-tui/src/lock_v2.rs b/src/cortex-tui/src/lock_v2.rs index 0094973b..9d5061cf 100644 --- a/src/cortex-tui/src/lock_v2.rs +++ b/src/cortex-tui/src/lock_v2.rs @@ -7,6 +7,7 @@ use anyhow::{Context, Result}; use cortex_tui_capture::{CaptureConfig, MockTerminal, StyleRendering}; use ratatui::widgets::Clear; use serde::Serialize; +use std::collections::HashSet; use std::path::{Path, PathBuf}; use crate::lock_proof::{LOCK_SPLASH_VERSION, LockFrame}; @@ -36,6 +37,24 @@ pub fn write_lock_v2_frames(width: u16, height: u16, output_dir: &Path) -> Resul write_lock_v2_id_frames(lock_v2_scene_ids(width), width, height, output_dir) } +/// Reject empty, unknown, or repeated `--only` scene ids before any writes. +pub fn validate_lock_v2_only_ids(ids: &[&str], width: u16) -> Result<()> { + if ids.is_empty() { + anyhow::bail!("--only requires at least one scene id"); + } + let known = lock_v2_scene_ids(width); + let mut seen = HashSet::new(); + for id in ids { + if !known.contains(id) { + anyhow::bail!("unknown lock v2 scene id `{id}`"); + } + if !seen.insert(*id) { + anyhow::bail!("repeated lock v2 scene id `{id}`"); + } + } + Ok(()) +} + /// Write a subset of lock v2 scenes (used to recapture residual boards). pub fn write_lock_v2_id_frames( ids: &[&str], @@ -43,6 +62,7 @@ pub fn write_lock_v2_id_frames( height: u16, output_dir: &Path, ) -> Result { + validate_lock_v2_only_ids(ids, width)?; std::fs::create_dir_all(output_dir) .with_context(|| format!("create {}", output_dir.display()))?; let mut manifest_frames = Vec::new(); @@ -142,6 +162,39 @@ mod tests { assert_eq!(LOCK_V2_NARROW_IDS.len(), 41); } + #[test] + fn only_ids_reject_unknown_repeated_and_empty() { + assert!(validate_lock_v2_only_ids(&["welcome-cortex"], 120).is_ok()); + let unknown = validate_lock_v2_only_ids(&["welcome-cortex", "unknown-scene"], 120) + .expect_err("unknown"); + assert!(unknown.to_string().contains("unknown"), "{unknown}"); + let repeated = validate_lock_v2_only_ids(&["welcome-cortex", "welcome-cortex"], 120) + .expect_err("repeated"); + assert!(repeated.to_string().contains("repeated"), "{repeated}"); + let empty = validate_lock_v2_only_ids(&[], 120).expect_err("empty"); + assert!(empty.to_string().contains("at least one"), "{empty}"); + let wide_only_at_narrow = + validate_lock_v2_only_ids(&["session-thought"], 40).expect_err("wide-only at 40"); + assert!( + wide_only_at_narrow.to_string().contains("unknown"), + "{wide_only_at_narrow}" + ); + } + + #[test] + fn write_lock_v2_id_frames_does_not_write_on_invalid_ids() { + let dir = std::env::temp_dir().join(format!("cortex-lock-only-{}", std::process::id())); + let _ = std::fs::remove_dir_all(&dir); + let err = write_lock_v2_id_frames(&["welcome-cortex", "unknown-scene"], 120, 40, &dir) + .expect_err("invalid ids"); + assert!(err.to_string().contains("unknown"), "{err}"); + assert!( + !dir.join("welcome-cortex.ans").exists(), + "must not write a partial capture set" + ); + assert!(!dir.join("manifest.json").exists()); + } + #[test] fn lock_v2_wide_frames_are_unique() { assert_unique_frames(120, 40, LOCK_V2_WIDE_IDS); diff --git a/src/cortex-tui/src/lock_v2_parity.rs b/src/cortex-tui/src/lock_v2_parity.rs index ba93fc0c..aa534b82 100644 --- a/src/cortex-tui/src/lock_v2_parity.rs +++ b/src/cortex-tui/src/lock_v2_parity.rs @@ -308,7 +308,7 @@ mod tests { } } assert!( - accent_at || frame.plain.contains(FILE_CHIP_TOKEN) || frame.plain.contains('@'), + accent_at, "file-chip should paint accent on the @ token at {width}x{height}" ); } From c3e24c473b9fcd02b56514b56c28751996475a53 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 17:09:02 +0000 Subject: [PATCH 6/7] fix(tui): keep typed footer until a completed @path chip File-chip hints now require a whitespace-delimited @path, so emails and a bare trailing @ keep Enter/newline/mode instead of @:files. Co-authored-by: Mathis --- .../src/views/minimal_session/tests.rs | 35 +++++++++++++++++++ .../src/views/minimal_session/view.rs | 35 ++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/cortex-tui/src/views/minimal_session/tests.rs b/src/cortex-tui/src/views/minimal_session/tests.rs index 4b6df329..8ec26dce 100644 --- a/src/cortex-tui/src/views/minimal_session/tests.rs +++ b/src/cortex-tui/src/views/minimal_session/tests.rs @@ -211,6 +211,41 @@ mod harness_snapshots { assert!(!wide.trim().is_empty()); } + #[test] + fn ordinary_at_text_keeps_typed_footer() { + let mut email = AppState::default(); + email.input.set_text("contact me@example.com"); + let email_text = render(&email, 120, 40); + assert!( + email_text.contains("Alt+Enter") || email_text.contains("newline"), + "email must keep typed composer hints:\n{email_text}" + ); + assert!( + !email_text.contains("@:files") && !email_text.contains("@: files"), + "email must not open file-chip footer:\n{email_text}" + ); + + let mut bare = AppState::default(); + bare.input.set_text("please inspect @"); + let bare_text = render(&bare, 120, 40); + assert!( + bare_text.contains("Alt+Enter") || bare_text.contains("newline"), + "incomplete @ must keep typed composer hints:\n{bare_text}" + ); + assert!( + !bare_text.contains("@:files"), + "incomplete @ must not open file-chip footer:\n{bare_text}" + ); + + let mut chip = AppState::default(); + chip.input.set_text("explain @src/composer.rs "); + let chip_text = render(&chip, 120, 40); + assert!( + chip_text.contains("@:files"), + "completed @path must use file-chip footer:\n{chip_text}" + ); + } + #[test] fn autocomplete_selected_row_is_banner_green_on_the_gray_bar() { use cortex_core::style::{ACCENT, SELECTION_BG, TEXT, TEXT_DIM}; diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index 7370dc33..1afe8222 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -777,7 +777,7 @@ impl<'a> MinimalSessionView<'a> { return FooterSet::Palette; } let typed = self.app_state.input.text(); - if typed.contains('@') && !self.app_state.is_interactive_mode() { + if composer_has_completed_file_chip(&typed) && !self.app_state.is_interactive_mode() { return FooterSet::FileChip; } if !typed.is_empty() { @@ -840,6 +840,15 @@ fn composer_char_accent(chars: &[char], index: usize) -> bool { false } +/// True when the composer holds a completed `@path` chip, not an email or a bare `@`. +fn composer_has_completed_file_chip(text: &str) -> bool { + let chars: Vec = text.chars().collect(); + chars + .iter() + .enumerate() + .any(|(i, ch)| *ch == '@' && composer_char_accent(&chars, i)) +} + fn composer_display_text(state: &AppState) -> String { if let Some(istate) = state.get_interactive_state() { let title = istate.title.to_ascii_lowercase(); @@ -856,3 +865,27 @@ fn composer_display_text(state: &AppState) -> String { } state.input.text() } + +#[cfg(test)] +mod file_chip_footer_tests { + use super::*; + + #[test] + fn completed_at_path_is_a_file_chip() { + assert!(composer_has_completed_file_chip( + "explain @src/cortex-tui/src/composer.rs " + )); + assert!(composer_has_completed_file_chip( + "explain @src/composer.rs " + )); + assert!(composer_has_completed_file_chip("@src/foo.rs")); + } + + #[test] + fn email_and_bare_at_are_not_file_chips() { + assert!(!composer_has_completed_file_chip("contact me@example.com")); + assert!(!composer_has_completed_file_chip("please inspect @")); + assert!(!composer_has_completed_file_chip("@")); + assert!(!composer_has_completed_file_chip("hello world")); + } +} From 338dc39a190f9662f4fda84a3190ba4b478f4679 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 17:10:48 +0000 Subject: [PATCH 7/7] fix(tui): exclude trailing-slash @mentions from file-chip footer Emails already skip FileChip because @ is not a token start. Also treat @src/ as still typing so unfinished mentions keep typed hints. Co-authored-by: Mathis --- .../src/views/minimal_session/tests.rs | 16 ++++++++++++ .../src/views/minimal_session/view.rs | 26 +++++++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/cortex-tui/src/views/minimal_session/tests.rs b/src/cortex-tui/src/views/minimal_session/tests.rs index 8ec26dce..eecb8512 100644 --- a/src/cortex-tui/src/views/minimal_session/tests.rs +++ b/src/cortex-tui/src/views/minimal_session/tests.rs @@ -225,6 +225,14 @@ mod harness_snapshots { "email must not open file-chip footer:\n{email_text}" ); + let mut ada = AppState::default(); + ada.input.set_text("ada@example.com"); + let ada_text = render(&ada, 120, 40); + assert!( + !ada_text.contains("@:files"), + "solo email must not open file-chip footer:\n{ada_text}" + ); + let mut bare = AppState::default(); bare.input.set_text("please inspect @"); let bare_text = render(&bare, 120, 40); @@ -237,6 +245,14 @@ mod harness_snapshots { "incomplete @ must not open file-chip footer:\n{bare_text}" ); + let mut unfinished = AppState::default(); + unfinished.input.set_text("please inspect @src/"); + let unfinished_text = render(&unfinished, 120, 40); + assert!( + !unfinished_text.contains("@:files"), + "trailing-slash mention must not open file-chip footer:\n{unfinished_text}" + ); + let mut chip = AppState::default(); chip.input.set_text("explain @src/composer.rs "); let chip_text = render(&chip, 120, 40); diff --git a/src/cortex-tui/src/views/minimal_session/view.rs b/src/cortex-tui/src/views/minimal_session/view.rs index 1afe8222..6096f7e4 100644 --- a/src/cortex-tui/src/views/minimal_session/view.rs +++ b/src/cortex-tui/src/views/minimal_session/view.rs @@ -840,13 +840,27 @@ fn composer_char_accent(chars: &[char], index: usize) -> bool { false } -/// True when the composer holds a completed `@path` chip, not an email or a bare `@`. +/// True when the composer holds a completed `@path` chip, not an email, a +/// bare `@`, or an unfinished mention that still ends in `/`. fn composer_has_completed_file_chip(text: &str) -> bool { let chars: Vec = text.chars().collect(); - chars - .iter() - .enumerate() - .any(|(i, ch)| *ch == '@' && composer_char_accent(&chars, i)) + let mut i = 0; + while i < chars.len() { + let at_token = chars[i] == '@' && (i == 0 || chars[i - 1].is_whitespace()); + if at_token { + let start = i; + i += 1; + while i < chars.len() && !chars[i].is_whitespace() { + i += 1; + } + if i > start + 1 && chars[i - 1] != '/' { + return true; + } + } else { + i += 1; + } + } + false } fn composer_display_text(state: &AppState) -> String { @@ -884,7 +898,9 @@ mod file_chip_footer_tests { #[test] fn email_and_bare_at_are_not_file_chips() { assert!(!composer_has_completed_file_chip("contact me@example.com")); + assert!(!composer_has_completed_file_chip("ada@example.com")); assert!(!composer_has_completed_file_chip("please inspect @")); + assert!(!composer_has_completed_file_chip("please inspect @src/")); assert!(!composer_has_completed_file_chip("@")); assert!(!composer_has_completed_file_chip("hello world")); }