Skip to content

fix(studio): composer streaming-stuck bug + toolbar/search/projects polish - #1732

Closed
jtenniswood wants to merge 2 commits into
feat/webuifrom
claude/rebase-original-repo-bb5ef1
Closed

jtenniswood wants to merge 2 commits into
feat/webuifrom
claude/rebase-original-repo-bb5ef1

Conversation

@jtenniswood

Copy link
Copy Markdown
Contributor

Summary

A short pass of live UI polish on Studio's chat workspace, found and verified by driving the app directly (real dev server, real daemon) rather than by inspecting code in isolation.

  • Fixed a real functional bug: after sending the first message in a brand-new chat, the composer could get stuck showing "Queue a message..." (and the Mode/Tools/Safety/Model pills stuck in their busy state) indefinitely, even though the daemon had already recorded the session as completed. Root cause: the durable session watch speculatively sets status = "streaming" at mount, and a stale "running" row from the inventory poll — landing after this tab's own send has already settled — can re-arm it with nothing left to ever correct it. Reproduced live against a real daemon, then pinned with a new deterministic regression test (use-agent-chat.watch-race.test.ts) that fails on the old code and passes on the fix.
  • Composer toolbar: the Mode/Tools/Safety/Model pills now sit at rest with no border or fill (previously either blended into one run of text, or — after an interim pass — looked over-boxed); each still shows feedback on hover and while its own menu is open. The Mode pill's colour dot is removed.
  • Starter-prompt chips: wrap at 768px (matching the composer's own width) instead of a narrower 576px column, so they use the available width instead of stacking into an oddly narrow centered column.
  • Top-nav search box: --nav-search-border was defined too close in lightness to --nav-background in every palette (~2.9:1 contrast), so its outline was barely visible; brightened to match each palette's already-legible --nav-icon.
  • Labs mock Projects list: a project/folder row now reads bold so it's visually distinct from the muted chats filed under it, instead of everything sitting at one flat weight.

Test plan

  • npx vitest run src/features/agent src/app/workspace/_components/chat-input src/app/workspace/chat/_components/chat-workspace src/app/workspace/chat/_components/session-sidebar — 89 files / 809 tests passed
  • npx biome check on every changed file — clean
  • npx tsc --noEmit — clean
  • Live-verified against the real dev server in both light and dark theme (composer pills, search-box outline, Projects hierarchy)
  • Live-reproduced the streaming-stuck bug against a real daemon turn before fixing it, and confirmed the fix via the new regression test

Base branch

Stacked on feat/webui (#1607), not main — this branch is a checkout of that PR's tip plus these two commits, so the diff here is just this session's work.

🤖 Generated with Claude Code

jtenniswood and others added 2 commits September 21, 2026 17:17
…nd settles

The durable session watch (ADR 0250) speculatively sets status="streaming"
the instant it mounts, before it has replayed anything. It mounts whenever
the inventory poll reports a session as running/awaiting and this tab
isn't driving it — but that guard only checks the instantaneous drivingRef,
which this tab's own send already clears once its stream settles. A stale
"running" row from the next poll tick (an ordinary staleness window
between the daemon recording completion and Studio's next fetch) then
satisfies both conditions, mounts the watch, and leaves the composer
stuck showing "Queue a message..." indefinitely — reproduced live against
a real daemon and confirmed only a reload cleared it.

Track whether the watch's own replay has seen an unterminated run; at the
replay→live boundary, correct status back to idle when nothing is parked
and no run is genuinely in progress, instead of leaving the mount-time
guess in place.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ct rows

- The Mode/Tools/Safety/Model pills sit at rest with no border or fill
  (only on hover and while their own menu is open), and the Mode pill's
  colour dot is gone.
- The starter-prompt chips wrap at 768px, matching the composer's own
  width, instead of a narrower 576px column.
- --nav-search-border was defined too close in lightness to
  --nav-background in every palette (~2.9:1 contrast), so the top-nav
  search box's outline was barely visible; brightened it to match each
  palette's already-legible --nav-icon.
- A project row in the Labs mock Projects list now reads bold/foreground
  so it stands out from the muted chats filed under it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@samuv

samuv commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

closing the exploration in this repo

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.

2 participants