14. Оверлеи и всплывающие окна
TUI AstraCode использует несколько типов оверлеев — полноэкранные модальные окна, которые перекрывают основной чат и обрабатываются специальными просмотрщиками.
Общая инфраструктура — astracode-rs/tui/src/pager_overlay.rs (Overlay, StaticOverlay, TranscriptOverlay).
1. Оверлей полноэкранного просмотра: общие черты
Полноэкранный просмотр — это прокручиваемый просмотрщик контента в стиле 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
Полноэкранный просмотр с дельтой рабочей директории. Показывает tracked-изменения и untracked-файлы: tracked — через git diff (с подсветкой синтаксиса), untracked — через git ls-files --others --exclude-standard и далее --no-index diff для каждого (так новые файлы тоже попадают в выдачу). Фантомного git add -N не используется — всё читается только для показа.
Особенности:
- Подсветка синтаксиса изменений (зелёные/красные строки).
- Файлы можно сворачивать (Enter на header'е файла).
- Показывает binary-файлы как (binary file).
Отображение изменений — astracode-rs/tui/src/diff_render.rs.
3. /review
/review # ревью всех текущих изменений /review security # ревью с фокусом на безопасность /review only-tests # ревью только тестов
Запускает агент-ревьюер, который анализирует изменения и пишет отчёт. Отчёт выводится в чат как EnteredReviewMode item (всплывающее окно), а не в отдельном просмотре:
- Title: Code Review — <branch> · <commit short>
- Тело: markdown с секциями (Critical / Important / Suggestions).
- Каждая находка имеет ссылку на файл и строку (clickable в IDE-режиме).
Открытие всплывающего окна ревью — ChatWidget::open_review_popup() в tui/src/chatwidget.rs (событие EventMsg::EnteredReviewMode).
Параметры:
review_model = "deepseek-reasoner" # дешевле/умнее основной модели
Связано со скиллами:
- 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
Просмотр с обзорной страницей или 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. Оверлей транскрипта
TranscriptOverlay — специальный полноэкранный просмотр полной истории треда (не только видимой в чате).
Открывается горячей клавишей keymap-действия open_transcript (по умолчанию Ctrl+T, см. tui/src/keymap.rs:411). Не через /status.
Особенности: - Показывает все ходы с timestamp'ами. - Вызовы инструментов развёрнуты. - Reasoning (extended thinking) показывается отдельным блоком.
6. Всплывающие окна автодополнения
Всплывающие окна появляются над полем ввода при вводе:
Всплывающее окно slash-команд
Триггер: / в начале поля ввода.
Показывает фильтрованный список доступных команд с описаниями (локализованными).
Окно выбора файла (@)
Триггер: @<prefix> в поле ввода.
Показывает файлы в проекте, отфильтрованные по prefix. Использует file-search крейт (быстрый fuzzy match).
Список скиллов ($)
Триггер: $<prefix> в поле ввода.
Показывает установленные скиллы. При выборе подставляет default_prompt из agents/astracode.yaml.
Всплывающее окно /cd
Триггер: после /cd в поле ввода (или Tab на этой команде).
Показывает подкаталоги текущей cwd, фильтрует по prefix. Tab — завершить выбранным, повторный Tab — спуститься в подкаталог.
Реализация — bottom_pane/file_search_popup.rs (переиспользуется для /cd).
Всплывающее окно аргументов /goal
Триггер: после /goal в поле ввода.
Показывает подкоманды (edit/resume/pause/clear/budget) + echo-row с введённым текстом.
Реализация — bottom_pane/goal_args_popup.rs.
7. Список моделей
/model
Открывает не просмотр, а fullscreen list (наследник list-контекста keymap'а). Показывает:
- Группировка по провайдеру ([[providers]]).
- В каждой группе — модели из каталога.
- Текущая модель помечена ✓.
- Можно фильтровать поиском (/ для активации фильтра).
Реализация — пикеры в tui/src/chatwidget.rs (open_provider_picker/open_model_popup) и tui/src/bottom_pane/.
8. Список тем
/theme
Список тем подсветки синтаксиса. Live-preview: при наведении на тему фон чата перерисовывается с новой темой. Enter — применить и сохранить.
9. Диалог подтверждения
Не просмотр, а 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. Список сообщений (/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].
- В поле ввода ограничены команды.
- Esc возвращает в main.
12. Status / debug-config
/status # текущая модель, провайдер, sandbox, токены /debug-config # слои конфига
Открываются как окна полноэкранного просмотра со статической информацией.
13. Tooltips и inline-help
Когда курсор стоит на slash-команде во всплывающем окне, рядом показывается 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. Файлы кода
- Общая инфраструктура полноэкранного просмотра:
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: всплывающее окно в чате —astracode-rs/tui/src/chatwidget.rs(open_review_popup,EventMsg::EnteredReviewMode)- TranscriptOverlay:
astracode-rs/tui/src/pager_overlay.rs(открытие — keymapglobal.open_transcript, по умолчаниюCtrl+T) - Всплывающие окна:
astracode-rs/tui/src/bottom_pane/*.rs - Список моделей и провайдеров: пикеры в
astracode-rs/tui/src/chatwidget.rs+astracode-rs/tui/src/bottom_pane/ - Список сообщений:
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 - Подтверждения:
astracode-rs/tui/src/bottom_pane/approval_overlay.rs