Changelog 10.3.0

MINOR 2026-03-16

LUMA Nova 10.3.0 - Aether Cloud, Orion Hardening & Elyn Patch

Nouveau module — Aether Cloud

  • Lancement du module Aether : stockage personnel chiffre accessible sur /aether
  • Gestion complete de fichiers et dossiers avec hierarchie, corbeille et restauration
  • Chiffrement optionnel AES-256-GCM a la volee pour les fichiers sensibles
  • Historique de versions par fichier avec restauration en un clic
  • Partage public par lien token avec protection par mot de passe, expiration et limite de telechargements
  • Interface de previsualisation inline pour images et PDF
  • Barre de quota de stockage par utilisateur (defaut 5 Go) avec gestion admin
  • Design sombre aligne LUMA (meme palette de tokens que le reste de la plateforme)

Aether — Synchronisation client

  • API delta feed : GET /sync/delta?cursor=<ISO> retourne uniquement les changements depuis le dernier cursor
  • Snapshot complet GET /sync/state pour le premier sync ou full rescan avec quota courant
  • Endpoint GET /files/:id/meta pour comparer les hashes SHA-256 sans telecharger le fichier
  • Upload chunked avec sessions persistantes (init / chunk / commit / cancel) pour gros fichiers et connexions instables
  • Verification d integrite SHA-256 au commit de session avec rejet si checksum invalide
  • Les reponses delta et state incluent desormais le champ path (chemin complet calcule par CTE recursive SQL)
  • Detection automatique du type MIME par extension au commit si le client n en fournit pas (png, jpg, pdf, mp4, zip...)
  • Acceptation flexible des noms de champs a l init de session : original_name/name/filename, total_size/size/fileSize, total_chunks/chunks
  • Correction schema : colonnes reelles aether_files (filename, mime, folder_id, stored_name) alignees dans toutes les requetes sync
  • Correction : suppression de updated_at inexistant sur aether_upload_sessions dans l increment de chunks

Orion — Systeme de salves Agent KO

  • Les alertes Discord Agent OFFLINE ne sont plus envoyees immediatement a la premiere detection
  • Nouveau systeme de salves : 3 verifications consecutives en timeout requises avant notification Discord
  • Evite les fausses alertes pour les agents qui se reconnectent en moins d une minute
  • Le seuil est configurable via la variable d environnement ORION_AGENT_KO_DISCORD_SALVE (defaut : 3)

Elyn — Alertes IP Discord supprimees

  • Les alertes d activite suspecte Elyn (elyn.suspicious_activity) ne declenchent plus de notification Discord
  • Toutes severites concernees (warning et critical), les tickets et l audit interne restent inchanges
  • Reduit significativement le bruit dans les canaux de monitoring Discord

Orion — Validation UUID route agents

  • La route GET /admin/orion/agents/:id valide desormais le format UUID avant la requete PostgreSQL
  • Retourne un 400 propre au lieu d une erreur SQL pour les identifiants malformes ou tronques

Assistant Elyn — Patch hors-domaine

  • L assistant ne repond plus avec un rapport complet sur des questions hors-domaine (calculs, bavardage, etc.)
  • Nouveau handler pour les reponses negatives ("Non", "non merci", etc.) : accuse de reception court sans dump de contexte
  • Guard post-inference ML : si l intent reste incertain apres analyse, reponse de perimetre claire plutot que fallback tout-contexte

Dashboard Admin — Tableau de bord avec graphiques

  • Nouveau panneau de graphiques integre au dashboard admin : trafic 24h (courbe), evenements Shield 7j (barres), jobs (donut), audit 7j (donut)
  • Visualisations en temps reel servies par Chart.js heberge localement (/js/chart.min.js) — aucune dependance CDN externe
  • Endpoint /api/admin/overview/charts avec cache 30s pour les series temporelles
  • Mise en page 4 colonnes responsive (grille CSS) avec breakpoints 1200px / 760px

Admin ACL — Granularite par module

  • Ajout d ACL dediees pour Tickets, Sante systeme et Configuration au lieu du fallback global admin.panel
  • Nouvelle matrice page /admin : Orion pilote par orion.panel, Tickets par admin.tickets.view, Sante par admin.health.view, Configuration par admin.config.manage
  • Lock visuel coherent dans le dashboard (cartes verrouillees selon les permissions reelles)

Securite — Surface API admin reduite

  • L endpoint /api/admin/overview reste protege strictement par admin.panel
  • Extraction des metriques tickets vers un endpoint dedie /api/admin/overview/tickets pour decoupler la carte dashboard des ACL du module Tickets

Nino — Optimisation ninoReleaseNotifier

  • Requete lente (~1.5s) sur nino.releaseNotifier.find remplacee par deux requetes paralleles ciblees via Promise.all
  • Fusion, deduplication et tri effectues en memoire JS apres les deux requetes independantes
  • Recuperation groupee des titres de series en une seule requete SQL (ANY($1::uuid[]))
  • Anti-join reecrit avec NOT EXISTS au lieu de LEFT JOIN ... IS NULL pour une semantique plus claire

Authentification — Suppression des notifications de connexion

  • Suppression de la notification flash "Connexion reussie" generee a chaque login reussi
  • Reduisait le bruit dans le centre de notifications sans apporter de valeur utilisateur

Aether — Architecture & fichiers

  • app/modules/aether/ : module complet avec web.routes.js, api.routes.js, config.js, version.js (0.1.0)
  • app/controllers/aetherController.js : upload/download/browse/share/versioning/chiffrement (1269 lignes)
  • app/controllers/aetherSyncController.js : delta feed, snapshot, metadata legere, upload chunked
  • app/modules/aether/assets/css/base.css : refonte design sombre avec tokens --ae-* miroir LUMA root.css (bg #0B0F1A, accent #6C4DFF)
  • app/modules/aether/assets/js/main.js : SPA filemanager (browse, upload, share, versions, viewer, drag-drop)
  • app/modules/aether/assets/js/share.js : page de partage public (mot de passe, preview, telechargement)
  • app/modules/admin/ : dashboard admin Aether avec overview, partages, quotas, audit (ACL admin.aether.*)
  • app/routes/admin/aether.js + app/routes/api/admin/aether.js : routes admin dedieees

Aether — Base de donnees

  • Migration 170 : tables aether_files, aether_folders (hierarchie, soft delete, owner_id)
  • Migration 171 : table aether_shares (token, password scrypt, expiration, one-shot, max_downloads)
  • Migration 172 : colonnes chiffrement sur aether_files (is_encrypted, encryption_algo, iv, tag, key_version)
  • Migration 173 : permissions ACL admin.aether.view / admin.aether.manage
  • Migration 174 : aether_file_versions, aether_user_quotas, permissions aether.use / aether.share / aether.encrypt
  • Migration 175 : colonne sha256 sur aether_files, table aether_upload_sessions (chunked upload), index (owner_id, updated_at) pour delta feed
  • aetherSyncController.js : CTE recursive folder_tree sur /sync/delta et /sync/state pour calcul du path complet de chaque fichier et dossier
  • aetherSyncController.js : MIME_MAP de 40+ extensions avec fallback par extension au commit de session chunked
  • aetherSyncController.js : correction des noms de colonnes SQL (filename, mime, folder_id, stored_name) — schema reel vs schema genere
  • Orion UUID guard : regex /^[0-9a-f]{8}-...-[0-9a-f]{12}$/i sur GET /admin/orion/agents/:id avant toute requete PostgreSQL

Orion — AgentWatcher (app/jobs/definitions/agentWatcher.js)

  • Suppression du notifyAll() immediat sur transition online->offline
  • Alerte creee avec ko_salve: 1 dans le metadata, sans notification Discord
  • Nouveau bloc offline->offline : incremente ko_salve via jsonb_set, declenche Discord a ko_salve >= KO_SALVE_SIZE
  • Constante KO_SALVE_SIZE lue depuis process.env.ORION_AGENT_KO_DISCORD_SALVE (defaut 3)

Elyn — elynOrionBridge (app/shield/services/elynOrionBridge.js)

  • Filtre channels.filter(c => c.type !== 'discord') remplace l ancien filtre warning-only
  • Supprime toute notification Discord pour elyn.suspicious_activity quelle que soit la severite

Assistant — lumaAssistantService (app/services/lumaAssistantService.js)

  • Ajout flag isNegative dans parseIntent() : regex ^(non|nope|nan|pas vraiment|pas maintenant|non merci|rien)$
  • Return rapide isNegative avant le pipeline de chargement de contexte DB
  • Guard post-transformer : isUncertainIntent() apres mergeIntent() retourne out_of_scope au lieu de useStatus=useNino=useOps=true
  • Resout les cas de dump complet de rapport sur questions hors-perimetre (calculs, smalltalk de refus)

Dashboard Admin — Charts (app/modules/admin/assets/js/admin/dashboard.js)

  • makeLineChart(), makeBarChart(), makeDonutChart() : helpers Chart.js 4.x avec theme sombre unifie
  • applyChartDefaults() : font global Geist/Inter, couleur #CBD5E1, tooltips fond #1E293B
  • loadAndRenderCharts(overviewData) : donut jobs rendu immediatement depuis les donnees overview, puis fetch /charts pour les series temporelles
  • Palette : accent #6C4DFF, danger #FF4D6A, warning #F59E0B, success #22C55E
  • Donut cutout 72% avec centre absolu positionne (transform: translate(-50%, -58%)) pour affichage du total sans debordement
  • app/routes/api/admin/overview.js : GET /charts avec 3 requetes paralleles SQL (trafic par heure, shield par jour, audit par jour)

Admin ACL — Migration 176 & cablage routes

  • Migration 176_admin_module_acl.sql : creation des permissions admin.tickets.view, admin.health.view, admin.config.manage
  • Attribution automatique des 3 permissions aux roles admin et luma (idempotent ON CONFLICT)
  • Routes web admin branchees sur ACL dediees : /admin/tickets, /admin/health, /admin/config
  • Routes API admin branchees sur ACL dediees : /api/admin/tickets, /api/admin/health, /api/admin/config
  • app/routes/admin/index.js : adminAcl du dashboard aligne sur les nouvelles cles, avec Orion mappe sur orion.panel

Hardening API — Overview maintenu + endpoint dedie tickets

  • app/routes/api/admin/overview.js : endpoint overview maintenu actif sous requireACL(admin.panel)
  • Ajout GET /api/admin/overview/tickets (ACL admin.panel, cache court) pour alimenter la carte Tickets du dashboard sans dependre de /api/admin/tickets/stats

Nino — ninoReleaseNotifier (app/jobs/definitions/ninoReleaseNotifier.js)

  • Remplacement du CTE UNION ALL unique par deux requetes SQL independantes executees en Promise.all
  • Requete publish_at : index couvrant partiel idx_nino_videos_release_notify_publish_cover (migration 162)
  • Requete created_at : index couvrant partiel idx_nino_videos_release_notify_created_cover (migration 162)
  • NOT EXISTS (SELECT 1 FROM nino_video_release_notifications n WHERE n.video_id = v.id) remplace LEFT JOIN ... IS NULL
  • Fusion JS : Set pour deduplication, sort par release_at DESC, slice(0, safeLimit)
  • Fetch series groupee : SELECT id, title FROM nino_series WHERE id = ANY($1::uuid[])

Auth — Suppression notification login (app/routes/api/auth/login.js)

  • Suppression de l appel createNotification({ kind: 'quick_login' }) sur chaque authentification reussie
  • Suppression de l import createNotification devenu inutile

Release Notes

  • Bump LUMA 10.3.0
  • Aether Cloud : version module 0.1.0 (beta privee)
  • Nouvelle variable env : ORION_AGENT_KO_DISCORD_SALVE (defaut 3) — les notifications agent KO sont retardees de N cycles watcher
  • Non-breaking : suppression Discord Elyn IP, patch assistant, UUID guard Orion, suppression notif login