Repository navigation
Show working Bots as a light row of stacked avatars at the end of the message list (Web + mobile) - #1881
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2
Ports the collapsed-card bubble grouping into the shared conversation screen. In a group Channel a request card stands alone so the next bubble still carries the Bot's name. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PRzwpD3Ht4zCzYLgvaZ6Up
* feat(mobile): transparent DM header with an avatar, name and state chip Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc * docs(mobile): DM header screenshots for the PR Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc * docs: change fragment for the mobile DM header Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc * feat(mobile): concentric chip padding, round header buttons and a top fade Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LzUNRQhy85WgjWULziwrxc * Open group Channels as a native mobile chat, like Bot DMs Group Channels used to open the embedded full client. They now use the same native chat screen as a DM: the screen moves to src/ui/chat/conversation-screen.tsx and takes a DM or a Channel. Bot messages keep their author, so each Bot's group is named and split, several Bots' drafts stream side by side, cards resolve against their own Bot, and the status strip stops the working member. Pushes and Activity items for a group Channel open it, at the card when there is one. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YXLBzevwCYAWycH1iTuBwK * Link the group Channel change fragment to #1879 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YXLBzevwCYAWycH1iTuBwK * Mention member Bots or All Bots from the mobile group Channel composer Typing @ in a group Channel lists All Bots and the active member Bots above the composer. A choice inserts a mention token that channelSend receives like the Web Client's, reusing its mention helpers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YXLBzevwCYAWycH1iTuBwK * Collapse a decided mobile request card into a Bot bubble The collapsed approval/question line was a narrower pill with its own padding and full rounding, so it did not line up with the Bot bubbles around it. It now shares the bubble's edge, width cap, padding, fill and radius.lg corners, and joins the Bot's message group. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PRzwpD3Ht4zCzYLgvaZ6Up * Add the change fragment and screenshots for the card bubble Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PRzwpD3Ht4zCzYLgvaZ6Up * Say Channel, not DM, at the top of a group chat, and list mention candidates by name Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YXLBzevwCYAWycH1iTuBwK * Add group Channel screenshots for #1879 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YXLBzevwCYAWycH1iTuBwK * Show a working Bot at the bottom of the mobile message list The fixed status strip above the composer took space and pushed the composer up and down as a Bot started and stopped. The working Bot now shows as the last row of the message list, like the Web Client's timeline working rows, with its steps and Stop. In a group Channel each working member Bot gets its own row and Stop. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2 * Add the #1881 change fragment Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2 * Keep open request cards out of Bot bubble groups An open request renders as a full action card, so the Bot bubbles next to it should not take joined corners. chatRows takes a standalone predicate; the DM marks cards that have no resolution yet. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PRzwpD3Ht4zCzYLgvaZ6Up --------- Co-authored-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2
309acd1 to
adc197a
Compare
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2
Web and mobile now show each working Bot as a flat card at the bottom of the message list: avatar, name, what it is doing, and an icon-only square Stop button. Tapping the card expands the Bot's running sessions. Human DMs opened from the channel list now show the card too. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2
5285d19 to
ef0370b
Compare
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2
… Stop The working status at the end of the message list drops the card, the name and the Stop button on Web and mobile: one row with up to three stacked avatars and the current step. The mobile app no longer stops Bots from the chat. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Batch QA — #1881 as merged on main (dbfbe05), section 5iOS Simulator "PR1800 glass" (iOS 26.0, iPhone 17 Pro), dev client rebuilt from the batch, QA Host on DeepSeek. Screenshots are redacted (computer name, tailnet host and local paths blacked out). Chinese text renders as □ because the iOS 26.0 Simulator runtime ships without PingFang; that is an environment limit, not the app. Android: untested.
Side note (not this PR's scope): picking "All Bots" from the @ list showed "@ALL Bots …" in the composer but the sent bubble reads "@ada @ …". |
Correction to the side note aboveThe "@ " in the sent bubble is not a bug: the stored message body is |



Requested by Vain · project thread
Why the change
The working status at the bottom of the message list should be as light as possible: just who is working and what they are doing, with no card, no name and no Stop.
Change outline
Before: Web showed one "Name · step…" line per working Bot (up to 2, then "另有 N 个"). Mobile showed one row per Bot with "Name · step…", tap-to-expand steps and a Stop button.
After: one row with no background. Left: the avatars of the working Bots, stacked, at most 3. Right: the current step in muted text with "…" (one Bot shows its own step; several Bots show "Working…"). No names, no Stop, nothing to expand. The Web composer's own Stop button is unchanged; the mobile app no longer has a Stop.
Web, Bot DM (light, dark):
Mobile, Bot DM and a group Channel with two working Bots stacked (light, dark):
How: Web
TimelineWorkingRowsViewrenders one.bh-timeline-working-rowwithPersonaBotFacepile(max 3, size 28) and the summary; the cap goes from 2 to 3. MobileWorkingRowbecomesWorkingStatus(stackedBotAvatars ringed inbase, muted step text); the mobile stop plumbing (host/stop.ts, the stop notices and strings) and the step list are removed, andDESIGN.mdis updated. Also fixes Human DMs opened from the channel list on Web, which showed no working status because the DM Bot was not resolved for the composer activity (regression test added).scripts/e2e-mobile-stop-web.mjsbecomese2e-mobile-working-web.mjs: it checks the status shows the avatar and step with no name and no Stop, then stops the Bot from the Host and checks the status leaves.Special things to note
pnpm typecheck,pnpm lint,pnpm vitest run apps/mobile packages/client(only the pre-existingclient-observersqlite bundling failure, same onmain);node scripts/e2e-mobile-working-web.mjspasses against an isolated Host with live DeepSeek V4.1 Flash runs. Mobile screenshots are the React Native Web render (390 × 844); the native Simulator check is in the Batch 1 Human QA list.🤖 Generated with Claude Code
https://claude.ai/code/session_01UwdrAXbW2EURZFtgVjeUF2
Summary by CodeRabbit