Commit Graph

26 Commits

Author SHA1 Message Date
abaede799e Claude: persiste le backoff OAuth sur disque (un redéploiement ne re-sollicite plus le 429)
Le backoff anti-429 du refresh OAuth vivait uniquement en mémoire : chaque
redéploiement le remettait à zéro et re-sollicitait IMMÉDIATEMENT l'endpoint de
refresh rate-limité, entretenant le 429 qu'on cherche justement à laisser retomber.

Persiste backoff_until + le palier exponentiel (failures) sur /data
(claude_oauth_state.json), écriture atomique best-effort à la manière du cache
trackers. Chargé une fois par process en tête de fetch_usage, sauvé à chaque
échec et effacé à chaque succès. Un token frais court-circuite de toute façon le
backoff, donc un re-login isolé débloque immédiatement même si une fenêtre court.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 01:04:53 +02:00
jerem
df66d33031 Rend l'ensemble du repo agnostique de l'infra perso (paths/domaines/services paramétrés) 2026-06-19 00:13:50 +02:00
jerem
0f2272b224 Retire l'intégration Home Assistant (code mort + config + env.example) 2026-06-18 23:36:48 +02:00
53fefd4654 Claude: refresh OAuth proactif + erreurs fatales distinctes (fini les reconnexions manuelles)
Le refresh token est rotatif : la chaîne se régénère seule indéfiniment tant que
le nouveau token est persisté. La reconnexion manuelle n'était requise que lorsque
cet invariant cassait. Trois correctifs :

- Refresh PROACTIF : on rafraîchit dès qu'il reste < 2h sur le token (~8h de vie)
  au lieu des 2 dernières minutes. Un échec transitoire a des heures de marge avant
  que l'access token meure ; la fenêtre où un kill/timeout perd le token rotatif
  fraîchement rotaté passe de ~8h à quelques ms. Réglable via
  MONITORINK_CLAUDE_REFRESH_LEAD_MIN (défaut 120).
- Distinction FATAL vs TRANSITOIRE : 400 invalid_grant / 401 sur l'endpoint token
  -> _RefreshFatal, sans backoff ni re-soumission en boucle (évite la reuse-detection
  qui révoque toute la famille). 429/5xx/réseau gardent le backoff exponentiel.
- Visibilité + auto-réparation : le cas fatal affiche "Reconnexion Claude requise"
  (pas de repli cache silencieux) et l'alerte se referme seule dès qu'un token frais
  réapparaît sur disque (re-login isolé), sans redémarrer le conteneur.

Timeout du POST de refresh porté à 45s (réglable, MONITORINK_CLAUDE_REFRESH_TIMEOUT)
pour réduire la fenêtre de perte du token après rotation serveur.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 10:46:21 +02:00
Jerem
2c5acc1e36 Claude: backoff exponentiel du refresh OAuth (corrige le 429 perpétuel)
Le token d'accès vit ~8h ; à expiration, fetch_usage retentait un refresh à
chaque rendu (~15min) avec un backoff fixe de 5min toujours déjà expiré. Chaque
tentative re-saturait le rate-limit /v1/oauth/token -> 429 en boucle (>15h
observé), token jamais rafraîchi, usage figé sur la dernière valeur en cache.

- backoff exponentiel 10min -> 6h (au lieu de 5min fixes), réinitialisé sur succès
- respect de l'en-tête Retry-After quand il dépasse le palier
- logging succès/échec du refresh (le chemin n'en avait aucun -> diag à l'aveugle)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 09:58:02 +02:00
jerem
767e514dad Trackers: horodatage discret de la dernière maj des données (cache 1h) 2026-06-17 15:33:13 +02:00
jerem
b6e8aa7225 Trackers: cache 1h + persistance disque (/data) pour survivre aux redéploiements 2026-06-17 12:06:02 +02:00
jerem
7f5bbd6b08 Trackers: libellé jetons unifié en "token" (torr9 + tr4ker) 2026-06-17 11:50:13 +02:00
jerem
c253ecf226 Trackers: yggreborn affiche aussi envoyé/reçu (tuiles /account/)
Lecture des tuiles Upload/Download de /account/ (libellés Go/To gardés tels quels
via up_str/down_str pour conserver les décimales). Condition io -> has_io.
2026-06-17 11:22:46 +02:00
jerem
df9f384d57 Trackers: ajoute yggreborn (Flask, login email+CSRF), ratio seul
Type yggreborn : login form classique (identifier=EMAIL, password, csrf_token),
ratio lu dans l'en-tête (Ratio : X.XX). Pas de up/down ni jetons (ligne envoyé/
reçu rendue conditionnelle sur up/down>0).
2026-06-17 11:09:48 +02:00
jerem
f6f6694215 Trackers: ajoute tr4ker (SPA React, auth cookie) + jetons Crédit
Type tr4ker : login cookie TR4KER_session via POST /api/auth/login {identifier,
password}, profil GET /api/me. Ratio = (uploaded+bonus_upload)/(downloaded+
bonus_download), garde-fou download=0 -> 1 Go. Jetons = champ money, libellé
token_currency_name (Crédit).
2026-06-17 10:57:07 +02:00
jerem
c4e5c141aa Trackers: affiche les jetons de seed (torr9 jeton_balance)
Champ tokens optionnel sur TrackerStat (None = tracker sans jetons) ; torr9 le
remplit depuis jeton_balance de /users/me. Ligne « N jetons » conditionnelle sous
envoyé/reçu, masquée pour les trackers sans système de jetons (c411).
2026-06-17 10:43:32 +02:00
jerem
291a076759 Trackers: ajoute le type torr9 (login JWT + /api/v1/users/me)
torr9 a une API Go dédiée (api.torr9.net) avec auth JWT (username/password).
Le ratio se calcule (total+bonus) up/down comme le frontend ; pas de champ
ratio dans l'API. Le passkey du compte ne sert qu'au RSS, pas au profil.
2026-06-17 10:39:09 +02:00
jerem
4680092f8a Trackers: section ratio/envoi/réception sous le NAS (c411, extensible)
Nouveau module integrations/trackers.py : pour chaque tracker configuré (env
MONITORINK_TRACKERS + bloc par clé), récupère ratio/uploaded/downloaded. Type
unit3d_nuxt (c411) : login session (CSRF meta + /api/auth/login) car le ratio
n'est pas lisible au token API ; session réutilisée, résultat caché (TTL 30 min).
Section dashboard sous le NAS, style instrument 1-bit. Architecture par type pour
ajouter d'autres trackers ensuite.
2026-06-17 10:04:30 +02:00
jerem
3782738d57 Dashboard: refonte design « instrument 1-bit » (jauges graduées, polices vendorisées, glyphes météo)
- Identité noir & blanc pur (zéro gris, anti-ghosting e-ink) ; hachures pour conso/alarme
- Typo vendorisée : Archivo (mots) + JetBrains Mono (nombres tabulaires), @font-face base64
- Jauge signature : noir = restant, repère seuil 20 %, hachures sous le seuil
- Météo : glyphes 1-bit en silhouette (weather.kind) au lieu d'emoji couleur
- Layout rééquilibré (plus de débordement), états dégradés soignés
- dev/preview.py : aperçu hors-ligne du template
2026-06-15 22:56:56 +02:00
jerem
0f6286c154 claude_usage: backoff après échec de refresh OAuth (anti-429)
Token expiré -> refresh tenté à chaque rendu, échec non mémorisé -> on martelait
platform.claude.com et le 429 s'entretenait. On impose désormais un backoff de 5 min
après un refresh échoué (et sur la voie de refresh forcé 401), pendant lequel on sert
la dernière valeur connue au lieu de re-tenter.
2026-06-15 19:50:52 +02:00
jerem
c7395d1c37 Refresh partiel e-ink : ne redessine que la zone changée, full refresh ~1h
Backend : endpoints /frame.meta (ligne 'MODE X Y W H SEQ') + /frame.png qui
servent un crop de la zone modifiée (diff PIL par client) ou l'image pleine.
Full refresh forcé tous les N cycles (MONITORINK_FULL_EVERY=12, ~1h) ou si la
zone change sur plus de 60% de l'écran. Mode 'noop' quand rien ne change.

Anti-429 : l'usage Claude est mis en cache (MONITORINK_USAGE_TTL=120s) avec
repli sur la dernière valeur connue en cas d'erreur transitoire.

Kobo : monitorinkloop.sh récupère meta puis png et fait un fbink partiel
(-g file=,x=,y=) sans flash, full refresh (-c -f) en mode full. Refresh 5 min.
2026-06-15 18:42:32 +02:00
jerem
ba7ea0af3f Affiche la batterie de la Kobo (push via params /image.png) en pied de page 2026-06-15 16:01:09 +02:00
jerem
0178f596ef Codex: vraies jauges 5h/hebdo via wham/usage (token Hermes monte ro) 2026-06-15 15:49:58 +02:00
jerem
319ff3f552 Ajout section Codex (conso 7j + statut limite) via dashboard Hermes 2026-06-15 15:27:13 +02:00
jerem
ca8f725b3a Ajout section NAS (disques, docker, port VPN) via nas_monitor /api/status 2026-06-15 14:58:56 +02:00
jerem
8dad6454f5 Extra usage: montants en euros (centimes/100), affiche utilise / plafond mensuel 2026-06-15 14:51:27 +02:00
jerem
ec1c8226a7 Extra usage: afficher le restant en priorite (restant / utilise / plafond) 2026-06-15 14:41:06 +02:00
80c8d0ac93 Affichage des crédits extra_usage + parser validé contre réponse réelle 2026-06-15 11:08:10 +02:00
74d33eb693 Claude: passage au login isolé + refresh (scope user:profile requis par /usage) 2026-06-15 11:03:51 +02:00
bc4cf89a4b Backend Monitorink: serveur PNG (Claude usage + météo + HA) 2026-06-15 10:49:31 +02:00