Skip to content

feat(sidebar): per-thread agent presence indicators#58

Merged
SymbolStar merged 1 commit into
mainfrom
feat/sidebar-thread-presence
Jun 3, 2026
Merged

feat(sidebar): per-thread agent presence indicators#58
SymbolStar merged 1 commit into
mainfrom
feat/sidebar-thread-presence

Conversation

@SymbolStar

Copy link
Copy Markdown
Owner

Implements the v0.2 sidebar layer of the agent-presence design (spec thread th_19e8c75d515_d67eef, design ref ref_938628).

What

Each sidebar thread row now shows 16px breathing avatars above its time stamp for any agent currently mid-run inside that thread.

Backend

forge_store.summarize_thread returns active_agents: [{agent_id, started_at}] aggregated from live status_chip posts (phase ∈ {thinking, running}). Earliest started_at per agent so the v1.1 long-tail grey-ring threshold fires when any item in the thread has been stuck ≥5min.

Frontend

  • .sb-presence stack: up to 3 + +N overflow, -5px overlap
  • 1.6s blue breathing ring; static grey ring at ≥5min (v1.1 hook, zero event-layer cost)
  • No fail/timeout dwell on the sidebar layer — sidebar is a navigation strip, not a status board (would mimic an unread badge)
  • aria-label / tooltip / prefers-reduced-motion honoured; dark-mode ring colour shift

Tests

pytest tests/514 passed.

cc @designer @alice

Adds 16px breathing-avatar stack above each sidebar thread row's time
stamp, surfacing which agents currently have a live run inside that
thread. Aggregates the per-item presence (v0.1) up to (thread_id,
agent_id) so the sidebar answers "which threads are hot" while the
thread-item-tail indicator still answers "hot in which step".

Backend (forge_store.summarize_thread):
- Scans live status_chip posts for phase in {thinking, running}
- Returns active_agents: [{agent_id, started_at}] with the EARLIEST
  started_at per agent so the v1.1 long-tail grey-ring threshold can
  fire when any item in the thread is stuck >5min
- Skips __router__ and resolves legacy chips by content fallback

Frontend (renderThreadList / renderSidebarPresence + style.css):
- New .sb-presence stack: up to 3 slots + "+N" overflow, -5px overlap
- Blue breathing ring (1.6s) for active, static grey ring once a slot
  is >=5min old (v1.1 hook, zero event-layer cost)
- No fail/timeout dwell on the sidebar layer per spec (run end =>
  immediate removal); navigation strip must not mimic an unread badge
- aria-label/title tooltips, prefers-reduced-motion disables animation,
  dark-mode ring colour shift

Spec: thread th_19e8c75d515_d67eef (alice/designer/bugfix 2026-06-03)
Design ref: ref_938628 (design-v0.2-threadlist.html)
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

🤖 bot-review (comment-only · phase 1)

Diff: 5 files changed, 140 insertions(+), 95 deletions(-) @ 36657b1

Red-line checks:

  • ✅ A-7.5: no new 'forbidden' code in xiaof

Needs human review — these paths are not eligible for future auto-approve:

  • .github/workflows/ci.yml (CI workflow — review for token/permission scope)

Phase 1: this bot leaves comments only. Auto-approve will be enabled per-path after 1–2 weeks of clean runs. Promotion plan: judy PR #42 follow-up.

@SymbolStar SymbolStar merged commit 39a110e into main Jun 3, 2026
7 checks passed
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