Task tool (subagents) not displayed with special treatment in app

Status Fixed / completed
Maintainer reply None cached
Activity 2 comments · opened Feb 19, 2026 · closed Feb 19, 2026

Summary

When Claude uses the Task tool to spawn subagents (for research, exploration, etc.), the app displays them as regular tool cards instead of with a special "Thinking: description..." display that would match the Mac CLI's visual treatment of background agents.

Current Behavior

  • Task tool appears as a generic tool card with the robot icon
  • The tool input is shown as raw JSON (or parsed description)
  • No visual indication that work is happening in the background
  • No clear distinction from other tools like Read/Write/Bash

Expected Behavior

  • Subagent invocations should show a distinctive UI:
  • "Thinking: [task description]..." text
  • The agent's prompt should be viewable (like thinking content)
  • Visual indication of background activity
  • Should match the StreamUpdateType.subagent handling that exists in the Dart code

Root Cause Analysis

The Dart code defines StreamUpdateType.subagent (in claude_tool_service.dart line 42), but the Rust engine only emits StreamUpdateType::ToolUse for all tool calls including Task.

The Rust parser (parser/types.rs) has no Subagent variant in its StreamUpdateType enum.

The _processStreamUpdate method in ssh_chat_screen.dart has a case StreamUpdateType.subagent: handler (lines 1999-2011) that would show the special display, but this code path is never reached because:

  1. Rust emits ToolUse for Task tool
  2. _convertUpdateType in engine_session_adapter.dart maps Rust ToolUse → Dart toolUse
  3. The Dart subagent type is never used

Proposed Fix Options

Option A: Client-side detection (simpler)

In _processStreamUpdate or _convertEvent, check if toolName == "Task" and convert to StreamUpdateType.subagent:

// In engine_session_adapter.dart _convertEvent()
case StreamUpdateType.toolUse:
  final toolName = event.toolName ?? 'unknown';
  if (toolName == 'Task') {
    return ClaudeStreamUpdate(
      type: StreamUpdateType.subagent,  // Convert to subagent
      content: ...,
      metadata: {'description': input['description'], 'prompt': input['prompt']},
    );
  }
  // ... normal toolUse handling

Option B: Rust-side (more comprehensive)

Add StreamUpdateType::Subagent to the Rust enum and detect Task tool in the parser, emitting the new type.

Related

This is related to the thinking display improvements - both are about showing Claude's internal processes more clearly to the user.

Files Affected

  • rust/src/parser/types.rs - StreamUpdateType enum
  • lib/services/engine_session_adapter.dart - type conversion
  • lib/screens/ssh_chat_screen.dart - existing subagent handler at line 1999

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗