fix(cmux-next): show progress while forking chats

Merged
TE
13d ago
+219-12

Problem

Fork starts a slow asynchronous host operation without showing that the click was accepted. A second click can arrive before the new session appears, and refusal/error feedback is easy to miss.

Change

Fork actions now use the live host chat.fork promise when available. The button enters a same-frame pending state, disables duplicate activation, shows a spinner while the fork/new-agent handoff is pending, then shows a success check or the existing localized fork failure state. Gallery and unit-test callers retain their injected fallback.

Leo described the problem as: “the fork button is slow with no feedback”.

Validation

  • bun test test/user-message-actions.test.tsx --test-name-pattern 'Fork|read prompt'
  • bunx vp lint src/agent-session/acpmux/conversation/MessageActions.tsx src/agent-session/acpmux/conversation/UserBubble.tsx src/agent-session/acpmux/conversation/TurnRows.tsx
  • Fleet compile and exact-head before/after captures will be added before merge.

Design reference

Matched the quiet, hover-first transcript action rows documented in apps/claude/live/NOTES.md and the fork action row reference apps/claude/live/transcript-user-message-actions-read-receipt.png.

Agent-Session: cmux16


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


Summary by cubic

Fork now shows immediate feedback in the transcript instead of looking inert while the host creates the new session.

  • The button enters a same-frame pending state, disables duplicate clicks, shows a spinner, then resolves to a success check or the existing localized failure state; empty or false host results count as refusal.
  • Pending state lasts through the live host chat.fork promise when available, and the app path now waits for session selection and persistence before resolving; injected fallbacks are unchanged.