14. Оверлеи и popup'ы
TUI AstraCode использует несколько типов оверлеев — полноэкранные модальные окна, которые перекрывают основной чат и обрабатываются специальными pager'ами.
Общая инфраструктура — astracode-rs/tui/src/pager_overlay.rs (Overlay, StaticOverlay, TranscriptOverlay).
1. Pager-оверлей: общие черты
Pager — это прокручиваемый просмотрщик контента в стиле less:
- Заголовок сверху (название оверлея).
- Прокручиваемая область посередине.
- Подсказки клавиш снизу (локализованные).
Управление (см. также 12-keymap.md)
| Клавиша | Действие |
|---|---|
↑ / ↓ |
Прокрутка строкой |
pgup / pgdn |
Прокрутка страницей |
g / G |
К началу / концу |
q / esc |
Закрыть |
/ (если поддерживается) |
Поиск |
Локализация подсказок
В EN-режиме внизу:
↑↓ to scroll • PgUp/PgDn to page • g/G to jump • q to close
В RU:
↑↓ прокрутить • PgUp/PgDn листать • g/G к началу/концу • q закрыть
2. /diff
/diff
Полноэкранный pager с git diff рабочей директории (включая untracked-файлы — добавляются с git add -N фантомно).
Особенности:
- Подсветка синтаксиса diff (зелёные/красные строки).
- Файлы можно сворачивать (Enter на header'е файла).
- Показывает binary-файлы как (binary file).
Реализация — обработчик SlashCommand::Diff в tui/src/chatwidget/slash_dispatch.rs.
3. /review
/review # открывает всплывающее окно выбора режима /review с фокусом на безопасность # любой текст после /review — это свободная инструкция /review проверь только тесты # текст передаётся как есть в ReviewTarget::Custom
/reviewбез аргументов открывает всплывающее окно (меню выбора режима ревью) —open_review_popup()вtui/src/chatwidget/slash_dispatch.rs. Любой текст после/reviewне является фиксированным флагом — он целиком уходит вReviewTarget::Custom { instructions }как свободная инструкция ревьюеру, минуя меню.
После выбора режима (или при передаче свободной инструкции) запускается агент-ревьюер, который анализирует diff и пишет отчёт. Отчёт открывается в pager-оверлее:
- Title: Code Review — <branch> · <commit short>
- Тело: markdown с секциями (Critical / Important / Suggestions).
- Каждая находка имеет ссылку на файл и строку (clickable в IDE-режиме).
Параметры:
review_model = "claude-sonnet-4-6" # дешевле/умнее основной модели
Связано со скиллами:
- code-review
- code-review-breaking-changes
- code-review-change-size
- code-review-context
- code-review-testing
(если установлены — см. 05-skills.md).
4. /help
/help # обзор всех команд /help cd # подробно про /cd /help goal # подробно про /goal
Pager с обзорной страницей или per-command-страницей.
Структура per-command:
# /<command> <краткое описание> ## USAGE /<command> [args] ## DETAILS <подробный текст> ## NOTES <особенности, edge cases> ## SEE ALSO <ссылки на связанные команды>
Контент — в модуле tui/src/help_text.rs. Полностью локализован EN/RU.
Если введена несуществующая команда (/help fokybar) — показывается страница «команда не найдена» с предложением /help для обзора.
5. Transcript overlay
TranscriptOverlay — специальный pager для просмотра полной истории треда (не только видимой в чате).
Открывается через /status → "Show full transcript" или горячей клавишей ctrl-t (назначена по умолчанию — действие app.open_transcript, см. tui/src/keymap.rs). Переопределить можно в app keymap'е через /keymap (см. 12-keymap.md).
Особенности: - Показывает все turn'ы с timestamp'ами. - Tool-вызовы развёрнуты. - Reasoning (extended thinking) показывается отдельным блоком.
6. Popup автодополнения
Popup'ы появляются над composer'ом при вводе:
Slash-command popup
Триггер: / в начале composer.
Показывает фильтрованный список доступных команд с описаниями (локализованными).
Меню выбора файлов (@)
Триггер: @<prefix> в composer.
Показывает файлы в проекте, отфильтрованные по prefix. Использует file-search крейт (быстрый fuzzy match).
Меню выбора скиллов ($)
Триггер: $<prefix> в composer.
Показывает установленные скиллы. При выборе подставляет default_prompt из agents/astracode.yaml.
/cd popup
Триггер: после /cd в composer (или Tab на этой команде).
Показывает подкаталоги текущей cwd, фильтрует по prefix. Tab — завершить выбранным, повторный Tab — спуститься в подкаталог.
Реализация — bottom_pane/file_search_popup.rs (переиспользуется для /cd).
/goal args popup
Триггер: после /goal в composer.
Показывает подкоманды (edit/resume/pause/clear/budget) + echo-row с введённым текстом.
Реализация — bottom_pane/goal_args_popup.rs.
7. Меню выбора модели
/model
Открывает не pager, а полноэкранный список (наследник list-контекста keymap'а). Показывает:
- Группировка по провайдеру ([[providers]]).
- В каждой группе — модели из каталога.
- Текущая модель помечена ✓.
- Можно фильтровать поиском (/ для активации фильтра).
8. Меню выбора тем
/theme
Список тем подсветки синтаксиса. Live-preview: при наведении на тему фон чата перерисовывается с новой темой. Enter — применить и сохранить.
9. Approval-диалог
Не pager, а inline-модальный блок в нижней части экрана. Показывает:
Tool wants to: <описание> Command: <command> Working dir: <path> 1. Yes (y) 2. Approve for this prefix/session — p для команд, a для файлов 3. No (d / Esc)
Это нумерованный список без варианта Edit. Клавиши по умолчанию: y — разрешить один раз, p — разрешить команды с этим префиксом, a — разрешить эти файлы на сессию, d или Esc — отклонить. Все клавиши настраиваются в approval keymap'е через /keymap (см. 12-keymap.md).
10. Side-conversation панель
/side не открывает оверлей — он переключает основной экран в «side-режим»:
- Header чата меняет цвет/префикс на [SIDE].
- В composer ограничены команды.
- Esc возвращает в main.
11. Status / debug-config
/status # текущая модель, провайдер, sandbox, токены /debug-config # слои конфига
Открываются как pager'ы со статической информацией.
12. Tooltips и inline-help
Когда курсор стоит на slash-команде в popup'е, рядом показывается tooltip с подробным описанием (не путать с /help <cmd> — это короткое описание).
Управляется:
[tui] show_tooltips = true
13. Alternate screen
[tui] alternate_screen = true
true — TUI использует alt-screen буфер терминала (как vim, less). При выходе курсор возвращается на исходное место.
false — TUI пишет в основной буфер (видно в scrollback после выхода). Полезно для отладки.
14. Файлы кода
- Общая инфраструктура pager'ов:
astracode-rs/tui/src/pager_overlay.rs /help:astracode-rs/tui/src/help_text.rs+event_dispatch.rs:OpenHelpOverlay/diff: обработчикSlashCommand::Diffвastracode-rs/tui/src/chatwidget/slash_dispatch.rs/review:open_review_popup()вastracode-rs/tui/src/chatwidget/slash_dispatch.rs- TranscriptOverlay:
astracode-rs/tui/src/pager_overlay.rs - Popup'ы:
astracode-rs/tui/src/bottom_pane/*.rs - Model picker:
open_model_popup()вastracode-rs/tui/src/chatwidget.rs - Approvals:
astracode-rs/tui/src/bottom_pane/approval_overlay.rs