Session Info scoped to a subagent holds still while the reader scrolls
Fixes #29639.
The right-hand session card reads the chat's rows through useHeldWhileScrolling (summary/heldWhileScrolling.ts, #29282), but Session Info scoped to a subagent read snapshot.subagentViews[shown] live, so it could change under the reader's own scroll as history paged in. Those rows now go through the same hold, keyed by chat and subagent: the rows from when the scroll began stay until it settles, then the paged-in rows land once. Another subagent or another chat takes its rows at once.
Only what Session Info lists is held; the header's Background tasks count stays live, as the chat's transcriptWork count already does.
Test: webviews/test/summary-held-while-scrolling.test.tsx adds a case for the subagent key (held mid-scroll, applied on settle, another subagent at once). Fast checks plus bun run check passed on cmux-ci: https://github.com/manaflow-ai/cmux/actions/runs/41332644983
Risk: small, one hook call in App.tsx feeding one prop.
Agent session: agent session
š¤ Generated with Claude Code
![View with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v3-3x.png)
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Fixes #29639. Subagent-scoped Session Info kept reading snapshot.subagentViews live, so history paging in under the reader's scroll changed its rows mid-gesture. It now uses the same held-while-scrolling mechanism as the chat's session card, keyed by chat and subagent: rows from when the scroll began stay until the scroll settles, then the paged-in rows land. Another subagent or chat takes its rows at once. Only the listed rows are held; the header's Background tasks count stays live.