Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Jan 19, 2026

Tool invocations were appearing twice in chat when user confirmation was needed: once in "running" state during confirmation, then again as "finished" after execution.

Changes

Push invocations immediately when tool_use blocks arrive

  • Modified handleAssistantMessage() to push ChatToolInvocationPart when tool_use blocks are received from Claude
  • Track pushed tool IDs in a Set<string> passed through the message processing pipeline

Skip duplicate pushes in tool result handling

  • Modified processToolResult() to check if invocation already pushed before creating new one
  • Prevents duplicate invocations for same tool ID

Flow change

// Before: push only when result arrives
tool_use  (confirmation)  tool_result  push invocation (duplicate!)

// After: push immediately, skip on result
tool_use  push invocation  (confirmation)  tool_result  skip push

Trade-off

Denied tools will show isConfirmed=true since ChatToolInvocationPart is immutable after push. This is preferable to duplicate invocations appearing in chat.

Original prompt

The claudeCodeAgent is able to get confirmation from the user when they want to run like a terminal command or something. The downside is when on confirmation, the tool call that triggered that confirmation is added to chat in a "running" state but then a new finished tool pops into chat.

In other words we are pushing a new finished tool call the chat rather than completing the existing one. Fix this


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 2 commits January 19, 2026 18:35
When a Claude tool requires user confirmation, the tool invocation was being
added to chat twice:
1. Once when confirmation is requested (in "running" state)
2. Again when the tool result comes back (as "finished")

This change fixes the issue by:
- Pushing tool invocations immediately when tool_use blocks arrive from the assistant
- Tracking which tool IDs have already been pushed
- Skipping the push in processToolResult if the invocation was already added

This ensures each tool appears exactly once in the chat, even when confirmation
is required.

Co-authored-by: TylerLeonhardt <2644648+TylerLeonhardt@users.noreply.github.com>
Added clearer explanation of why we cannot update tool invocation status
after it's been pushed to the stream, and clarified the trade-off between
duplicate invocations and incorrect status for denied tools.

Co-authored-by: TylerLeonhardt <2644648+TylerLeonhardt@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix tool calls displaying as running instead of completing Fix duplicate tool invocations when confirmation required in Claude Code Agent Jan 19, 2026
Copilot AI requested a review from TylerLeonhardt January 19, 2026 18:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants