- Replace rust-embed + startup brotli/gzip compression with memory-serve (build-time compression, zero startup cost)
- Remove rust-embed, brotli, flate2, mime_guess dependencies
- Closes #613
- Upgrade axum 0.7 to 0.8, ws-bridge 0.1 to 0.2, tokio-tungstenite 0.24 to 0.28
- Upgrade tower-cookies 0.10 to 0.11, tower_governor 0.4 to 0.8
- Migrate route paths from
:paramto{param}syntax
- Add
agent-portal service logscommand with-n(line count) and-f(follow) options
- Resume existing Claude sessions on launcher restart instead of creating new ones
- Fix admin stats page crashing on non-401/403 error responses
- Render each message in assistant groups as its own component so only new messages re-render
- Revert thread_local expanded state hack (no longer needed)
- Fix expanded "... more chars" content collapsing when new messages arrive
- Upload progress bar fills over 1.5s minimum and collapses with animation after completion
- Defer stale session cleanup on backend startup to give proxies time to reconnect, fixing sessions disappearing from the pills menu after a backend restart
- Add
agent-portal service start,stop, andrestartsubcommands
- Fix awaiting-input detection to skip noise message types (portal, error, system, rate_limit_event)
- Extract shared
is_claude_awaitingfunction used by both REST load and WebSocket paths
- Auto-delete completed cron sessions to prevent UI clutter (costs preserved)
- Hide cron sessions by default in the session rail
- Fix admin stats endpoint returning empty body due to SQL type mismatch (COALESCE returns numeric, Diesel expects float8)
- Fix send bar not clearing after sending with attachments
- Consolidate remaining duplicate user ID extraction into shared auth module
- Convert scheduled_tasks and proxy_tokens handlers to use AppError
- Add unified AppError type for backend handlers with structured error responses
- Consolidate duplicate auth extraction into shared
auth::extract_user_id - Convert sessions, messages, launchers, and sound_settings handlers to use AppError
- Remove stale cli-tools crate and dead API types
- Remove unused dependencies from backend, proxy, launcher, and shared
- Auto-renew launcher auth tokens over WebSocket when within 7 days of expiry
- Add token expiry warning icon on session pills for sessions from launchers with expiring tokens
- Add Launchers tab to Settings page with manual token renewal button
- Add POST /api/launchers/:id/renew-token endpoint for manual token renewal
- Fix Codex sessions failing to start from launcher: resolve binary path via
whichbefore spawning
- Add favicon and browser tab icon for link previews
- Fix multiline user input getting flattened when rendered in message history
- Bake user's PATH into systemd/launchd service so spawned agents can find
claude
- Fix install script:
agent-portal install→agent-portal service install
- Version bump to 2.0.1
- Add Linux aarch64 support (CI builds, auto-update, install script)
- Fix session reconnect race: old connection cleanup no longer overwrites newer connection's registration
- Fix oneshot drop race causing launcher sessions to not reconnect on server restart
- Show proxy version badge in session pill, color-coded by staleness
- Break up settings.rs into sub-components (TokensPanel, SessionsPanel, SoundsPanel)
- Update claude-codes to 2.1.51 (typed enums for message fields)
- Handle unparsable CLI messages gracefully instead of crashing sessions
- Detect subagent task completion via tool_result fallback when task_notification is missing (--print mode)
- Add repo URL to pill menu with 3-state display: PR link, repo link, or "No Repository Detected"
- Proxy detects GitHub repo URL via
gh repo viewand sends it alongside branch/PR info
- Break up admin.rs into sub-components per tab (overview, users, sessions, raw messages)
- Review and update all docs for accuracy across 15 files
- Fix subagent completion handling in history loading path to preserve task data
- Replace catch-all status mapping with explicit CCTaskStatus variant matching
- Add "Add machine" button to launch dialog for setting up new launchers
- Remove Service section from settings Credentials tab
- Move install under service subcommand (
agent-portal service install)
- Add agent install setup under Service section in Credentials settings tab
- Add bash-style Tab completion to launch dialog path input
- Fix launch dialog bugs and refactor DirBrowser
- Prevent duplicate launchers per host-user and fix tilde expansion
- Launcher cleanup: fix task abort, URL dedup, send error logging, config path
- Show session details (name, host, directory, branch, agent) in portal message on connect/reconnect
- Unify admin and settings page layout styles
- Fix transparent admin/settings overlay background
- Move bug report to bottom-right link with bug emoji
- Fix Shift+Tab keyboard hint text
- Keep server shutdown banner until first message received from reconnected server
- Remove unused dead code methods from CommandHistory
- Fix result message duplicating previous assistant message text
- Fix launcher crash: install ring crypto provider for rustls 0.23
- Fix sparkline tick subpixel rendering artifacts via GPU compositing
- Fix tasks drawer pull-tab clipped by overflow:hidden on drawer container
- Add
agent-portal loginsubcommand for explicit authentication - Add
agent-portal installsubcommand to install as system service - Add
agent-portal updatesubcommand to update binary and restart service - Install script no longer auto-installs system service
- Updated frontend setup instructions with 3-step flow (install, login, service)
- Differentiate task and portal message colors (tasks=purple, portal=teal)
- Sparkline tick colors now match their message type colors
- Rename agent-launcher to agent-portal
- Make launcher the default install path (install script downloads agent-portal, installs as service)
- Launch button available to all users (not just admin)
- Launch dialog shows install instructions when no launchers are connected
- agent-portal recommends service install when run interactively
- Backend sends max image size to proxies via RegisterAck; proxy uses it instead of local env var
- Remove frontend image size check (backend/proxy is authoritative)
- Fix stale subagent entries persisting across page reloads by clearing task state on history reload
- Tasks sidebar panel now slides in/out with the drawer instead of instantly appearing/disappearing
- Refactor sender attribution: store actual sender user_id in DB, reconstruct display info at query time
- Add user name attribution to messages in shared sessions
- Increase default image max size from 2 MB to 10 MB
- Update claude-codes to 2.1.49 (String-to-enum migration for subtype, stop_reason, status)
- Re-export
CCSystemSubtypefrom shared
- Use typed claude-codes structs for task parsing instead of raw JSON field access
- Parse task_type, task_status, and task_usage via typed deserialization in both component logic and renderers
- Tasks sidebar: header bar toggles open/close (removed separate X button)
- Tasks sidebar: show running task count in title bar
- Add widget protocol specification (
docs/WIDGET_PROTOCOL.md)
- See git history for previous changes.