cmux NEXT: render Session Info activity parity natively
The native Session Info renderer now consumes every activity field the page sends and keeps the native path disabled by default until the parity flip lands.
Changes:
- Add Codable
working,wave(index,periodMs,stepMs), andprogressrow fields. - Draw retrying rows with the page-requested spinner, running waves with the page-supplied cadence/phase, and workflow progress text without changing page policy.
- Restart wave animation when the window becomes occluded or visible again, while keeping server rows static like the web panel.
- Add a focused AppKit model/render mapping test for the activity fields.
The model audit covers every field in webviews/src/agent-session/acpmux/session-info/native/model.ts: session geometry and labels, sections and fold/reorder metadata, row symbols/colors/text/state, meters/segments, actions/buttons/menus/toggles, hover/help, marks, and the activity fields above. Swift remains a thin renderer; the page owns all section computation and actions.
Leo's words, softened for public text: “plus we're gonna be doing that part natively in Swift anyways?” and “But I literally said to do that.”
Leo-ask: ask-560d04c05d
Native path remains off by default behind agent.sessionInfo.native; the default flip is tracked separately in #32159.
Agent session: agent session
![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
The native Session Info renderer now mirrors web parity for running and retrying rows, consuming the page's working, wave, and progress fields instead of inferring spinner state from row tone locally.
- Retrying rows show the page-requested spinner; running rows animate a three-dot wave at the page-supplied index, period, and step, with server rows kept static like the web panel.
- Wave animation restarts when the window becomes occluded or visible again, and the observer is removed on teardown.
- Double-clicking the resize edge resets the panel width to its default.
- The native path remains off by default behind
agent.sessionInfo.native; the default flip lands separately.