v0.19.0 — Session Prefetch, Scoped Permissions & Dark Theme Overhaul
Pre-release
Pre-release
What's New
⚡ Session Prefetch & Switching Performance
- Session payload cache — prefetches up to 6 recent sessions via
requestIdleCallbackso switching is instant with no disk I/O - Metadata sidecar files — session listing reads tiny
.meta.jsonfiles instead of parsing full multi-MB session files - Async session I/O — migrated all
fs.existsSync/readFileSynccalls tofs.promises.*for non-blocking session operations - Consolidated metadata sync — merged 4 separate
setSessions(prev => prev.map(...))effects into a single batched update startTransitionwrapping — session switch state updates are wrapped in React transitions for smoother UI
🔐 Scoped Permission Rules
- "Always allow" dropdown — split button on the permission prompt with per-destination scope (session, local project, shared project, user-global)
- Permission rule forwarding —
updatedPermissionsflows through the SDK permission bridge so rules persist to the chosen settings file - Local settings source — all SDK query paths now include
"local"insettingSourcesfor.claude/settings.local.jsonsupport
🎨 Dark Theme & Glass Morphism Overhaul
- Light glass tuning — separate gradient math for light glass mode with softer titlebar veils, adjusted shadow opacity curves, and
color-mix(in oklab, white 97%, var(--background) 3%)surface color - Refined top scroll fade — lighter, shorter gradient (h-20/h-24), reduced radial shadow spread, and fine-tuned opacity breakpoints for both island and flat layouts
- Transparency toggle —
glass-enabledclass now respects aharnss-transparencylocalStorage key, applied early in preload before React mounts - Darker window background — Electron window base color changed from
#18181bto#040404for true dark appearance - ShadCN Select component — new Radix-based
<Select>replaces all native<select>elements in settings panels for consistent styling
🛠 Tool & UI Polish
- Bash output truncation — long bash results (200+ lines) collapse with a "Show full output" toggle
- Engine icons in sidebar — session items show per-engine/agent icons instead of generic message bubbles
- AskUserQuestion redesign — tighter spacing, smaller type scale, and cleaner answer display
- Icon picker fix — dropdown-to-popover transition uses
onCloseAutoFocusprevention instead of fragilesetTimeout - Message unqueue — new
unqueueMessageaction lets users remove queued messages before they're sent
📜 Scroll System Refactor
getTopScrollProgresshelper — extracted smoothstep scroll-progress calculation to a pure, tested function inchat-scroll.ts- Synchronous viewport sync — programmatic scrolls (jump-to-bottom, prepend anchor restore) now immediately update top-progress and scrolled-from-top state
useLayoutEffectfor session reset — scroll position resets happen in layout phase to prevent flicker on session switch- Stale viewport ref guard —
getViewport()checksisConnectedto avoid operating on detached DOM nodes
🐛 Bug Fixes
- Git status loading race — separate
loadingRequestIdRefprevents stale requests from clearing the loading spinner - Switch request guard —
switchRequestIdRefdiscards late-arriving disk loads when the user rapidly switches sessions - Non-blocking save on switch —
saveCurrentSession()is now fire-and-forget (void) during session switches to avoid blocking the UI
Full Changelog: v0.18.1...v0.19.0