Skip to content

feat(desktop): inline agent presence with state dots in the channel header - #94

Merged
oscarlehuu merged 2 commits into
mainfrom
feat/issue-80
Aug 7, 2026
Merged

feat(desktop): inline agent presence with state dots in the channel header#94
oscarlehuu merged 2 commits into
mainfrom
feat/issue-80

Conversation

@oscarlehuu

Copy link
Copy Markdown

Summary

Mission-control series (#80, spike decision: state inline + presence header): the channel header shows its agents as an avatar row with priority state dots — needs-you > working > done-recent > idle — matching ThreadAgentStatusChip's visual language. Overflow → +N popover; click → jump to the agent's conversation via the existing thread seam.

Design

  • channelAgentPresence.ts: pure derivation over existing stores (activeAgentTurnsStore, needsYouStore, conversationOutcomeLedger) — no rival store; content-equality reference cache; community-reset wired.
  • needsYouStore gains a separate 46040 user-input family: own pending map, LRU-bounded tombstones, expiry scheduling, resolution on both 46041 ANSWER and 46042 RESOLVED, correlated to the real conversation root (header/digest/chip agree). The 46010 approval lifecycle is untouched — reconcileNeedsYouFromFeed still reasons only about approvals (the native needs_action feed is 46010-only), locked by a regression test.
  • useChannelUserInput feeds the store from its existing 46040 subscription — one ingest path, no duplicate lifecycle.

Tests & verify

21 unit tests on the store+presence pair (46040 lifecycle: answer-resolve, terminal-resolve, tombstone, expiry, reconcile-isolation; presence priority/expiry/stability/roster) + digest & chip suites (41 total in verification run) · Playwright smoke ×2 green (working→done hash-distinct, 46040 needs-you dot → click opens message-thread-panel) · pnpm run check + tsc clean.

Built by gpt-5.6-luna max (build + fix round); reviewed by grok-4.5 twice — r1 REQUEST_CHANGES (the 46040 extension was 'a net regression on the shared needs-you seam': no ANSWER/RESOLVED resolution, no tombstones/expiry, synthetic conversation ids, undefined breathe animation, e2e couldn't click-to-thread), r2 APPROVE with nits (tombstone LRU cap + reconcile-isolation test — both applied by the orchestrator).

Note for #81: this PR's 46040 store extension is the canonical one — #81 rebases onto it and drops its own variant.

Fixes #80

oscarlehuu and others added 2 commits August 7, 2026 11:23
…eader

The channel header now shows the channel's agents as an avatar row with
state dots — priority needs-you > working > done-recent > idle — using
the same visual language as ThreadAgentStatusChip (amber pulse, blue
working, green done). Overflow collapses into a +N popover; clicking an
agent jumps to its active conversation through the existing timeline
thread seam. Presence derives from existing stores only
(activeAgentTurnsStore, needsYouStore, conversationOutcomeLedger) with
content-equality reference caching and community-reset wiring.

needsYouStore gains a SEPARATE user-input family (kind 46040): its own
pending map, LRU-bounded tombstone set, expiry scheduling, and resolve
on both answer (46041) and terminal resolution (46042) — correlated to
the real conversation root so header, digest, and chip agree. The
46010 approval lifecycle is untouched: reconcileNeedsYouFromFeed still
only reasons about approvals (the native needs_action feed never
carries 46040), locked in by a regression test.

Two grok-4.5 review rounds: r1 found the 46040 extension regressed the
shared seam (no ANSWER/RESOLVED resolution, no tombstones, no expiry,
synthetic conversation ids, undefined breathe animation, e2e unable to
click-to-thread); r2 verified every item and approved. Orchestrator
added the tombstone LRU cap and the reconcile-isolation test from the
review nits.

Fixes #80

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
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.

Mission control: inline agent presence in the channel header

1 participant