b6e71e32f5
Three fixes for multi-session terminal bugs: 1. Race-condition double creation: The auto-create effect fired twice because loadSessions returned 0 while an earlier createSession was still in flight. Added hasAutoCreated guard ref to ensure only one auto-create happens. 2. Page reload spawns new sessions: After server restart, list_terminal_sessions filtered out DB-only sessions (no in-memory counterpart), so the frontend thought no sessions existed and auto-created new ones. Reverted the filter so DB rows are always returned. The WebSocket handler now restores the in-memory session from the DB row on demand when connecting. 3. No input after connection: The backend _read_loop would break on any send error, causing asyncio.wait to cancel the _write_loop. Made _read_loop retry up to 3 times before giving up, preventing transient send errors from killing input handling. Quality gates: pytest (15/15 passed), tsc clean