Contrast: the accent shimmer band swept raw primary, which sits too
close to the text's lightness in both themes (58%-L purple vs
near-black text in light; 80%-L purple vs near-white text in dark) and
barely read. The band now mixes primary toward the background — lighter
in light mode, darker in dark mode, both directions pulling away from
the text — and narrows so the highlight covers more visible text per
pass.
Robustness: observer frames are ephemeral, so an app subscribing
mid-turn missed turn_started and the turns store stayed empty (dark
sidebar shimmer, no working badges) until a liveness ping happened to
land. Any frame carrying a turn context — tool calls included, which
stream constantly during work — now establishes the turn, still gated
by the terminal tombstone so completed turns stay dead.
Adds an e2e spec covering the sidebar title shimmer end to end via
seeded active turns.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The CI chip in the chat work panel is now a dropdown: the summary row
keeps the aggregate state plus a chevron, and expanding it lists each
check run with its own pass/fail/pending icon, followed by the two
automation checkboxes (moved out of their standalone chip).
The comment count now shows review threads still awaiting the PR
author's reply instead of the raw total — REST can't see GitHub's
resolved bit, so replying is what clears a thread. New
fetch_github_pr_comment_state command groups review comments into
threads and counts the ones whose last word isn't the author's; the
address-comments automation nudges on rises in that count and re-arms
once it returns to zero.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The work drawer becomes a PR monitor: a CI chip shows running (with
progress), failing (red, count), or passing (green) from the head
commit's check runs, alongside the PR's comment count — both polled
while the panel is mounted.
Two persisted per-chat checkboxes arm automation: "Auto-fix CI
failures" prompts the chat's agent to investigate and fix once a head
sha's checks settle red (one nudge per sha), and "Address comments &
resolve" prompts it to work through comments and replies, reply, and
resolve addressed threads whenever the comment count rises (watermarked
so it never repeats).
Adds fetch_github_check_summary and head sha/comment counts to the PR
fetch.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The work module's contents (label, branch chip, PR card) sit in a
rounded secondary-background container, the divider against the
conversation is gone, and the drawer eases open/closed on its width
(300ms ease-out) instead of popping — the panel stays mounted so the
close animates too.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A pull-request button sits left of the chat settings menu whenever the
agent has posted a PR, toggling the top-right work module (tinted
primary while open; each chat starts with it visible). The panel's
card now uses the standard rich PR card style, matching PR link cards
elsewhere.
Splits ChatList out of ChatsScreen (file size ceiling) with the
shared-chat metadata check moved to lib/chatShared.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Chat stream:
- Activity markers span the full conversation column (matching the
"Thought for Xs" row) instead of capping at 42rem.
- Own bubbles drop the redundant "You" header.
PR work panel: when the chat's agent posts a pull request, a module
docks top-right inside the chat area (conversation and composer shrink
to make room) showing the PR's source branch and the live PR card.
fetch_github_pull_request now returns head.ref for the branch chip.
Branch e2e repairs (both regressions pre-dated today):
- "Jump to latest" now re-asserts the bottom until row re-measurement
settles — a smooth jump aimed at a stale scrollHeight landed short
once grouped rows changed height estimates.
- Sidebar dnd gains a keyboard sensor with keyboard-aware collision
detection, and channel-assignment drop zones are disabled while a
section drag is active. The dnd e2e uses a viewport tall enough that
auto-scroll can't move the drop target mid-drag.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Sidebar chat titles shimmer while the agent works, replacing the
spinner (the archive affordance keeps its hover slot).
- Chat projects use the Notebook icon family instead of folders
(sidebar groups, project picker, new/none rows).
- Right-click on any chat offers Rename (dialog writing owner
metadata — hidden on shared chats), Pin/Unpin (persisted per
workspace; pinned chats sort to the top of their section), and
Archive.
- Solo chats (you plus one agent) hide the agent's avatar and name so
replies read as a plain stream; identities return automatically the
moment another agent or person participates.
The switching e2e now covers the context menu, pinning order, and
rename round-trip.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three chat fixes:
- "Working" no longer renders once per turn block: the active-turn store
now exposes the live turn ids per channel, so only the actually-live
turn shows the marker and completed turns collapse even while a new
turn runs (previously a channel-wide boolean re-expanded every old
turn and gave each its own Working row).
- Agent-authored PR links render a distinct, prominent card (banner
layout with repo, status pill, title, and diff stats) instead of the
compact chip a pasted link gets. Threaded through a Markdown
agentAuthored flag set on agent message rows.
- New chats resolve their default agent immediately: quick-start
refreshes the managed-agents cache after ensuring Fizz, so the first
chat's agent replies render as agent rows instead of member bubbles.
The chats e2e now covers the agent card and pins mock message ordering
with explicit timestamps (same-second events sorted unstably).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Chats tab always landed on the new-chat screen. Remember the
last-viewed chat per workspace (localStorage) and redirect plain
/chats navigations back to it when it still exists. Explicit new-chat
navigations carry a projectId in the route search and are never
redirected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A batch of chat-mode UX improvements:
- Per-element shimmer on loading markers (label and elapsed time each
get an aligned overlay instead of one misaligned combined pass).
- Slide-up entrance animation for newly arrived rows (messages and
activity markers), recency-gated so opening a chat never cascades.
- Consecutive completed shell commands fold into "Ran N commands"; the
in-flight command stays visible as its own live row until it lands.
- Chats auto-title once the conversation takes shape: agent-generated
chat_title frames are preferred, with a lead-in-stripping heuristic
as fallback. Titles swap in with the search-placeholder character
animation, never override a manual rename, and the sidebar list now
follows the metadata title.
- The "Working" row gets a dropdown showing the turn's recent raw
observer events (reusing RawEventRail).
- The agent activation card holds a 20s grace window after activation
so it doesn't flash back while the agent boots.
- Message scroller: bottom fade as an overlay (masks repaint per frame
in WKWebView), removed content-visibility sizing that broke
stick-to-bottom, simplified the scroll anchor.
- Fix duplicate sibling key that leaked a stacked header per chat
switch, and circular sizing that collapsed the animated title.
Adds e2e coverage for the first-message flow (send, entrance
animation, retitle) and a header-stacking regression test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>