- 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>
PR links in messages now show a live card instead of the static
preview: repo and PR number, PR title, current status (open / draft /
merged / closed with a matching state icon), additions in green,
deletions in red, and the files-changed count. The whole card links to
the PR.
Details come from the GitHub REST API via a new Tauri command —
anonymous for public repos, with GITHUB_TOKEN/GH_TOKEN attached when
the shell that launched the app has one. Any fetch failure (rate
limit, private repo without a token, offline) falls back to the
existing compact card.
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>
"Turn started" / "Session ready" rows repeat on every turn without
telling the user anything actionable — the Working marker (and its
raw-event dropdown) already covers turn liveness. Drop them from the
chat timeline and the completed-turn dropdown; their timestamps still
feed the "Thought for Xs" duration.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A turn can span several user messages — a mid-turn steer, or a batch
that merged a replayed backlog message with a fresh one. Chat activity
placement anchored the turn to the FIRST of them, so the turn's output
(including the reply to the newest message) rendered above the user's
latest message, pinning it to the bottom of the conversation.
Attach the block to the latest prompt/steer message id instead, and
make merged prompts resolve their prompt item to the newest embedded
Buzz event section rather than the oldest.
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>
Two chat-mode harness features:
- chat_title observer frames: after the first successful turn in a chat
channel, run a tool-less side session (no MCP servers, no system
prompt, observer muted so its wire traffic never pollutes the turn's
transcript) that titles the conversation, and emit the sanitized
result as a chat_title frame for the desktop to apply.
- chat backlog replay: chats now subscribe from just after the agent's
own last reply (capped at 6h) instead of the startup watermark, so a
message sent while the agent was stopped is delivered once the owner
activates it, instead of being silently skipped forever.
Adds streamed assistant-text capture to AcpClient for side prompts.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The shared reqwest client had no timeout, so a stalled connection (e.g.
an expired VPN tunnel that blackholes packets) left relay bridge calls
pending forever — chat creation and message sends spun indefinitely with
no error surfaced. Relay requests now carry a 30s per-request deadline
and the shared client gets a 10s connect timeout (connect-phase only, so
media streaming stays unbounded).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>