# TODO ## UI / UX - [x] **Предупреждение о несохранённых изменениях при переходе между вкладками (Unsaved Changes Guard / Modal)**: - Если у пользователя есть несохранённые изменения в настройках (`ModulesPage`, `SettingsPage` — сервер, боты и др.) и он переходит на другую вкладку (в боковом меню `Shell.tsx` или кнопками навигации), показывать pop-up диалог подтверждения. - Опции в диалоге: - **Сохранить (Save)** — сохранить внесённые изменения и перейти на выбранную страницу. - **Сбросить (Discard)** — отменить несохранённые изменения и перейти на выбранную страницу. - **Отмена (Cancel)** — остаться на текущей странице с сохранением введённых данных. - *Контекст:* Предотвратит случайную потерю настроек, когда пользователь меняет параметры модуля/сервера и сразу уходит на вкладку Overview для запуска сервера (см. [Issue #45](https://github.com/Corfirean/coa-server-manager/issues/45)). ## Сервер и стабильность - [x] **Автоподнятие сервера при падении (Auto-restart on crash) со счётчиком и расшифровкой крашей**: - **Настройка:** Чекбокс «Автоматически перезапускать сервер при падении» в настройках сервера / менеджера. - **Поведение автоподнятия:** - Перезапускать процесс сервера только если падение произошло внезапно (процесс завершился с ненулевым exit code, крашем или без команды от менеджера). - Если пользователь нажал кнопку «Стоп» (Stop Server), сервер останавливается полностью, автоподнятие не срабатывает. - Защита от бесконечного цикла крашей (Crash Loop Protection): если за короткий интервал (например, 2-3 минуты) сервер падает более 3-5 раз, автоподнятие временно прекращается, а в UI выводится критическое оповещение. - **Счётчик падений в интерфейсе:** - Рядом со статусом сервера (или в шапке/панели состояния) показывать бейдж со счётчиком крашей с момента старта (например: `Крашей: 2`). - При клике на счётчик открывать окно / модалку со списком последних падений с точным временем. - **Расшифровка причин краша (Crash Explanation Engine):** - *Как парсить и определять причину:* 1. Читать свежий текстовый файл из `Core/Crashes/_worldserver.exe_[date].txt`. 2. Смотреть `Exception code` (например, `C0000005` — нарушение доступа к памяти/access violation, `C0000420` — сработавший assert ядра, `C00000FD` — переполнение стека, `E06D7363` — исключение C++ / std::bad_alloc). 3. При `C0000420` парсить блок `ASSERTION FAILED` (`Location`, `Function`, `Condition`). 4. Анализировать последние строки `Core/Logs/Server.log` и `Errors.log` на критические маркеры (потеря соединения с MySQL, нехватка RAM/OOM, ошибка бинда портов). 5. Проверять по встроенному словарю известных сигнатур (паттерны частых крашей с понятным описанием, например: «Сбой удаления объекта из сетки карты», «Ошибка запроса к базе данных», «Нехватка оперативной памяти»). - *Fallback:* Если сигнатура не опознана в словаре известных проблем, показывать краткую техническую выжимку (код исключения + сработавший ассерт или вершина Call Stack) и кнопку разворота полного текста крашлога / копирования.