Skip to content

feat(playground): settings popover + logout#1

Merged
BaruchEric merged 14 commits into
mainfrom
claude/adoring-sammet-51da87
Apr 22, 2026
Merged

feat(playground): settings popover + logout#1
BaruchEric merged 14 commits into
mainfrom
claude/adoring-sammet-51da87

Conversation

@BaruchEric
Copy link
Copy Markdown
Owner

Summary

Adds a ⚙️ gear in the playground header that opens a popover with three sections:

  • Model — dropdown of 6 curated AI Gateway slugs + Custom… free-text. Sent in every /api/agent POST; server validates via resolveModel regex and falls back to AI_MODEL env.
  • Layout — three presets (Default / Side-by-side / Stacked), Hide AI panel toggle, Reset sizes. Each preset stores its own sizes in localStorage; drag-resizers compute axis from the active preset.
  • Account — Log out button. Hits new /api/logout (401), poisons Chrome's Basic Auth cache, reloads.

Spec: docs/superpowers/specs/2026-04-22-settings-and-logout-design.md
Plan: docs/superpowers/plans/2026-04-22-settings-and-logout.md

Test plan

  • bun run lint clean (biome)
  • bun run typecheck clean
  • bun run test — 92 passed (new: 5 settings + 7 resolveModel + 1 private-mode storage)
  • bun run build — library tsup build clean
  • bun run playground:build — vite build clean
  • Browser verification: popover opens/closes via click/Esc/outside-click; all three presets switch live with localStorage persistence; Hide AI hides AI region in each preset; model selection flows into POST body; no console errors
  • Manual: log out round-trip in a deployment with BASIC_AUTH_PASS set — confirm browser re-prompts

Adds a settings popover (model, layout, logout) to the playground.
Captures DOM/CSS layout-preset strategy, localStorage schema,
and the Basic Auth poison-cache logout flow before implementation.
11 TDD-style tasks covering vitest scope, settings data layer,
model resolution helper, agent model override, logout endpoint,
layout DOM/CSS, resize engine, popover UI, request body wiring,
logout flow, and the final ship gate.
…blocked contexts

readSettings() called localStorage.getItem directly for three top-level keys,
which throws SecurityError in private browsing or when storage is disabled
by site settings. Wrap in a small getItem helper so readSettings degrades
to defaults instead of crashing applyLayout on load.
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 22, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
stream-ui Ready Ready Preview, Comment Apr 22, 2026 11:40pm

Request Review

@BaruchEric BaruchEric merged commit c8dc549 into main Apr 22, 2026
3 checks passed
@BaruchEric BaruchEric deleted the claude/adoring-sammet-51da87 branch April 23, 2026 03:21
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