* [aidan] ui: sidebar reorder
* [aidan] ux: sidebar naming bug fix
* [aidan] ui: title changing improvements
* [aidan] ui/ux: aux title gen streams for cx/ route + agent writes meta.json first
- All aux LLM calls (chat title, turn label, group meta, dashboard name) now stream
instead of using messages.create; 9router's cx/ subscription response translator
drops content for GPT-5-family models on the non-streaming path but works per-event.
- aux_max_tokens_for floors GPT-5 budget at 4K so reasoning still leaves headroom for
a label; non-reasoning models get the base 100.
- App Builder skill: write meta.json FIRST (step 1 of Quick start) so the app's name
surfaces in the sidebar + ViewEditor header on the agent's first tool call instead
of waiting until end-of-turn.
- Session-end sync_output_from_meta_json takes a fallback_name (= session.name) so an
agent that never writes meta.json still leaves the app with the aux-LLM chat title
rather than "Untitled App".
- Title display: truncateForTitle caps at 4 words / 30 chars; displayChatTitle picks
the right Phase 1 placeholder by session.mode; normalizeSessionName strips legacy
Agent-XXXX names at slice intake.
- Typewriter component (char-by-char delete-then-type) drives the chat header,
dashboard card title, sidebar Apps entry, and ViewEditor TextField + description
field; honors useReducedMotion.
* [aidan] tune: reduce gpt-5 aux token floor
duplicate_dashboard cloned the layout but left every browser_card pointing at
the source's browser_id and never copied the sessions, so the new dashboard
showed the browser but no chat. Now we mint fresh browser_ids, duplicate every
session attached to the source dashboard (in-memory + on-disk), remap
browser_id / parent_session_id / spawned_by / cards / expanded_session_ids onto
the new ids, and persist via _save_session. Also restores top-level agent cards
(layout.cards), which were silently dropped on duplicate.
reasoning text" note instead of vanishing); friendlier MCP tool names (Gmail/Slack/etc with verb-derived actions); auto-collapse Anthropic
thinking pill on turn end so the answer comes first; header timer matches per-turn pill (sums in ms, rounds once); thinking pill rolls 251s
to 4m 11s; parallel tool count chips do not jitter as N grows; drop Gemini 2.5 from picker (Gemini 3 family only); aux-LLM calls route
per-model so cheap-tier auxiliary calls do not 401 on cc/ subscription routes
- 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