UpdateChecker: динамический импорт @tauri-apps/plugin-updater (no-op вне
Tauri/на мобилке), диалог с прогрессом, downloadAndInstall + relaunch.
ErrorBoundary оборачивает всё приложение — раньше необработанное
исключение в рендере роняло весь SPA в белый экран без возможности
восстановиться без ручной перезагрузки страницы.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Регистрируется только под cfg(desktop) — Android/iOS самообновление
запрещено политиками сторов, там плагин не подключается вообще.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
tauri-apps/tauri-action жёстко ходит в api.github.com для создания релиза и
загрузки апдейтер-артефактов — не настраиваемый эндпоинт, для Gitea не
годится ни при какой замене секретов. Вместо неё:
- scripts/gitea-publish-release.mjs — публикует релиз через прямые вызовы
Gitea Release API: собирает latest.json (формат манифеста Tauri v2
updater) из .sig-файлов подписанных бандлов, создаёт версионный релиз
(тег = версия, для истории) и пересоздаёт релиз "latest" — у Gitea нет
built-in алиаса /releases/latest/download/<file> как у GitHub, поэтому
тег "latest" удаляется и создаётся заново на каждом релизе с теми же
ассетами, чтобы URL апдейтера был стабильным. Оба релиза
удаляются-и-пересоздаются — идемпотентно к повторному прогону тега.
- .gitea/workflows/release.yml — job "build" (та же матрица платформ) вызывает
`tauri build` напрямую (подпись через TAURI_SIGNING_PRIVATE_KEY читает сам
Tauri CLI, без разницы кто его вызывает), собирает пары <файл>+.sig в
dist-bundle/ и грузит артефактом bundle-<updater_key>; job "publish"
скачивает все артефакты и вызывает скрипт выше.
- tauri.conf.json: добавлен второй updater-эндпоинт (Gitea, плейсхолдер
CHANGE_ME_GITEA_SERVER — заполнить реальным адресом) рядом с
существующим GitHub — апдейтер пробует оба по порядку.
GitHub-версия пайплайна не тронута, продолжает работать через tauri-action
как раньше. Не проверено вживую на реальном Gitea/Windows/macOS раннере —
нет доступа в этой среде.
Нужные секреты в Gitea: GITEA_SERVER_URL, GITEA_TOKEN (личный токен с
правом записи в репозиторий), плюс уже существующие
TAURI_SIGNING_PRIVATE_KEY(_PASSWORD).
Копия .github/workflows/release.yml — но см. предупреждение в самом файле:
tauri-apps/tauri-action жёстко работает с api.github.com (создание релиза,
загрузка артефактов/latest.json), это не переключается сменой секрета.
Реально держит автообновление приложения GitHub-версия пайплайна; для
переезда публикации на Gitea понадобится отдельный release-механизм и
смена updater-эндпоинта в tauri.conf.json.
С AGP 8+ генерация BuildConfig — opt-in per-модуль, а не глобальная
настройка. VpnPlugin.kt ссылается на BuildConfig.DEBUG (гейт debug-инспектора
WebView) — без buildFeatures.buildConfig=true релизная сборка падала
"Unresolved reference: BuildConfig" ещё на этапе компиляции Kotlin.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Добавляет zh-CN, fa, ar, tr, uk, be, vi, uz локали (81 ключ, идентичная
структура) к существующим en/ru; ToggleLanguge.tsx переделан из
бинарного ru/en тумблера в выпадающий список всех 10 языков.
TelegramWeb.tsx был полностью на захардкоженном русском несмотря на импорт
useTranslation — переведён на i18n-ключи. rtlLanguages.ts выносит список
RTL-языков в отдельный .ts-файл (именованный импорт из .js падал на
allowJs). App.tsx реактивно переключает document.dir/lang при смене языка.
Логические CSS-свойства (ps-/pe-/start-/end-/border-e) вместо физических
в badge/button/dialog/select и BurgerMenu — Flexbox иначе визуально
переворачивает детей под dir=rtl, ломая анимацию бургер-меню.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Deep-link авторизация в Telegram-виджете не работала (не было отдельной
кнопки для завершения флоу). Заменяет на код-флоу: бот выдаёт разовый код,
пользователь вводит его в Login.tsx/LoginButton.tsx, useAuthStore дергает
loginTelegramCode(). api.ts вместо startTelegramLogin/TelegramLoginSession
получает getBotUsername() (кэширует bot_username из GET /api/v1/config) для
кнопки "Открыть бота".
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Отдельные .env.development/.env.production под VITE_API_BASE_URL,
tauri.dev.conf.json (десктоп с отдельным identity) и
tauri.test-backend.conf.json (мобилка, переключение только бэкенда),
плюс новые Makefile-таргеты и build:dev в package.json.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- consumerProguardFiles + усиленные keep-правила для Jackson — без них R8 в
релизной сборке ломал десериализацию TunnelConfig, и кнопка подключения
переставала что-либо делать без единой ошибки в логах.
- Проверка на null у builder.establish() и корректный resolve/reject запроса
VPN-разрешения.
- WebView.setWebContentsDebuggingEnabled включается только под BuildConfig.DEBUG,
а не безусловно в релизе.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Home теперь рендерится только когда isLoggedIn — до этого юзер видит
полноэкранный Login (анонимно/seed/Telegram), а не экран подключения; кнопка
VPN дополнительно блокируется на уровне VpnControl как defense-in-depth.
isLoggedIn — отдельный персистентный флаг, не совпадает с фактом наличия
фонового Ghost-токена (тот может тихо появиться до явного логина).
Заодно: matrix-engine в package.json указывал на путь другого пользователя
(/home/kirill/...) — поправил под текущую машину; прогнал `tauri icon`,
чтобы Android больше не показывал дефолтный логотип Tauri (иконка никогда не
генерировалась для этой платформы); dev-узел Singapore (DEV_IP) переведён на
порт 8443 вслед за прокси.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
New non-blocking login panel on the Home screen (seed backup/restore +
Telegram magic-link via the bot deep-link, polled through the new backend
endpoints) — uses its own popover instead of a full-screen Dialog so the
burger menu stays clickable while it's open. VpnStats now shows a used/limit
usage bar backed by a new useUsageStore.
Also registers tauri-plugin-shell (needed to open the t.me deep-link) and
threads an optional auth token from the app down through TunnelConfig to the
proxy client (desktop + Android), for instances running --require-auth.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Прокидываем sni (decoy-хост) по обновлённому UDL через весь стек:
guest-js -> Tauri-команда -> desktop/mobile -> Kotlin spawnSession.
Список серверов пока статичный (backend еще не отдает sni), но логика
похода в реальный /api/v1/nodes оставлена под флагом на будущее.
- Бандлим wintun.dll в Windows-инсталлятор через bundle.resources в
tauri.windows.conf.json - раньше он копировался только для
локального cargo run/tauri dev, но не попадал в NSIS/MSI.
- Чиним падение мобильной сборки: гитигнорённые UniFFI Kotlin-биндинги
отстали от обновленного UDL (не хватало параметра sni).
- Флаги стран - локальные SVG вместо react-country-flag в CDN-режиме:
тот бился об CSP и не грузился офлайн.
- Добавляем дерево README.md по структуре проекта и точечные
комментарии в неочевидных местах кода.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>