- Anzeigename Voice Assistant -> Alexis (UI-Titel/Kopfzeile mit Untertitel
„Ihr Sprachbegleiter", FastAPI-Titel, README/Handbuch). Technische Identifier
(Dienst, Pfade, Paketname, Konfig-/DB-Dateinamen) bleiben unveraendert.
- Version als EINE Quelle: pyproject.toml = 0.2.0; app.__version__ liest sie
(pyproject zuerst, Paket-Metadaten als Fallback). Sichtbar in der UI-Kopfzeile,
unter /api/config (version) und in OpenAPI.
- CHANGELOG.md mit 0.2.0-Eintrag; Tests fuer /api/config.version + Branding.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Variante 1: Senioren behalten ihren persönlichen Link; zusätzlich ein
Passwort-Einstieg ohne 2FA über Authelia.
- Neuer Endpunkt GET /api/login (app_login): hinter Authelia (nginx-Location
/login, one_factor), erkennt den per Remote-User weitergereichten Nutzer
(Admin ODER normaler Authelia-Nutzer), mintet das va_token-Cookie und leitet
in die App (/). Cookie-Mint in _issue_login_cookie() gemeinsam mit
/api/admin/login refaktoriert.
- "Persönlicher Zugang nötig"-Seite (main.py) bekommt einen großen Knopf
„Mit Benutzername & Passwort anmelden" -> /login. Bare / leitet bewusst NICHT
automatisch um (Senioren ohne Authelia-Konto würden sonst feststecken).
Begleitende Infra (außerhalb des Repos):
- nginx: location = /login (auth_request one_factor -> /api/login).
- Authelia: access_control-Regel voice.jamulix.de -> one_factor (über der
*.jamulix.de-Wildcard); damit sind App-Login UND Admin nur noch 1FA, andere
Subdomains bleiben 2FA.
Tests: /api/login für Nicht-Admin/Admin/ohne-Identität. 257 Offline-Tests grün.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
uvicorn konfiguriert nur seine eigenen Logger -> app.*-INFO-Logs (u. a. die
Notruf-Diagnosezeile geo/geo_error/device) wurden durch den Default-Level
(WARNING) verschluckt. main.py setzt jetzt den "app"-Logger auf LOG_LEVEL
(Default INFO) mit eigenem Handler (propagate=False, kein Doppel-Log).
Verifiziert: "INFO:app.safety.emergency:Notruf von … geo=… device=…" erscheint.
+1 Test, Suite 251 grün.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Zweiter Auth-Weg NEBEN Authelia (nichts schaltet um, kein Aussperr-Risiko):
- Link https://voice.jamulix.de/?k=<token> -> Token landet im va_token-Cookie
(HttpOnly, Secure, SameSite=Lax, 1 Jahr), Token wird aus der URL entfernt.
- Cookie/?k= authentifiziert App-Routen (require_user) und WS (/ws/voice,
/ws/chat). Token = vorhandenes Nutzer-Token (get_user_by_token).
- authenticate(): fehlt der SSO-Header, wird auf Token-Auth durchgefallen
(statt hartem 401) — Voraussetzung für die spätere nginx-Trennung.
Authelia/Forward-Auth bleibt voll funktionsfähig (Live verifiziert: beide
Wege gehen). Tests: Cookie-, ?k=- und Negativ-Pfad. 217 passed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Lifespan-Hintergrundtask laedt profilabhaengig piper-Stimme + faster-whisper-Modell
vor (nur was die aktive Konfiguration nutzt; Cloud-Profile = No-op). Server ist
sofort verfuegbar; der erste Nutzer zahlt nicht mehr den Kaltstart.
Messung: erster Turn direkt nach Start first_audio 1,62 s (statt ~4,5 s mit Kaltstart).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Safari cachte CSS/JS aggressiv -> Aenderungen wurden nicht sichtbar. StaticFiles
liefert die UI nun mit Cache-Control: no-cache aus; Asset-Links zusaetzlich
versioniert (?v=3), damit die neue Version sicher geladen wird.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>