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 с дельтой рабочей директории. Показывает tracked-изменения и untracked-файлы: tracked — через git diff (с подсветкой синтаксиса), untracked — через git ls-files --others --exclude-standard и далее --no-index diff для каждого (так новые файлы тоже попадают в выдачу). Фантомного git add -N не используется — всё читается только для показа.
Особенности:
- Подсветка синтаксиса diff (зелёные/красные строки).
- Файлы можно сворачивать (Enter на header'е файла).
- Показывает binary-файлы как (binary file).
Рендер diff — astracode-rs/tui/src/diff_render.rs.
3. /review
/review # ревью всех текущих изменений /review security # ревью с фокусом на безопасность /review only-tests # ревью только тестов
Запускает агент-ревьюер, который анализирует diff и пишет отчёт. Отчёт выводится в чат как EnteredReviewMode item (popup), а не в отдельном pager'е:
- Title: Code Review — <branch> · <commit short>
- Тело: markdown с секциями (Critical / Important / Suggestions).
- Каждая находка имеет ссылку на файл и строку (clickable в IDE-режиме).
Открытие review popup — ChatWidget::open_review_popup() в tui/src/chatwidget.rs (событие EventMsg::EnteredReviewMode).
Параметры:
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 для просмотра полной истории треда (не только видимой в чате).
Открывается горячей клавишей keymap-действия open_transcript (по умолчанию Ctrl+T, см. tui/src/keymap.rs:411). Не через /status.
Особенности: - Показывает все turn'ы с timestamp'ами. - Tool-вызовы развёрнуты. - Reasoning (extended thinking) показывается отдельным блоком.
6. Popup автодополнения
Popup'ы появляются над composer'ом при вводе:
Slash-command popup
Триггер: / в начале composer.
Показывает фильтрованный список доступных команд с описаниями (локализованными).
File picker (@)
Триггер: @<prefix> в composer.
Показывает файлы в проекте, отфильтрованные по prefix. Использует file-search крейт (быстрый fuzzy match).
Skill picker ($)
Триггер: $<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 picker
/model
Открывает не pager, а fullscreen list (наследник list-контекста keymap'а). Показывает:
- Группировка по провайдеру ([[providers]]).
- В каждой группе — модели из каталога.
- Текущая модель помечена ✓.
- Можно фильтровать поиском (/ для активации фильтра).
Реализация — пикеры в tui/src/chatwidget.rs (open_provider_picker/open_model_popup) и tui/src/bottom_pane/.
8. Theme picker
/theme
Список тем подсветки синтаксиса. Live-preview: при наведении на тему фон чата перерисовывается с новой темой. Enter — применить и сохранить.
9. Approval-диалог
Не pager, а inline-модальный блок в нижней части экрана. Показывает:
Tool wants to: <описание> Command: <command> Working dir: <path> [A]llow once [W] Always [D]eny [E]dit
Клавиши обрабатываются в контексте approval keymap'а (см. 12-keymap.md). Реализация — astracode-rs/tui/src/bottom_pane/approval_overlay.rs.
10. Message picker (/expand, /undo, /fork)
Единый полноэкранный оверлей, обслуживающий три команды:
/expand— перечисляет свёрнутые exploring-блоки (Enter — переключить сворачивание, пикер остаётся открытым)./undo— список записанных файловых изменений, полученных с сервера черезfs/listChanges(Enter — запросить отмену, список рефрешится)./fork— пользовательские сообщения (Enter — ответвить новый чат).
Пикер владеет только выбором и рендером; само действие при Enter эмитится как AppEvent, поэтому логика исполнения лежит в app-диспетчере — там, где данные уже под рукой (локальные ячейки для expand/fork, серверный RPC для undo). Тот же UX выбора можно повторно собрать в VS Code / веб-клиенте.
Реализация — astracode-rs/tui/src/message_picker.rs (+ message_picker_sources.rs, app/message_picker_dispatch.rs).
11. Side-conversation панель
/side не открывает оверлей — он переключает основной экран в «side-режим»:
- Header чата меняет цвет/префикс на [SIDE].
- В composer ограничены команды.
- Esc возвращает в main.
12. Status / debug-config
/status # текущая модель, провайдер, sandbox, токены /debug-config # слои конфига
Открываются как pager'ы со статической информацией.
13. Tooltips и inline-help
Когда курсор стоит на slash-команде в popup'е, рядом показывается tooltip с подробным описанием (не путать с /help <cmd> — это короткое описание).
Управляется:
[tui] show_tooltips = true
14. Alternate screen
[tui] alternate_screen = "auto" # AltScreenMode: auto | always | never
alternate_screen — это enum AltScreenMode (см. protocol/src/config_types.rs:346), а не boolean:
auto(по умолчанию) — автоопределение: alt-screen отключается в Zellij, в остальных терминалах включается.always— TUI всегда использует alt-screen буфер терминала (какvim,less). При выходе курсор возвращается на исходное место.never— TUI пишет в основной буфер (видно в scrollback после выхода). Полезно для отладки.
15. Файлы кода
- Общая инфраструктура pager'ов:
astracode-rs/tui/src/pager_overlay.rs /help:astracode-rs/tui/src/help_text.rs+app/event_dispatch.rs:OpenHelpOverlay/diff: рендер —astracode-rs/tui/src/diff_render.rs/review: popup в чате —astracode-rs/tui/src/chatwidget.rs(open_review_popup,EventMsg::EnteredReviewMode)- TranscriptOverlay:
astracode-rs/tui/src/pager_overlay.rs(открытие — keymapglobal.open_transcript, по умолчаниюCtrl+T) - Popup'ы:
astracode-rs/tui/src/bottom_pane/*.rs - Model/provider picker: пикеры в
astracode-rs/tui/src/chatwidget.rs+astracode-rs/tui/src/bottom_pane/ - Message picker:
astracode-rs/tui/src/message_picker.rs(+message_picker_sources.rs,app/message_picker_dispatch.rs) - Undo UI:
astracode-rs/tui/src/chatwidget/undo_ui.rs - Approvals:
astracode-rs/tui/src/bottom_pane/approval_overlay.rs