- Le patch timeout avait créé un doublon: send() avec timeout puis send() sans timeout
- ws.onmessage défini deux fois (dans connect() et hors connect())
- Nettoyage: ws.onmessage uniquement dans connect(), send() unique avec timeout
- Correction du SyntaxError 'Unexpected end of input' causé par le JS corrompu
- process_request retourne None UNIQUEMENT pour /ws
- Tous les autres chemins (/favicon.ico, etc.) reçoivent 404
- Évite que websockets tente un handshake sur des requêtes HTTP normales
- Ajout reconnexion auto WebSocket avec backoff exponentiel (2s→30s, max 20 tentatives)
- Ajout timeout LLM côté frontend (25s) avec réactivation du bouton
- Réduction timeout serveur httpx 60→45s
- Service systemd user jarvis-v3 (survit aux reboots)
- Launcher Python avec fallback .env si Infisical expiré
- README.md complet (architecture, URLs, roadmap, maintenance)
- .gitignore (venv, pycache, logs)
- Serveur WebSocket direct avec websockets 16.0
- Interface HTML/CSS/JS dark theme avec chat
- Relay vers API Hermes sur port 8642
- Historique de conversation (20 messages)
- Clé API via Infisical
- Testé et fonctionnel sur openclaw1.dev.home:7081