Part of #3104
While root waits on a delegated sub-agent, the user can't tell who is working or that the delegation is still in progress. The waiting spinner is anonymous and the transfer_task card always shows a green ✓.
Proposed changes
- Status-aware
transfer_task card. In pkg/tui/components/tool/transfertask/transfertask.go, pick the icon from msg.ToolStatus (pending/running → spinner or ToolPendingIcon; completed → ToolCompletedIcon ✓; error → ToolErrorIcon) instead of the hardcoded ✓. The Renderer already receives the message and a spinner.Spinner, so a running delegation can animate. Mirror the status branching already used in pkg/tui/components/toolcommon/common.go.
- Name the waiting state. Replace the anonymous pending spinner with a labeled one for delegations, e.g.
⟳ root → <child> (delegating…). Add a label-carrying spinner constructor in pkg/tui/types/types.go, render it in pkg/tui/components/message/message.go (case types.MessageTypeSpinner), and populate it from handleStreamStarted / setPendingResponse (pkg/tui/page/chat/runtime_events.go, chat.go) using the current/previous agent names and streamDepth.
Acceptance criteria
- An in-progress
transfer_task shows a non-✓ (animated/pending) indicator; completed shows ✓; error shows the error icon.
- The waiting spinner names the child agent (ideally parent → child).
- The labeled spinner stays animated/uncached (
messageModel.isSpinnerDriven() still returns true for it).
Validation
task build && task test && task lint green.
- New render test for the
transfertask renderer per ToolStatus.
- New
message test that the labeled spinner renders the parent→child text and remains spinner-driven.
Part of #3104
While
rootwaits on a delegated sub-agent, the user can't tell who is working or that the delegation is still in progress. The waiting spinner is anonymous and thetransfer_taskcard always shows a green ✓.Proposed changes
transfer_taskcard. Inpkg/tui/components/tool/transfertask/transfertask.go, pick the icon frommsg.ToolStatus(pending/running → spinner orToolPendingIcon; completed →ToolCompletedIcon✓; error →ToolErrorIcon) instead of the hardcoded ✓. TheRendereralready receives the message and aspinner.Spinner, so a running delegation can animate. Mirror the status branching already used inpkg/tui/components/toolcommon/common.go.⟳ root → <child> (delegating…). Add a label-carrying spinner constructor inpkg/tui/types/types.go, render it inpkg/tui/components/message/message.go(case types.MessageTypeSpinner), and populate it fromhandleStreamStarted/setPendingResponse(pkg/tui/page/chat/runtime_events.go,chat.go) using the current/previous agent names andstreamDepth.Acceptance criteria
transfer_taskshows a non-✓ (animated/pending) indicator; completed shows ✓; error shows the error icon.messageModel.isSpinnerDriven()still returns true for it).Validation
task build && task test && task lintgreen.transfertaskrenderer perToolStatus.messagetest that the labeled spinner renders the parent→child text and remains spinner-driven.