P4-B: notifications Web Push (VAPID) sur passage en waiting

- db: migration id=4 `push_subscriptions` (liées au token d'auth) ; clés VAPID en settings
- PushService: bootstrap idempotent des clés VAPID, subscribe/unsubscribe/count,
  notify() best-effort (purge des abonnements 410/404 Gone) ; sender injectable pour les tests
- routes/push.ts: GET vapid-public-key, POST subscribe/unsubscribe/test (toutes sous auth globale)
- pty-manager: déclencheur push sur FRONT MONTANT vers waiting, débouncé 1500ms et annulable
  (faux positif ignoré) ; câblage app/index/config (--vapid-contact)
- shared/api.ts: types VapidKeyResponse / PushSubscribeRequest / PushUnsubscribeRequest
- deps: web-push (+ @types/web-push) côté serveur
- tests: push-service (idempotence, UPSERT, 410-purge, payload) + trigger pty-manager (169 verts)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Johan LEROY
2026-06-15 12:13:56 +02:00
parent 9f7c13dddb
commit 28b9283825
13 changed files with 493 additions and 11 deletions

View File

@@ -90,3 +90,16 @@ export interface AdoptWorktreeRequest {
runHooks?: boolean;
preTrust?: boolean;
}
// ---- Web Push (P4) ----
export interface VapidKeyResponse {
/** clé publique VAPID (applicationServerKey côté navigateur). */
key: string;
}
export interface PushSubscribeRequest {
endpoint: string;
keys: { p256dh: string; auth: string };
}
export interface PushUnsubscribeRequest {
endpoint: string;
}

File diff suppressed because one or more lines are too long