refreshMailInbox() сбрасывает/аннулирует emails-infinite и заново запрашивает список, папки, учетные записи и счетчики значков фильтров за один проход.new-email: немедленно refreshListNow({ resetPages: true }) — без задержки; новая почта всегда попадает на страницу 1.GlobalMailSSE: useMailPeriodicRefresh — резервный опрос каждые 30 с поддерживает синхронизацию списка и счетчиков, когда SSE недоступен.refetchInterval на useAccounts/useFolders; удален опрос списка каждые 120 с (4 с syncWarmup только во время начальной синхронизации).emails_bulk_updated пересылается в sse.go (Redis + EventBus); фронтенд уже прослушивал, но сервер никогда не публиковал в поток браузера.folder_updated: обработчик фронтенда запускает атомарное обновление метаданных.resetAccountSync: InvalidateEmailCache + RefreshUnreadCounts + SSE emails_bulk_updated (action: reset_sync).OnNewEmail: Инвалидация MemCache без Redis (Mono).removeQueries(["emails-infinite"]) при сбросе синхронизации; GlobalMailSSE в макете приложения; syncWarmup быстрый опрос, пока список содержит менее 40 писем.scheduleListRefresh заменяет блокирующий fetchingRef — список больше не зависает на первом пакете SSE.RefreshUnreadCounts: тег smart_category сначала; непрочитанные входящие исключают письма из smart-категории (соответствует представлению списка).buildFilterWhere / GetEmailCount: такое же исключение для значков панели инструментов и боковой панели.email-folder-counts.normalizeEmailHTML → wrapEmailForIframe; граница XSS — это CSP в srcdoc iframe.sanitizeNode в email_normalize.go; тесты обновлены.emailHoverCursor на iframe overlay (pointer на ссылки/кнопки, zoom-in на изображения); coreStyles + .email-simple-content CSS.GetActiveFilePaths: удалено LIMIT 10000 (SQLite + Postgres) — GC больше не считает действительные .eml файлы потерянными в больших почтовых ящиках.syncInboundFlags: ~30 с опрос — FETCH FLAGS для 300 последних чистых сообщений; \Seen / \Flagged / \Answered сервер → БД (прочитано/непрочитано в обе стороны + unread_count).ApplyServerEmailFlags: атомарное применение без is_dirty_locally; заменяет путь только для чтения во входящих.syncFlags: \Seen, \Flagged, \Answered пакетно STORE (200 UID); грязные строки содержат все три поля.emails.is_answered; модель + API is_answered.MarkEmailAnsweredByMsgID при отправке (in_reply_to) → грязный → IMAP \Answered.\Flagged / \Answered при получении нового сообщения.email_updated с полями флагов; инвалидация MemCache без Redis (Mono).email_updated.UnilateralDataHandler на CheckWorker — EXISTS будит цикл IDLE → checkNewEmails (был отключен wakeUp канал).IDLETimeout + IDLEWatchdog из timing.go (заменяет жестко заданное обновление только 14 мин).syncNonInboxFolders каждые FolderScanInterval (5 min / 2 min Mono) в потребительском цикле.syncFlags: clear is_dirty_locally только после успешного STORE для папки.RunRules в ProcessMessageStreamToFolder только когда isNewEmail.GetEmailIDByFolderUID + локальный DeleteEmail когда у сервера нет UID.last_sync_uid после постановки в очередь.resolveDraftsFolder() для локализованных / SPECIAL-USE имён почтовых ящиков.syncBatchDelay: регулирование между синхронизацией папок и пакетной постановкой в очередь.UPDATE_CHANNEL встроено при сборке образа (stable / beta); normalizeUpdateChannel() при проверке лицензии.maxramas/rms-mail; редакция + роль в tag {m|u|t}[-ui]-{latest|beta|test|semver}.m-latest, m-ui-latest, u-beta, m-test, u-3.0.7.bp-*.sh, beta-*.sh, build-and-push-test.sh, все docker-compose-*.yml.rms-mail-m, rms-mail-m-ui, … и устаревшие latest-m / rms-mail-ui:latest-m.WakeUpAccountNow: немедленное пробуждение потребителя синхронизации (IDLE push, открытие письма, действия пользователя) — без джиттера; WakeUpAccount имеет джиттер 0–30 с для перезапусков.RequestFlagRefresh: открыть письмо → поставить в очередь для следующего входящего FETCH FLAGS + WakeUpAccountNow.inboundFlagSyncLimit 2000 на аккаунт (было 300).PurgeEmailLocalFiles до DeleteEmail когда серверный UID удалён — зашифрованное тело удалено с диска.{ "event": "email.received", "email": { ... } } (WebhookEventPayload).has_secret в API вебхуков; UI (подписано) индикатор — секрет никогда не отображается.RunRules только на новые приём (isNewEmail) — нет повторных запусков правил при повторной синхронизации.accountId.?token=: HTTP 400 везде, кроме /mcp/* устаревшего SSE.is_answeredIF NOT EXISTS миграция 023 может пропустить столбец в LibSQL, помечая применённую → /api/emails500.addColumnIfMissing + ensureMonoEmailColumns при запуске; миграция 023 просто ADD COLUMN.TestInitSchemaRepairsMissingIsAnswered.email-viewer подкомпоненты; mail-inbox-layout + хуки входящих; api-client.ts.is_answered UI + патчи кеша флагов SSE.:3000 (Next перенаправляет /api, /mcp, /internal).requestPublicBaseURL() — FRONTEND_URL + X-Forwarded-*; URL сообщений MCP SSE безопасны по HTTPS.reverse-proxy.md — Mono / Единый продакшн-прокси (aaPanel, nginx).<meta> из фрагментов писем (предупреждения консоли viewport iframe).; (разделитель миграций SQLite).mcp-tab разрешение ключа во время рендеринга (ESLint CI).IMAP_PER_HOST_CONN ограничивает одновременные соединения на хост; сеансы IDLE/синхронизации больше не занимают слоты (исправляет таймауты слотов мультиаккаунта Gmail при предел ≈ 2×аккаунта).50 молча откатилось к значению по умолчанию 10)..env: IMAP_PER_HOST_CONN, переменные пула синхронизации прописаны во всех prod/test compose файлах + примеры.last_sync_error показывает реальную ошибку; invalid_grant → фатальная ошибка (повторная авторизация); немедленное переподключение после обновления токена (SyncWorker + CheckWorker).