google-gemini/gemini-cli

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

Open

#22 589 ouverte le 16 mars 2026

Voir sur GitHub
 (5 commentaires) (0 réactions) (1 assigné)TypeScript (13 657 forks)batch import
area/coreeffort/smallhelp wantedkind/bugpriority/p2status/bot-triaged

Métriques du dépôt

Stars
 (103 992 stars)
Métriques de merge PR
 (Merge moyen 4j 2h) (55 PRs mergées en 30 j)

Description

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

Guide contributeur