### Changed
- Replaced overlay-based mention highlighting with canvas background approach. The previous implementation used a transparent textarea layered over a mirrored div, requiring pixel-perfect sync between two DOM elements — causing bugs with cursor positioning, resizing, scrolling, and selection. The new approach uses a hidden measurement div (browser-native text layout for pixel-accurate positions) to paint mention highlights onto an offscreen canvas, set as the textarea's `background-image`. Single element, no overlays, no sync issues.
- Mention highlights now dynamically adapt to all color themes by deriving the highlight color from the `--primary` CSS variable via `color-mix(in oklch, var(--primary) 25%, transparent)`, matching every theme combination (neutral, ocean, forest, sunset, amethyst × light/dark).

### Fixed
- Fixed client permanently disconnecting and requiring a hard refresh after server closes the WebSocket connection. The reconnection `useEffect` hooks were reading Zustand state via `getState()` inside the effect body (capturing stale values) and had dependency arrays that didn't include `connected` or `connectionTimedOut`, so disconnects never triggered reconnection. Now uses reactive Zustand selectors in the dependency arrays.
- Fixed client-side heartbeat monitor not resetting on ping messages. The `resetHeartbeat()` call was skipped when intercepting pings at the transport layer, meaning the monitor would falsely detect dead connections during idle periods.
- Fixed terminal panel showing native OS scrollbars. Added custom thin scrollbar styling to the xterm viewport (`.xterm-viewport`) to match the app's consistent scrollbar appearance across all scrollable areas.
- Fixed bulk selection action bar overflowing in the session sidebar panel at default narrow widths. The action bar displayed "{N} selected" text plus Archive and Cancel buttons (icons + labels), exceeding available space. Simplified to icon-only buttons with tooltips, reduced text size, and added proper overflow handling (`truncate`, `shrink-0`).
