Skip to content

Count working side chats in the running pill - #906

Open
jsgrrchg wants to merge 13 commits into
zeronsh:mainfrom
jsgrrchg:zeron/side-chats-in-running-pill
Open

jsgrrchg wants to merge 13 commits into
zeronsh:mainfrom
jsgrrchg:zeron/side-chats-in-running-pill

Conversation

@jsgrrchg

@jsgrrchg jsgrrchg commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Depends on #899. Until it merges this PR also shows #899's commits — review only the last one, 4ce3f4c4. I'll rebase onto main once #899 lands.

Summary

A session row's "● N" pill now counts the chat's side chats that are Working, not just its running subagents, on both desktop and iOS.

  • zeron_proto::view::working_side_chats counts a parent's unarchived side chats whose effective indicator is Working, so a side chat that's awaiting input, errored, idle or stale adds nothing. The parent's own run isn't counted (that's its spinner).
  • Desktop: AppState::running_pill_count_for sums subagents and working side chats for the sidebar pill. The tab strip still counts subagents only.
  • Client / mobile: SessionRow gets working_side_chats, kept separate from running_subagents and passed through the FFI. derive() indexes side chats by parent so each row counts its own without a scan.
  • iOS: the pill shows the sum, and VoiceOver names both parts ("4 subagents and 1 side chat running").
  • Demo: chat-side-2 is Working, so chat-veil reads "● 5".

Tests

  • working_side_chats_count_only_fresh_working_children_of_the_parent (proto)
  • running_pill_sums_subagents_and_working_side_chats (ui)
  • Demo assertions in crates/client/tests/demo.rs

View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

jsgrrchg and others added 8 commits October 13, 2026 22:15
Sessions with side chats get a toolbar button that lists them in a sheet;
picking one opens it on top of its parent. Subagent spawn cards in the
transcript are now links to a read-only transcript: finished subagents read
their frozen blob, running ones dial the doc's chat2 room on the parent's
host. Session rows show a "● N" pill while subagents run.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
chat-veil already has a side chat; its CJK turn now spawns a finished
subagent (with its own transcript), so one demo session exercises both.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The session menu and the side chats sheet offer "New Side Chat" and "Fork
into Side Chat", as on the desktop. A new side chat is a composer pushed over
the session: it runs in the parent's checkout and host (sandbox included) but
may pick any harness and model until its first send mints the row, then hands
over to the chat in place. A fork asks the source's host to copy its history
through the last completed reply. From a side chat, both make a sibling.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The side chats sheet becomes "Side Chats & Agents": subagents the session's
agent is running (status glyph, live tail, model), its side chats, and the
subagents that finished. The toolbar badge shows "● N" while subagents run.
SessionSnapshot::subagents() reads them off the transcript's spawn chips.
The demo's chat-veil gets four of each.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Running, Side chats and Finished agents fold under the session list's
section headers (count, chevron, a spinner on Running while folded). The fold
state persists on this device.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A subagent opened finished keeps a frozen core in the warm cache, and that
core never dials. Reopening it live (it resumed) returned the stale copy with
no room. A live open now replaces a cached frozen core with the live doc.
The mock edge serves /blob/ so a live test covers it.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
set_status rewrote running_subagents to 0 on every turn transition, so
chat-veil's "● 4" vanished as soon as its live turn finished. It now keeps
the row's count, and the heartbeat also refreshes rows with running
subagents so the pill doesn't go stale.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A session row's "● N" pill now shows its running subagents plus its side
chats that are Working (unarchived, fresh session), on desktop and iOS.
working_side_chats in proto does the count; SessionRow carries it apart
from running_subagents and iOS VoiceOver names both parts. The tab strip
still counts subagents only. In the demo, chat-side-2 is Working, so
chat-veil reads "● 5".
@jsgrrchg
jsgrrchg marked this pull request as ready for review October 14, 2026 23:23
…nd-sidechats-implementation

# Conflicts:
#	apps/ios/Zeron/Core/Generated/zeron_core.swift
#	apps/ios/Zeron/Transcript/RowView.swift
#	apps/ios/Zeron/Transcript/TranscriptListView.swift
…s-implementation' into zeron/side-chats-in-running-pill
jsgrrchg added a commit to jsgrrchg/comet that referenced this pull request Oct 15, 2026
jsgrrchg added a commit to jsgrrchg/comet that referenced this pull request Oct 15, 2026
…ide chats or main threads

Conflict resolution:
- crates/ui/src/files/sections.rs: keep the deletion from PR zeronsh#895.
- Add the new `native_fork_point: None` field to SessionMessageEntry
  literals introduced by already-merged PRs (zeronsh#895, zeronsh#899/zeronsh#906).
…nd-sidechats-implementation

# Conflicts:
#	apps/ios/Zeron/Session/NewSessionViewController.swift
…s-implementation' into zeron/side-chats-in-running-pill
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