Brings the branch current with dev (was 18 behind) so the PR
squash-merges into dev with zero conflicts. Resolved 6 conflicts:
- backend/main.py: keep both workflows and telegram_bot SubApps
- backend/auth.py: keep the Spotify OAuth callback path exemptions
- backend/apps/agents/agent_manager.py: take the deletions of
_build_connected_tools_context, _approx_tokens, and
_summarize_message_block (confirmed dead, zero callers on dev)
- backend/apps/tools_lib/tools_lib.py: keep both dev's
google_oauth_token_proxy and the MCP credential endpoints
- electron/main.js: keep both the Instagram MCP CLI helpers and
dev's one-line waitForBackend comment
- frontend/src/app/pages/Tools/Tools.tsx: keep the credential dialogs
Also widens the Tools.tsx snackbar severity union to include
'warning', a value its own code already passes (a pre-existing type
error surfaced once dev was merged and tsc was run).
Verified: 832 backend tests pass, webpack build succeeds, tsc clean
except one pre-existing allowpopups error in dev's BrowserCard.tsx.
in sentence case; activating an MCP mid-chat now actually works instead of the model guessing at made-up tool names. Also a bunch miscelaneous ui/ux tweaks, I cant be bothered :)
drop) instead of flipping to completed. Adds heartbeat (25s ping/10s pong), reconnect with infinite jittered backoff, outbound queue gated
on resume_ack, gap_detected fallback for long offlines, on-disk persistence of terminal events for post-restart recovery, and a
reconnecting connection state decoupled from session.status. 1089 backend tests covering 500 randomized disconnect scenarios + concurrent
broadcast races. Backend/WS handler does not cancel agent task on disconnect
- Add BUILTIN_MODELS for OpenAI (GPT-5.4/Mini/5.3-Codex), Google (Gemini 3 Pro/Flash, 2.5 Pro/Flash), and GitHub Copilot
- Add resolve_model_id_for_sdk() and resolve_aux_model() to route prefixed model IDs (cx/, gc/, gh/) through 9Router translator
- Add GET /agents/models endpoint returning available models based on live 9Router connection state
- Enable ENABLE_TOOL_SEARCH=auto for all providers so non-Claude models get full tool access (23 built-in + all MCPs)
- Add thinking block streaming support (ThinkingBlock in stream handler + AssistantMessage) for reasoning models
- Fix Gemini 3 thought-signature errors: use skip_thought_signature_validator per Google docs
- Fix WebSearch blocked_domains/allowed_domains empty-list rejection on Anthropic API
- Fix browser_agent text_parts UnboundLocalError on non-Claude models
- Fix auxiliary LLM calls (title gen, group meta, dashboard naming, view builder, browser agent) via resolve_aux_model
- Add Codex OAuth callback listener on port 1455 for ChatGPT Plus subscription connect
- Route Gemini OAuth through system browser since Google blocks embedded webviews
- Override Electron popup user-agent for OAuth
- Fix duplicate OAuth callback with idempotent completed_oauth tracking
- Fix Settings modal tab routing and stale warning banner
- Add API key inputs for OpenAI, Google, and OpenRouter
- Add MCP warning banner when selecting non-Claude model with many tools
- Force session fork on cross-provider model switch to prevent transcript corruption
- Disable GitHub Copilot subscription card (9Router poll issue, marked preview)
- Delete dead CopilotProvider import and unused CopilotAuthButton component
- browser_agent.py: use get_anthropic_client instead of raw api_key, fix model map for 9Router
- credentials.py + agent_manager.py: subscription (9Router) checked before API key everywhere
- main.py: clean browser-agent endpoint, no credential params
- tools_lib.py: when uvx not found, fall back to pip-installed binary from venv
- requirements.txt: add google-workspace-mcp so it works without uvx