# Контекст проекта ## Текущий статус Фаза 14: мультиаккаунт, в работе. Цель фазы: безопасные профили Telegram-аккаунтов, переключение аккаунтов и подготовка к более быстрому multi-client UX. ## Уже сделано - Профили аккаунтов: `AccountProfile`, `accounts.toml`, XDG data paths. - Миграция старого `tdlib_data/` в per-account directory. - CLI `--account `. - Account switcher modal по `Ctrl+A`: выбор и добавление аккаунта. - Single-client переключение через `recreate_client()`. - Footer показывает имя аккаунта, если он не `default`. - Per-account lock file защищает TDLib database от двух процессов. - TDLib receive loop передаёт `client_id`; UI применяет updates только активного клиента. - `pending_chat_init` не должен блокировать первый redraw; reply-info и photo downloads уходят в фоновые tasks. - Keybindings стали детерминированными; русская vim-раскладка: `h/j/k/l` -> `р/о/л/д`. - `AudioPlayer` проверяет наличие `ffplay`. - `message_grouping` группирует альбомы без клонирования сообщений. - TDLib facade split на scoped traits; generic код больше не получает raw `*_mut` доступ к сообщениям. - Локальный `build.rs` удалён: линковкой TDLib управляет зависимость `tdlib-rs`, `cargo check --all-targets --all-features` снова воспроизводим. ## Осталось - Быстрые hotkeys `Ctrl+1`..`Ctrl+9` для аккаунтов без модалки. - Удаление/переименование аккаунта в account switcher. - Бейджи непрочитанных с других аккаунтов. - Решить, нужен ли переход от single-client reinit к одновременным клиентам. - Добавить/уточнить tests для accounts + TDLib update routing. ## Риски - Multi-account код должен фильтровать TDLib updates по `client_id`. - Инициализация чата и фоновые downloads не должны блокировать первый redraw. - Read/unread статус исходящих сообщений зависит от корректной TDLib metadata. - Конфликтующие keybindings должны оставаться детерминированными. - Переключение аккаунтов требует проверки lock release/acquire и auth flow. ## Ключевые решения - Главный state хранится в `App`, чтобы тесты могли использовать `FakeTdClient`. - `TdClientTrait` теперь facade поверх scoped traits; чтение текущих сообщений идёт через `Cow`, mutation - через явные update-операции. - Пользовательская timezone не хранится в config: runtime использует системную timezone, тесты форматирования используют deterministic time source. - Методы `App` разбиты на traits: navigation, messages, compose, search, modal. - UI рендерится только при `needs_redraw`; текстовый интерфейс целится в 60 FPS. - Фото под feature `images`: inline Halfblocks + modal iTerm2/Sixel. - Голосовые сообщения проигрываются через `ffplay`, cache живёт в `~/.cache/tele-tui/voice/`. - Credentials читаются из `~/.config/tele-tui/credentials`, fallback `.env`. - TDLib data аккаунтов хранится в `~/.local/share/tele-tui/accounts/{name}/tdlib_data/`.