| 2026-10-03 |

feat: раздел Настройки (.env-оверрайды UI) и PWA с web-push каналом
...
Настройки: реестр app/settings_registry.py + хранение оверрайдов в
app_settings (settings_store, без кэша). Дефолт из .env, перебивается из
админки без перезапуска. Секреты (VAPID private, тг-токен, SMTP-пароль)
— write-only: записываются через UI, никогда не возвращаются API.
Эндпоинты GET/PUT /api/v1/admin/settings.
Web-push: канал push (целенаправлен как user — адресат из payload.user_id),
таблица push_subscriptions, самопользовательская подписка браузера через
/me/push* (upsert по endpoint, чужой 404). Воркер send_push: pywebpush
(DER base64url ключи), 404/410 — подписка удаляется, ретраи как у s2s.
PWA: manifest + sw.js (pass-through, push/notificationclick), иконки из
gnexus-mark.svg, /settings с личным пуш-блоком и админ-конфигами.
Миграция 0006 (ck_channel ×3 +push, app_settings, push_subscriptions).
Верификация: 47 бэкенд-проверок + mecheck/retcheck + 17 puppeteer — ALL OK.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
6 hours ago
|

feat: многопользовательский режим — личный лог по каналу user
...
- Конвенция payload.user_id (sub gnexus-auth): контракт v1 цел, получателей
в конверте нет — дописка в docs/05-ingestion-api.md.
- Канал user в CHANNELS: правило с действием user направляет событие в личный
лог пользователя; без payload.user_id — skipped-delivery с причиной (аудит).
- deliveries.recipient_user_id + ix_deliveries_recipient; миграция 0004
пересоздаёт ck_channel на всех трёх таблицах (deliveries, routing_rule_actions,
channel_targets).
- Routing: _throttled по recipient для user-канала; s2s без цели — прежний
ретрай-цикл.
- Правила: действие user валидно без цели, user + target_id — 422; TargetIn
по-прежнему отвергает user.
- GET /api/v1/me (любой аутентифицированный) и GET /api/v1/me/events (личный
лог строго по своему sub, дедуп по событию).
- OAuth-колбэк: токен выдаётся любому аутентифицированному, роль решает только
раздел; adмин-API остаётся под 403.
- SPA: роль-гейт в router (user -> /my-events, прямой заход в админ-маршруты
редиректит), нав от роли, MyEventsView («Мои события»), getSession-кэш.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
8 hours ago
|
Routing Engine полный (#30): payload-матчинг, all/first, шумодав, ретраи
...
- условия правила: payload-матч (точный по top-level ключам, список = any-of)
- ROUTING_MATCH_MODE=all|first (дефолт all — применяются все подошедшие)
- шумодав: throttle_seconds у правила, окно на (channel,target), skipped-
записи с аудит-текстом; critical проходит всегда (договор docs/05)
- ретраи: beat (worker -B) + synapse.retry_due раз в минуту, паузы
30с/2м/10м/30м, 5 попыток -> failed; миграция 0003 (throttle_seconds
+ status skipped в CHECK)
- CLI: --payload и --throttle у add-rule; README/.env.example/docs/04/05
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
23 hours ago
|
s2s: description источника — в реестре, не в теле вебхука
...
Уточнение к 3748cb5: description — атрибут записи источника в админке
Synapse, конверт события и s2s-доставка его не несут; получатель видит
имя в X-Synapse-Source.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
23 hours ago
|
s2s: HMAC-подпись доставок (схема gnexus-auth) + description у источников/целей
...
- docs/05: раздел «Доставка s2s» — подпись t=<unix>,v1=hmac_sha256(secret,
"<t>.<body>") с константным сравнением и окном свежести, заголовки как у
gnexus-auth (X-Gnexus-Event-*) плюс X-Synapse-Source; секрет per-target,
в БД только token_ref; тело доставки несёт source_description.
- model/миграция: description (Text) у sources и channel_targets — кто это,
для ИИ-агента и человека, не гадать по названию.
- CLI: --description у create-source и add-target.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
23 hours ago
|
| 2026-10-02 |
Схема БД v1 (#34): 7 таблиц + миграция в alembic
...
Конфигурация: sources, api_keys (sha256-хэши, ротация), notification_types
(уникальная тройка source/subject/action), channel_targets (креды каналов —
не здесь, в .env), routing_rules (+actions, условия JSONB, weight).
Поток: events (UUID, dedup-индекс, expires_at, CHECK-статусы), deliveries
(attempts/next_retry_at, rendered_message — аудит).
- alembic upgrade head из пустой базы — проверено в контейнере
- ORM roundtrip всей цепочки — проверен, демо-данные вычищены
- docs/04-database.md: схема, решения, что сознательно не в таблицах
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
23 hours ago
|