7ce2af18c9
Mergeb6f89f9('integrate main restructuring into dev') took main's smaller refactored versions and overwrote dev-specific features. Restored from dev commit51a399cand ancestors: Backend terminal (c754984,37134b8): - terminal_session.py: asyncio.add_reader event-driven I/O, flow control (64KB pause/32KB resume), 2ms output batching, binary WebSocket frames, EOF detection, circular replay buffer - terminal_manager.py: named sessions, MaxSessionsExceededError, TerminalSessionModel persistence, idle timeout cleanup - terminal.py: dual WebSocket routes (/terminal and /terminal/{session_id}), SessionRef mutable reference for session resets SSH key mounting (c6b804b): - instance_lifecycle.py: _mount_ssh_keys helper that prepares multiple SSH keys with unique filenames (id_ed25519_<name>), writes combined SSH config, mounts single ~/.ssh directory - tool_instance.py: ssh_key_ids JSON column - schemas/tool_instance.py: ssh_key_ids field in CreateInstanceRequest - tool_instances.py: pass ssh_key_ids through create endpoint and response Quality gates: py_compile passed, ruff passed on all edited files