0.4.11
14 · Техническая документация

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-режиме внизу:

text
↑↓ to scroll • PgUp/PgDn to page • g/G to jump • q to close

В RU:

text
↑↓ прокрутить • PgUp/PgDn листать • g/G к началу/концу • q закрыть

2. /diff

text
/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

text
/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).

Параметры:

toml
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

text
/help                  # обзор всех команд
/help cd               # подробно про /cd
/help goal             # подробно про /goal

Pager с обзорной страницей или per-command-страницей.

Структура per-command:

text
# /<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

text
/model

Открывает не pager, а fullscreen list (наследник list-контекста keymap'а). Показывает: - Группировка по провайдеру ([[providers]]). - В каждой группе — модели из каталога. - Текущая модель помечена ✓. - Можно фильтровать поиском (/ для активации фильтра).

Реализация — пикеры в tui/src/chatwidget.rs (open_provider_picker/open_model_popup) и tui/src/bottom_pane/.

8. Theme picker

text
/theme

Список тем подсветки синтаксиса. Live-preview: при наведении на тему фон чата перерисовывается с новой темой. Enter — применить и сохранить.

9. Approval-диалог

Не pager, а inline-модальный блок в нижней части экрана. Показывает:

text
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

text
/status         # текущая модель, провайдер, sandbox, токены
/debug-config   # слои конфига

Открываются как pager'ы со статической информацией.

13. Tooltips и inline-help

Когда курсор стоит на slash-команде в popup'е, рядом показывается tooltip с подробным описанием (не путать с /help <cmd> — это короткое описание).

Управляется:

toml
[tui]
show_tooltips = true

14. Alternate screen

toml
[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 (открытие — keymap global.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