Skip to content

v0.20.0 polish: offline state, error toasts, pairing rate limit, settings healing - #117

Merged
TheoSlater merged 7 commits into
mainfrom
feat/v0.20-polish
Jul 12, 2026
Merged

v0.20.0 polish: offline state, error toasts, pairing rate limit, settings healing#117
TheoSlater merged 7 commits into
mainfrom
feat/v0.20-polish

Conversation

@TheoSlater

Copy link
Copy Markdown
Collaborator

Summary

Batch of v0.20.0 audit items (1–3, 5–10). Branched off main (not devdev is behind and missing the #116 voice-mode code this touches).

  • EmptyState offline notice — wires the previously ignored providerOnline/onOpenConnections props: offline shows guidance + "Open connections" button
  • Error toasts — 3 silently swallowed failures now surface via the existing notification store: unreadable dropped files (was an unhandled rejection), idle-purge conversation restore, whisper model reload after idle. Remaining catches (sessionStorage cache, cosmetic mic cue, model release) are legitimately silent
  • Settings healingmergeSettingsWithDefaults as persist merge: every rehydrate deep-fills missing nested fields from defaults, so new settings fields no longer need SETTINGS_VERSION bumps and half-stamped storage (dev HMR race) self-heals
  • Voice overlay theme tokens#0A0A0A/#2A2A2Abg-background/bg-secondary (visually identical in dark theme, follows light theme)
  • Pairing auth rate limit — >10 bad-token requests/60s → 429 lockout; correct token and public paths never blocked. CORS headers deliberately not added: same-origin serving means their absence keeps cross-origin reads blocked
  • Code splittingAgentViewportDrawer lazy-mounts once a viewport session exists (28.8 kB out of initial chunk)
  • ThinkingDisclosure — stale prompt-kit TODO removed

No code needed for two audit items: title-generation retry already exists (retry on conversation switch + deterministic fallback title + manual rename), and agent noop is a deliberate result classification, not missing handling.

Test plan

  • bun run test — 221 passed (incl. new tests/settingsMerge.test.ts)
  • cargo test — 104 passed (incl. new rate-limiter tests)
  • bun run build — clean, drawer chunk split confirmed

🤖 Generated with Claude Code

TheoSlater and others added 7 commits July 11, 2026 21:16
providerOnline/onOpenConnections props existed but were ignored,
leaving a blank screen with no guidance when the provider is down.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Failed drop-file reads, idle-purge restore, and whisper model reload
failed silently; users saw features stop working with no signal.
Native drop path also had an unhandled promise rejection.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
migrate only runs on version bumps, so a new nested field (or a
half-stamped storage from a dev HMR race) stayed missing until the
next migration. merge runs every load and heals it; new fields no
longer require a SETTINGS_VERSION bump.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bg-background/bg-secondary match the old hex in dark theme and make
the overlay follow light theme instead of staying black.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The LAN pairing server allowed unlimited token guessing. After 10
bad tokens in 60s, unauthorized requests get 429 until the window
resets; correct-token requests and public paths are never blocked.
No CORS headers on purpose: same-origin serving means their absence
is what keeps cross-origin reads blocked.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Mounts only once a viewport session exists; splits 28.8 kB out of
the initial chunk.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Component already works on the in-repo Reasoning primitives; the
regression test pinned the TODO string, updated alongside.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@TheoSlater
TheoSlater merged commit 5887006 into main Jul 12, 2026
8 checks passed
@TheoSlater
TheoSlater deleted the feat/v0.20-polish branch July 12, 2026 01:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant