google-gemini/gemini-cli

fix(cli): all Executing subagent tool calls dropped from UI state, breaking task-tree hierarchy

Open

#22,589 建立於 2026年3月16日

在 GitHub 查看
 (3 留言) (0 反應) (1 負責人)TypeScript (103,992 star) (13,657 fork)batch import
area/coreeffort/smallhelp wantedkind/bugpriority/p2status/bot-triaged

描述

Bug Description

In useToolScheduler.ts, tool calls from non-root schedulers (subagents) are filtered before entering state. The filter passes through AwaitingApproval calls and previously-seen calls, but silently drops first-seen calls in Executing status:

event.toolCalls.filter(
  (tc) =>
    tc.status === CoreToolCallStatus.AwaitingApproval ||
    prevCallIds.has(tc.request.callId),
);

Subagent tool calls that transition directly to Executing without first hitting AwaitingApproval — reads, globs, searches, MCP calls, and any non-dangerous tool — are never in prevCallIds on their first update, so they are dropped and never reach the UI.

Impact

Hierarchy display is broken for subagent work. The task-tree visualization feature builds its call graph using `parentCallId` on each `IndividualToolCallDisplay`. Because filtered-out calls never enter `toolCallsMap`, they are never included in `pendingHistoryItems`, and so `useTaskTree` never sees them. The tree is always flat even when a subagent is executing a deep call chain.

Beyond the task tree: any UI feature that needs to observe what a subagent is actually doing (live progress, step-through mode, error traces) is blind to these calls.

Relationship to #21052 / PR #21268

PR #21268 addresses a narrower slice of the same root cause: it adds tc.pid !== undefined to the filter so that interactive shell calls (PTY-backed) are surfaced when they hang on user input. This fix is complementary — it extends the pass-through to all Executing subagent calls, covering non-shell tools (reads, MCP, etc.) that #21268 intentionally leaves filtered.

Fix

Add Executing status to the filter unconditionally:

tc.status === CeToolCallStatus.AwaitingApproval ||
tc.status === CoreToolCallStatus.Executing ||
prevCallIds.has(tc.request.callId),

Calls still in Scheduled/Validating remain hidden to prevent transient flicker in the flat-list UI.

PR

https://github.com/TravisHaa/gemini-cli/tree/fix/subagent-tool-calls-hidden-from-task-tree

Related: #21052, PR #21268

貢獻者指南