Repository navigation
Releases
Releases · BAZESHOT1/MinionGuard
v2.4.6 Release
Новое:
- Замер скорости локаций. Приложение будет автоматически при запуске замерять скорость всех локаций и показывать около пинга. На Windows реализовал средствами нашей собственной обертки над xray, на Abdroid, IOS и MacOS замер будет работать автоматически при включенном VPN. Замеры кешируются и обновляются автоматически, либо по инициативе пользователя. Замеры можно отключить в настройках (Глобаный переключатель. Терминирует функционал замеров на уровне главного цикла + убирает кнопку замера из UI)
- Просмотр и удаление устройств - теперь при нажатии на виджет устройств на главном экране пользователь сможет посмотреть список устройств и удалить ненужные. Прямо из приложения
- Возможность делиться подпиской с окна управления устройствами
Исправления:
- Улучшена адаптация под полноэкранный режим на ПК
- Улучшен парсинг параметров подписки
- Улучшена стабильность работы
v2.2.4 Release
Что нового
🎨 Интерфейс
- Переключатель темы в Настройках
- Язык и тема теперь в одной секции
- Единый аватар пользователя в меню и на главной
- Кнопка «Выйти» переехала в самый низ меню (прокручивается)
- Выход из аккаунта с подтверждением
- Настройки туннеля переработаны и сгруппированы по секциям
⚙️ Туннель
- Информация о правах администратора встроена прямо в опцию TUN
- Убран ненужный переключатель «Всегда запускать от администратора»
📡 Пинг
- Недоступные серверы показывают «off» вместо 9999 мс
- Корректная передача платформы (Windows, Android, iOS, macOS, Linux)
📊 Трафик и устройства
- Трафик подписки берётся из заголовка subscription-userinfo
- Список устройств для ExoWPN подтягивается корректно
- Расширенный парсинг данных Bedolaga
v2.1.1 Release
v2.1.1: локализация, кеш, трафик из subscription-userinfo" -m "- Полная локализация ru/en с автоопределением системного языка
Добавления и исправления:
- Выбор языка через выпадающий список в настройках, сохраняется в SharedPreferences
- Язык применяется мгновенно без перезапуска
- Персистентный кеш: профиль, подписка, устройства, трафик
- logoutAll() полностью очищает кеш пользователя
- Плашка 'Приложение обновлено до версии X' при первом запуске после апдейта
- Трафик подписки теперь берётся из заголовка subscription-userinfo
для обоих сервисов (MinionGuard + ExoWPN - Устройства ExoWPN подтягиваются через getDevices()
- Расширенный парсинг трафика и лимита устройств для Bedolaga
- Платформа в x-device-os передаётся с большой буквы (Windows, Android, iOS)
- Inno Setup: убран диалог 'для меня / для всех', сохранены реестровые фиксы
- Скрипт сборки scripts/build_all.bat с автопереименованием артефактов
Beta v2.0.4 Release
Новое
- Полная локализация интерфейса — русский и английский языки.
- Автоопределение системного языка при первом запуске (Windows, macOS, Linux, Android, iOS).
- Переключатель языка в настройках — выпадающий список с пунктом «Системный».
- Выбор языка сохраняется в SharedPreferences и применяется мгновенно без перезапуска.
- Персистентный кеш данных пользователя — профиль, метаданные подписки, устройства, тариф, лимиты трафика теперь сохраняются на диск и доступны после перезапуска или временной потери связи с сервером.
- Плашка «Приложение успешно обновлено до версии X» — показывается один раз при первом запуске после апдейта, длится 5 секунд.
- Скрипт сборки scripts/build_all.bat — собирает Windows-installer и Android-APK одной командой, автоматически переименовывает артефакты в MinionGuard_<версия>-Windows.exe и MinionGuard_<версия>-Android.apk, версия подтягивается из pubspec.yaml.
Исправления
- Красный экран No MaterialLocalizations found при запуске — добавлены flutter_localizations и делегаты GlobalMaterialLocalizations / GlobalWidgetsLocalizations / GlobalCupertinoLocalizations.
- Drawer не находил MaterialLocalizations для русской локали — та же причина, что выше.
- Ошибка константного конструктора в AppStringsRu / AppStringsEn — добавлен явный const AppStrings() в базовый класс.
- Кеш данных терялся при деавторизации — теперь logoutAll() очищает всё, а DataCache переживает рестарт.
- Устройства не кешировались — теперь сохраняются и восстанавливаются после перезапуска.
- Inno Setup показывал диалог «Установить для меня / для всех» — убран, установка всегда идёт в %LOCALAPPDATA%\Programs\MinionGuard без UAC.
- Апдейт стирал пользовательские файлы в папке установки — удалён блок [InstallDelete] и вызов старого деинсталлятора.
- Сборка ломалась на копировании артефактов — папка build\dist теперь создаётся после flutter clean, а не до.
- Плашка обновления не появлялась — исправлено ожидание ScaffoldMessenger через retry-цикл.
Beta v1.8.4 Release
✨ НОВОЕ
Чат поддержки
- Чат с техподдержкой - новый экран, доступный из drawer. Единый для обоих сервисов, URL из .env (CHAT_API_URL).
- Cookie-сессия чата сохраняется в SharedPreferences и подхватывается между запусками приложения.
- Автополлинг новых сообщений каждые N секунд (интервал задаёт бэкенд).
- Оптимистичная отправка - сообщение сразу появляется в списке, потом уходит на сервер.
- Дедупликация сообщений при poll - серверные и локальные не дублируются.
- Кнопка «Поделиться логами» показывается под сообщением агента, содержащим триггерное слово. По нажатию логи тихо уходят в чат, а в UI появляется локальное сообщение «Отправлены логи ошибок приложения».
- Тихая отправка логов из настроек - кнопка «Отправить логи в поддержку» с описанием «Это поможет нам исправить ошибки». Пользователь видит только «Спасибо! Логи отправлены».
Логирование
- Три режима логирования с понятными названиями:
- Отключено - пишется только errors.log (последние 100 строк ошибок).
- Логи Xray - логи Xray и flutter_vless + errors.log.
- Полные логи - все критичные логи приложения + errors.log.
- errors.log пишется всегда, независимо от режима. Это кольцевой буфер на 100 строк с автоперезаписью.
- Ротация session-файлов - хранятся последние 3 файла сессий. Старые удаляются автоматически.
- Фильтр шума - из Полных логов вырезаны:
[AppConfig] dump всех цветов при старте,
[ChatService] GET/POST ...,
[UpdateService] CACHE HIT ...,
[Bedolaga] retry N/M через ...,
[MinionGuard] retry N/M через ...,
[Bedolaga] baseUrl=....
При этом всё, что содержит error/exception/failed/timeout/refused и т.п., проходит фильтр всегда. - Перехватчики ошибок Flutter перенесены в LogService.installErrorHandlers() - FlutterError.onError, PlatformDispatcher.onError, runZonedGuarded.
- Просмотр логов в приложении - LogViewerScreen с кнопками «Назад» и «Поделиться» (share_plus на Android/iOS/Windows/macOS).
- Файл errors.log в списке логов помечен отдельной иконкой и всегда показан первым.
Раздельное туннелирование
- Windows - полный набор: global, include (только выбранные), exclude (все, кроме выбранных), bypass local networks.
- Android - global, exclude (per-app VPN через blockedApps), bypass local networks.
- iOS/macOS/Linux - секция скрыта полностью.
Общее
- Оптимизация AppListService на Windows - PowerShell OutputEncoding принудительно UTF-8, чтобы русские буквы в путях не превращались в кракозябры.
- Детеминированный HWID - на Windows берётся MachineGuid из реестра, на Linux - /etc/machine-id, на macOS - IOPlatformUUID. Одно устройство = один HWID.
- Сохранение выбранного сервера между запусками - SessionService.selectedServerFor() хранит remark, при загрузке выбирается тот же сервер.
- Автосохранение настроек туннеля - без кнопки «Сохранить», каждое изменение сразу пишется в SharedPreferences.
- Drawer закрывается через 1 секунду при навигации и переключении сервиса (не только при смене сервиса).
- Кнопки и рамки сервисов используют цвета из .env во всех экранах (главная, тарифы, настройки, чат, drawer).
🐛 БАГ-ФИКСЫ
VPN / туннелирование
- Исправлен refresh-токен ExoWPN. Замыкание send в BedolagaApiClient._request() захватывало HTTP-заголовки один раз при создании, поэтому повторный запрос после refresh уходил со старым Bearer. Теперь send принимает headers параметром и пересобирает их на каждом вызове.
- Устранена гонка refresh-токена. Добавлен мьютекс _refreshFuture - параллельные 401 ждут один refresh вместо двух одновременных вызовов /cabinet/auth/refresh (бэкенд инвалидирует refresh после первого использования, второй запрос ронял сессию).
- Плашка «Сессия истекла» больше не появляется ложно. Причина - гонка refresh между getProfile() и getSubscription() на главном экране. Мьютекс устраняет сценарий, когда второй запрос получает 401 из-за израсходованного refresh.
- TUN-режим теперь работает на macOS через flutter_vless. Раньше usesNativeTun возвращал true только для Windows, а isMobile не включал macOS - на macOS TUN падал в proxy. Теперь usesFlutterVlessTun покрывает Android/iOS/macOS.
- Переключение сервера корректно работает для flutter_vless-платформ. Учтён случай, когда активен TUN через flutter_vless (не только Windows-нативный).
Чат поддержки
- Исправлено отображение ответов поддержки. Регулярка/логика нормализации автора не распознавала support/operator/manager/admin → они попадали в visitor и отображались справа как твои. Теперь ChatMessage._normalizeAuthor() приводит все варианты к agent/visitor/system.
- Появилось первое сообщение в чате. Если бэкенд не вернул сообщений, но прислал greeting - он показывается как системное сообщение. Если и greeting пуст - используется дефолтное приветствие (ChatService.defaultGreeting).
- Исправлен триггер кнопки «Поделиться логами». \b в Dart с unicode: true не работает с кириллицей. Заменено на (?<!\p{L})...(?!\p{L}) - теперь «логи», «логов», «LOGS», «log» ловятся, а «логирование» и «каталог» - нет.
- Автоконтекст в первом сообщении. При первом send() в чат добавляется шапка с сервисом, username, email, платформой и версией приложения.
Логирование
- Исправлено чтение hex-цветов из .env. flutter_dotenv обрезает значение по #, если оно не в кавычках. Теперь _parseColor() корректно обрабатывает #RRGGBB / RRGGBB / #RGB / inline-комментарии. В .env цвета рекомендуется оборачивать в кавычки.
UI / темы
- Убраны баннеры о недоступных функциях. На iOS/Linux/macOS больше не показывается «Раздельное туннелирование недоступно» и «На этой платформе доступен только TUN». Недоступные секции просто скрыты через TunnelCapabilities.showXxx.
- Раздел маршрутизации скрывается целиком там, где он не работает (iOS/Linux/macOS), а не отображается серым.
- Выбор режима подключения скрыт на Linux - там всегда proxy.
🔧 ИЗМЕНЕНИЯ
Архитектура
- LogService расширен - теперь единственный источник правды по логам, включая errors.log и перехватчики ошибок Flutter.
- Удалён lib/services/error_log_service.dart - вся его логика перенесена в LogService.
- VpnController - добавлены геттеры usesFlutterVlessTun, usesFlutterVless, расширен isMobile (включая macOS), переписан startTun() с разветвлением Windows / flutter_vless / Linux.
- BedolagaApiClient - _sendWithRetry и _request принимают функцию от headers вместо готового замыкания. Все публичные методы переписаны под новый контракт.
- TunnelCapabilities - новые геттеры showConnectionModeSelector, showRoutingSection, showBypassLocalNetworks для декларативной видимости секций.
UI
- TunnelSettingsScreen - режим логирования теперь DropdownButtonFormField (компактнее, чем RadioListTile).
- ChatScreen - разделение на _bootstrap (загрузка + приветствие), _poll (дедупликация), _send (оптимистичная вставка), _shareErrorLogs.
- LogViewerScreen - новый экран для просмотра одного лог-файла.
Beta v1.5.0 Release
исправления:
- Кэш-хит теперь проверяет compareVersions - если версия в кэше не новее текущей, кэш не возвращается. Это главное исправление вашего бага.
- _cacheResult вызывается только при cmp > 0 - в кэш попадают только реально новые версии. Если релиз 1.4.6, а текущая 1.4.6, кэш не заполняется то следующее открытие Drawer снова сделает свежий запрос и вернёт null и плашки не будет.
- _clearCache() при cmp <= 0 - если в кэше случайно оказалась запись, равная текущей версии (например, от предыдущей гонки), она будет удалена.
Beta v1.4.6 Release
Исправления:
- Исправлена ссылка на новости проекта. Теперь кнопка "Новости проекта" ведет на канал Telegram с новостями проектов.
- Мелкие баг-фиксы
Beta v1.4.2 Release
Что нового:
- Сохранение подписки в кеш - подписка работает даже если сессия клиента устарела и живет до реавторизации или деавторизации.
- Проверка обновлений и отображение версии в навигации: Приложение теперь проверяет доступные обновления и если обновление доступно - показывает в меню навигации уведомление с кнопкой загрузки (открывает этот репозиторий) на Windows. На Android открывает этот репозиторий (позже - будет открывать страницу Google Play). На IOS - проверка по релизам в AppStore и редирект при доступном обновлении на страницу приложения в AppStore.
Исправления:
- Установщик для Windows корректно чистит записи в реестре о повышенных правах доступа для приложения, полученных ранее (Не критично, но из за этого после окончания установки приложение не запускалось автоматически и требовало повышенных прав - теперь корректно отрабатывает при обновлениях и заново просит повышение прав при первом запуске в режиме TUN на Windows)
- Исправлена ошибка деавторизации для ExoWPN при Oauth-авторизации. Ранее main-screen падал с ошибкой из за истекшего токена авторизации. Теперь - через механизм refresh-tocken обновляется автоматически и сессия не вылетает. Для MinionGuard сессия кешируется и подписка продолжает работать. При этом, если токен устарел, приложение не выкидывает на главный экран, а продолжает работать до момента пока пользователю не понадобится токен авторизации его аккаунта или до момента деавторизации или реавторизации в сервисе. (Простыми словами - сабка сохраняется в кеше и работает всегда, даже при истеченной авторизации)
- Улучшена стабильность работы на Windows и Android
- Убраны лишние манифесты в правах доступа приложения