feat(profile): selezione del profilo di cui vedere le sessioni (v0.5.0)

- Impostazioni > Sessions: selettore "Profile" (elenco da /api/profiles;
  "(server active)" come prima voce = nessun cookie di profilo)
- ApiClient: fetchProfiles() + switchProfile(); lo switch usa
  /api/profile/switch (process_wide=False lato server: il cookie firmato
  hermes_profile scopa le richieste dell'app per-client; il profilo attivo
  globale del server non viene toccato); refresh automatico delle sessioni
- CookieJar::removeCookiesByName per l'opzione "(server active)"
- Il profilo scelto viene riapplicato automaticamente dopo il login
- i18n: nuove stringhe tradotte it/fr/de
This commit is contained in:
2026-09-12 22:46:27 +02:00
parent 22ccb49424
commit 7b8e5e1102
15 changed files with 421 additions and 104 deletions
+3 -3
View File
@@ -76,12 +76,12 @@ richiede il probe WebUI su :8899). Esito 12/09/2026: unit 9/9, live completo OK.
```bash
cd ~/workspace
tar czf harbour-hermes-0.4.0.tar.gz \
--transform 's,^harbour-hermes,harbour-hermes-0.4.0,' \
tar czf harbour-hermes-0.5.0.tar.gz \
--transform 's,^harbour-hermes,harbour-hermes-0.5.0,' \
--exclude='.git' harbour-hermes
```
Lo spec si aspetta la directory `harbour-hermes-0.4.0/` (pattern degli altri
Lo spec si aspetta la directory `harbour-hermes-0.5.0/` (pattern degli altri
progetti: cercato in modo robusto anche per i sorgenti live di sfdk).
## Traduzioni
+22 -1
View File
@@ -173,7 +173,28 @@ Annullamento: `GET /api/chat/cancel?stream_id=ID` →
- Engine: `edge` (default, gratis), `elevenlabs`, `openai` (richiedono chiavi
configurate sul server). `browser` è solo client-side, non usabile qui.
## 5. Note operative
## 5. Profili (selezione dell'utente)
Le sessioni del WebUI appartengono a un *profilo* (campo `profile` nel payload
di `/api/sessions`). Il client sceglie di quale profilo vedere le sessioni con
lo switch per-client:
| Endpoint | Metodo | Note |
|---|---|---|
| `/api/profiles` | GET | `{"profiles": [{"name", "path", "is_default", "is_active", ...}], "active": "..."}` |
| `/api/profile/switch` | POST | body `{"name": "carlo"}` → `200` + `Set-Cookie: hermes_profile=<name>.<firma>` |
Il cookie `hermes_profile` e' **firmato lato server** (HMAC legato al token di
sessione, anti-forging): il client non puo' inventarlo, deve riceverlo dallo
switch e conservarlo nel cookie jar. Da quel momento **tutte** le richieste
dell'app sono profilate lato server (`server.py` applica il profilo
per-request dal cookie). Lo switch usa `process_wide=False`: **il profilo
attivo globale del server non viene toccato** (la vista del browser resta la
sua). Per tornare al profilo attivo del server basta rimuovere il cookie.
Validato contro il server reale (2026-09: switch → 200 + Set-Cookie firmato;
profilo inesistente → 404 `Profile 'x' does not exist`).
## 6. Note operative
- Tutti gli errori API sono JSON `{"error": "..."}`.
- Il server non espone CORS: il client nativo non serve preflight.