Три пункта спецификации клиента (docs/client-tauri.md §5), которые оставались
открытыми в обёртке:
- **Клик по уведомлению → переход в канал.** У `tauri-plugin-notification` на
desktop нет колбэка действия, поэтому реализовано лучшее доступное поведение:
уведомление, показанное при неактивном окне, запоминается, и когда приложение
активируется в течение 10 секунд (окно получило фокус или macOS прислала
`RunEvent::Reopen`), окно поднимается и открывается комната из уведомления —
`glchat://guild/<id>/channel/<id>`, для личной беседы `glchat://dm/<id>`.
Идентификаторы проверяются (только цифры), чтобы из текста уведомления нельзя
было собрать произвольный deep link. Ограничение: ОС не сообщает, что
активация вызвана именно кликом, поэтому переход сработает и при обычном
возврате в приложение в эти 10 секунд — это описано в desktop/README.md;
- **Выход при несохранённых изменениях.** Клиент сообщает о правках командой
`desktop_set_dirty`; закрытие окна и пункт «Выход» в трее перехватываются
(`window::request_close_confirmation`), окно best-effort покачивается
(`Window::set_position`, на Wayland молча пропускается), а решение принимает
пользователь в диалоге клиента «Сохранить / Выйти без сохранения»; закрывает
приложение команда `desktop_close_window`. Раньше выход из трея терял правки
молча;
- **Ctrl/Cmd+K.** Комбинация регистрируется глобально (`shortcuts.rs`) и при
неактивном окне поднимает окно и просит клиент открыть палитру команд
(`WebMessage::OpenPalette`); повторы комбинаций с настраиваемыми шорткатами
отсекаются по разобранной комбинации, иначе вторая регистрация падала бы.
Заодно: `updates.rs` получил тест, который разбирает манифест релиза типом
самого `tauri-plugin-updater` (`RemoteRelease`) — он ловит расхождение формата
(например, дату не в RFC 3339), из-за которого обновление молча не приходило бы.
Проверки: `make desktop-check` (fmt, clippy, 10 тестов).
- Makefile: `desktop-check`, `desktop-build` (с ключом подписи обновлений,
без ключа — сборка без артефактов обновления) и `desktop-run`; кэши
cargo и npm держатся в .cache/, как у остальных инструментов проекта.
- desktop/README.md: сборка, запуск, аргументы командной строки, настройки,
deep links и открытые пункты Фазы 6.
- bundle.targets = all: бандлы по умолчанию для текущей ОС (macOS: .app/.dmg).
- Логирование подключается в setup и больше не роняет приложение, если
каталог логов недоступен на запись (песочница, домашний каталог только
для чтения).
- Разбор аргументов вынесен в Cli::from_args и покрыт тестами
(--instance, --minimized, --settings, --autostart on|off).
- cargo fmt по модулям обёртки.
Первый инкремент Фазы 6 (docs/client-tauri.md): окно с тем же веб-клиентом
(по умолчанию https://gl.mhspx.su, адрес настраивается), трей с меню и
индикатором непрочитанных, нативные уведомления, глобальный push-to-talk и
переключение микрофона/deafen, автозапуск, single-instance, сохранение
геометрии окна, deep links glchat://…, автообновление по подписанному
манифесту.
Связь страницы с обёрткой — через платформенный адаптер
(web/src/lib/platform.ts) и минимальный типизированный набор команд;
в веб-клиенте появились системные уведомления об упоминаниях и личных
сообщениях и переключатель в настройках.
В web/src/stores/gateway.ts вместе с вызовом уведомления лежат правки по
дефектам realtime (READY и сессии) из параллельной волны: файл коммитится
целиком по договорённости с координатором.