Синхронизация с gnexus-handbook: healthz, /mcp-protocol/, блокировка, i18n
Часть A — точечные несоответствия:
- GET /healthz (alias к /api/healthz) — требование хендбука 10-platform/health.

Часть C — MCP второго маршрута и блокировка:
- /mcp-protocol/ вторым маршрутом (конвенция 10-platform/mcp.md, слэш значим
  для реверс-прокси); FastMCP-саб-аппу скармливается канонический /mcp.
  /mcp остаётся историческим alias'ом (docs/07).
- Вебхуки gnexus-auth user.blocked/deleted/archived и user.unblocked/restored
  ставят/снимают флаг в новой таблице user_prefs (миграция 0009); resolve_
  personal_token гонит заблокированных и отвечает тем же 401, что и при
  неверном токене. Статический MCP_TOKEN не затрагивается. SSO-логаут
  токены не трогает (решение владельца).

Часть B — i18n по конвенции 10-platform/i18n.md (ru база + en + uk):
- frontend/src/i18n/ — модуль по паттерну gnexus-creds (t() c интерполяцией
  и славскими плюрализациями, fallback en) + словари-сообщения (386 slug'ов);
  все 15 вьюх и App.vue переведены на t(), module-консты с текстами — в
  computed (грабли i18n.md); ui.js fmtTime — на Intl.DateTimeFormat;
  push.js/local строки — в словарь.
- Язык: override в user_prefs.locale, эффективный = override → locale аккаунта
  (profile.locale, нормализация до 2-буквенного префикса) → en; GET /me
  возвращает locale/locale_effective, PATCH /me принимает en|uk|ru|auto.
  Выбор языка — в Настройках (всем ролям), опции родными именами.
- Серверная локализация: Accept-Language от SPA; app/i18n_server.py —
  каталог точных строк + regex-паттерны для параметризованных detail
  (exception-handler StarletteHTTPException в main.py); labels/help реестра
  настроек локализуются на лету.
- apiFetch: шлёт Accept-Language; 422 detail (список) собирается в строку.

Хендбук (отдельный репо): notifications.md — конвенция интеграции сервисов
(источник/ключ/конверт v1/client-libs/webhook-цель), mcp.md и auth.md —
референс-варианты Synapse, чеклист нового сервиса ссылается на notifications.md.
1 parent 689ea95 commit 597fb30be074aa057a281a2a5331eeaac5c48bf9
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 4 hours ago
Showing 38 changed files
View
README.md
View
alembic/versions/20261004_0009_user_prefs.py 0 → 100644
View
app/api/admin_routes.py
View
app/api/auth_routes.py
View
app/api/me_routes.py
View
app/api/routes.py
View
app/auth/stores.py
View
app/i18n_server.py 0 → 100644
View
app/main.py
View
app/mcp/context.py
View
app/models/__init__.py
View
app/models/dicts.py
View
docs/04-database.md
View
docs/07-mcp.md
View
frontend/src/App.vue
View
frontend/src/api.js
View
frontend/src/components/RuleForm.vue
View
frontend/src/i18n/index.js 0 → 100644
View
frontend/src/i18n/messages/en.js 0 → 100644
View
frontend/src/i18n/messages/ru.js 0 → 100644
View
frontend/src/i18n/messages/uk.js 0 → 100644
View
frontend/src/push.js
View
frontend/src/ui.js
View
frontend/src/views/DashboardView.vue
View
frontend/src/views/DeliveriesView.vue
View
frontend/src/views/DeniedView.vue
View
frontend/src/views/LoginView.vue
View
frontend/src/views/McpKeysView.vue
View
frontend/src/views/MyEventsView.vue
View
frontend/src/views/OauthCallbackView.vue
View
frontend/src/views/RuleDetailView.vue
View
frontend/src/views/RulesView.vue
View
frontend/src/views/SettingsView.vue
View
frontend/src/views/SourceDetailView.vue
View
frontend/src/views/SourcesView.vue
View
frontend/src/views/TargetDetailView.vue
View
frontend/src/views/TargetsView.vue
View
frontend/src/views/TypesView.vue