WS Gateway
Stateless WebSocket proxy. Accepts Electron connections, authenticates JWT, routes frames to Chat/Batch services via Redis pub/sub.
No business logic
This service does NOT know what tasks, notes, or agents are. It only routes JSON frames between Electron and downstream services.
Scaling
Sticky sessions on user_id (Traefik consistent hashing).
Redis channels used
- Subscribe:
ws:out:{user_id}(frames to send to client) - Publish:
chat:request:{user_id},batch:request:{user_id} - LPUSH:
tool:result:{call_id}(from client tool_result frames) - HSET/HDEL:
ws:devices:{user_id}(device registry)