1. Launcher регистрирует hardware fingerprint.
  2. Запрашивает device code у backend.
  3. Открывает verification URL в системном браузере.
  4. Polling ожидает подтверждение.
  5. После успеха токен и профиль записываются SessionService.
  6. UI обновляется через событие session.changed без полной перезагрузки renderer.

Состояния ошибок

Закрытие окна

Закрытие auth modal вызывает siteAuth.stop(). AbortController прекращает ожидание и сбрасывает active operation. Следующее открытие начинает новый flow.

Logout

Logout отзывает удалённую сессию, очищает локальный snapshot и переводит UI в гостевой режим. Подтверждение выхода показывается отдельным modal.