# Linux Implementation Log Этот файл веду параллельно с реализацией Linux backend. ## Stage 1 - Подготовка backend-слоя Status: done - Добавлен runtime для `sing-box`: `lib/services/singbox_runtime.dart`. - Реализовано извлечение бинарника из assets в `ApplicationSupport`. - Добавлен `chmod 755` после копирования бинарника. ## Stage 2 - Запуск и lifecycle процесса Status: done - Добавлен `SingBoxService`: `lib/services/singbox_service.dart`. - Реализован запуск через `pkexec run -c `. - Добавлены stop/dispose и стрим логов процесса. ## Stage 3 - Интеграция с приложением Status: done - `VpnService` переключается на Linux backend на `TargetPlatform.linux`. - На Linux `start` ожидает JSON-конфиг `sing-box`. - На Linux отключен запрос VPN permission через `v2ray_box`. - Добавлен fallback-парсинг имени профиля из JSON (`outbounds[*].tag`). ## Stage 4 - UI и совместимость Status: done - Обновлен `ConfigInfoView`: ping проверка помечается как недоступная для Linux backend. - Добавлено явное сообщение при старте с не-JSON конфигом на Linux. ## Stage 5 - Сборка и smoke-тесты Status: in_progress - Выполнен `flutter pub get`. - Прогнан `flutter analyze` (без ошибок). - После установки AppIndicator-зависимостей сборка восстановлена. - Добавлен CMake-флаг `-Wno-error=deprecated-declarations` в `linux/CMakeLists.txt`, чтобы deprecated warning из `tray_manager` не валил сборку plugin-кода. - `flutter build linux --debug` проходит успешно. - Остался ручной runtime smoke-тест через `flutter run -d linux`: - start/stop VPN; - close -> hide to tray; - quit из tray с корректным stop. ## Stage 6 - Desktop UX (tray/hide-to-tray) Status: done - Добавлены зависимости `window_manager` и `tray_manager` в `pubspec.yaml`. - Реализован `TrayService`: `lib/services/tray_service.dart`. - В `main.dart` добавлены Linux lifecycle-сценарии: - `setPreventClose(true)` и перехват close-события; - hide-on-close в трей; - действия меню трея `show`, `hide`, `quit`; - при `quit` выполняется остановка VPN перед выходом. - Исправлен `MissingPluginException` для `setToolTip` на Linux: - добавлен безопасный `try/catch` в `TrayService.init()`.