| 2026-10-04 |
feat: страница «MCP-ключи» — выдача и ревок персональных токенов
...
- /mcp-keys в навигации (ph-key): свои ключи + (для админ-роли) ключи всех
пользователей; plaintext показывается один раз в модальном окне с копированием
- сниппет подключения Claude Code с подстановкой origin панели
- i18n en/ru/uk (mcpKeys.*, nav.mcpKeys); auth-off — инфо-карточка без вызова API
- GnCard растянут на всю ширину (max-width:none — дефолт у кита fit-content)
Eugene Sukhodolskiy
committed
7 hours ago
|
feat: страницы сервисов — персональный график + журнал недоступности
...
- GET /services/{id}/incidents: периоды down+degraded из истории проб
(worst-состояние периода, код/причина из первой точки, идущий период end=NULL)
- /services/ график отклика 1h/6h/24h/7d, журнал инцидентов,
самосвидетельство (v/uptime/mode/gauges), редактирование и удаление
- список сервисов: без общего графика, карточка ведёт на страницу сервиса
Eugene Sukhodolskiy
committed
12 hours ago
|
feat: парсер самосвидетельства health-ответов (handbook spec §5)
...
Панель читает расширенное тело health: identity (service/version/build/
environment/uptime|since), mode из белого списка {maintenance, readonly,
draining} — нейтральный бейдж в карточке, gauges — числа чипами.
Белый список известных полей: сырое тело не хранится и не логируется
(эндпоинт без авторизации), bool/вложенные значения в gauges отбрасываются,
неизвестный mode игнорируется (mode ≠ лайвность).
service_samples.report (JSON, NULL = нет самосвидетельства); колонка
добавляется к живым БД guarded ALTER в db.init_db (паттерн будущих
миграций). В API — report в списке сервисов и в истории проб.
Карточка «Сервисы»: v+environment+аптайм (fmtUptime), бейдж mode
(тексты i18n en/uk/ru), чипы gauges; пустые строки не рисуются.
Eugene Sukhodolskiy
committed
12 hours ago
|
feat: health-чекер сервисов — раздел «Сервисы» + спека health-эндпоинтов
...
Панель опрашивает health-URL внешних gnexus-сервисов (GET, параллельно,
каждые GHARD_HEALTH_INTERVAL=30с, таймаут 5с) и показывает их состояние
отдельным разделом: карточки с состоянием/latency/причиной, история
отклика за 24ч (график), retention точек 7 дней.
Прогрессивный минимум интерпретации: 2xx = up; JSON-тело со строковым
status — ok-набор → up, degraded-набор → деградация, незнакомая строка
→ вниз; не-2xx / таймаут / сеть → вниз. Контракт зафиксирован в
docs/health-endpoint-spec.md (минимум + рекомендуемое расширение checks).
- backend: tables services/service_samples, services_probe.py (волны
проб через asyncio.gather, cap тела 64KB), api/services.py (CRUD +
samples, мгновенный замер на POST/PATCH url), config GHARD_HEALTH_*
- frontend: страница /services, api-методы, nav «Сервисы»,
i18n en/uk/ru
Eugene Sukhodolskiy
committed
13 hours ago
|

feat: settings section + i18n (en/uk/ru) for the whole UI
...
Language comes from the gnexus-auth account profile by default; Settings
now hosts a per-service override that survives logouts and profile-webhook
syncs (users table keeps profile JSON verbatim, override in a separate
column that the upsert never touches). Open mode stores the choice in
localStorage.
- backend: users table (zero-migration, IF NOT EXISTS), app/locales.py
(normalize_locale/effective_locale), users upsert on session create and
user.updated webhook, GET /me returns locale + locale_effective,
new PATCH /api/v1/me (cookie-session only; 'auto'/'""' clears override)
- frontend: hand-rolled i18n mirror of gnexus-creds (locale ref, t() with
Slavic plurals, EN fallback), full dictionaries (~130 strings), <html
lang> + <title> tracked via watch; SettingsPage with language picker
(Auto/en/uk/ru); ServerCard/ServerPage/StoragePage status triple and
table columns unified into reactive computed t() lookups; fmtAgo/
fmtUptime localized; nav/login/shell translated; default html lang en
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
14 hours ago
|