Skip to content

fix(a2a-server): resolve tool approval race condition and improve status reporting#26479

Merged
kschaab merged 9 commits intomainfrom
keithsc/fix/a2a-tool-approval-race
May 5, 2026
Merged

fix(a2a-server): resolve tool approval race condition and improve status reporting#26479
kschaab merged 9 commits intomainfrom
keithsc/fix/a2a-tool-approval-race

Conversation

@kschaab
Copy link
Copy Markdown
Contributor

@kschaab kschaab commented May 5, 2026

Summary

This PR addresses a race condition in the A2A server's task management where tasks could prematurely transition to an input-required state while tool calls were still being validated or processed.

Details

Key Changes:

  • Enhanced State Tracking: Refined the checkInputRequiredState logic in the Task class to accurately account for tools in validating and scheduled states, as well as tools already confirmed by the policy engine.
  • Robust Event Handling: Implemented schedulerId validation for event-driven tool call updates, ensuring that tasks only process events intended for them.
  • Improved Client Communication: Mapped the internal validating status to scheduled for client-facing status updates to provide a more consistent and understandable experience for external clients.
  • Outcome Tracking: The Task class now tracks tool call outcomes (e.g., accepted, rejected) and uses this data to more accurately detect and report meaningful state changes.
  • Expanded Testing: Added comprehensive unit tests for the race condition fix and status mapping, and updated existing E2E tests to reflect the improved status flow and event sequencing.

How to Validate

To validate end to end use yarn link in packages/src/a2a-server and then use yarn link "@google/gemini-cli-a2a-server" in the consumer. Then run a prompt that requires multiple tool calls in a single step. For example "Describe the purpose of each python file in this project" in a project with multiple python files.

Pre-Merge Checklist

  • Updated relevant documentation and README (if needed)
  • Added/updated tests (if needed)
  • Noted breaking changes (if any)
  • Validated on required platforms/methods:
    • MacOS
      • npm run
      • npx
      • Docker
      • Podman
      • Seatbelt
    • Windows
      • npm run
      • npx
      • Docker
    • Linux
      • npm run
      • npx
      • Docker

kschaab added 2 commits May 4, 2026 21:23
…eporting

- Enhanced Tool Call Tracking: Added pendingOutcomes to track tool call outcomes alongside statuses, ensuring more reliable change detection.
- Improved Waiting Logic: Refined _isWaitingForToolExecutionOrApproval to better handle 'validating' states and tools already confirmed by the agent.
- Client-Side Consistency: Mapped the internal 'validating' tool call status to 'scheduled' when serializing for clients, ensuring external state reporting is consistent.
- Test Updates: Adjusted E2E tests to align with the new 'scheduled' status reporting.
@kschaab kschaab requested a review from a team as a code owner May 5, 2026 01:44
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request improves the reliability of the A2A server's task management by addressing a race condition that caused premature state transitions. It introduces more robust state tracking for tool calls, enhances event handling security, and standardizes status reporting for external clients. These changes ensure a more predictable and consistent task execution flow.

Highlights

  • Race Condition Resolution: Refined task state management to correctly account for tools in 'validating' and 'scheduled' states, preventing premature transitions to 'input-required'.
  • Enhanced Event Security: Implemented scheduler ID validation for event-driven tool call updates to ensure tasks only process relevant events.
  • Improved Status Reporting: Mapped internal 'validating' status to 'scheduled' for client-facing updates to provide a more consistent experience.
  • Expanded Testing: Added comprehensive unit tests for the race condition fix and updated E2E tests to reflect the improved status flow.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request addresses race conditions in tool call scheduling by implementing scheduler ID validation for event-driven updates and refining task state transitions. Key changes include tracking tool call outcomes, mapping the internal 'validating' status to 'scheduled' for client communication, and updating tests to reflect these logic changes. The reviewer recommends enhancing type safety and consistency by replacing hardcoded string literals with the ToolConfirmationOutcome and CoreToolCallStatus enums.

Comment thread packages/a2a-server/src/agent/task.ts Outdated
Comment thread packages/a2a-server/src/agent/task.ts Outdated
Comment thread packages/a2a-server/src/agent/task.ts Outdated
Comment thread packages/a2a-server/src/agent/task.ts Outdated
kschaab and others added 4 commits May 4, 2026 18:51
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

Size Change: -4 B (0%)

Total Size: 34 MB

Filename Size Change
./bundle/chunk-7U3WSCE6.js 0 B -19.5 kB (removed) 🏆
./bundle/chunk-BOQW3KB6.js 0 B -49.2 kB (removed) 🏆
./bundle/chunk-FBZZXD74.js 0 B -14.7 MB (removed) 🏆
./bundle/chunk-GC2OC5H5.js 0 B -3.43 kB (removed) 🏆
./bundle/chunk-L4LYHGDX.js 0 B -658 kB (removed) 🏆
./bundle/chunk-R3LPUZS6.js 0 B -12.5 kB (removed) 🏆
./bundle/chunk-RH2NEQ3L.js 0 B -2.78 MB (removed) 🏆
./bundle/chunk-ZNV6UR3Z.js 0 B -3.8 kB (removed) 🏆
./bundle/core-M55NN2ZJ.js 0 B -48.7 kB (removed) 🏆
./bundle/devtoolsService-KNOWYCCA.js 0 B -28 kB (removed) 🏆
./bundle/gemini-KPVPY5CI.js 0 B -583 kB (removed) 🏆
./bundle/interactiveCli-RTCHLIQM.js 0 B -1.29 MB (removed) 🏆
./bundle/liteRtServerManager-UPWXJHQR.js 0 B -2.11 kB (removed) 🏆
./bundle/oauth2-provider-DZZFRZIX.js 0 B -9.16 kB (removed) 🏆
./bundle/chunk-4A55XU5J.js 658 kB +658 kB (new file) 🆕
./bundle/chunk-6R4MIX22.js 3.43 kB +3.43 kB (new file) 🆕
./bundle/chunk-CTKHFO3L.js 12.5 kB +12.5 kB (new file) 🆕
./bundle/chunk-G3K2MLNW.js 49.2 kB +49.2 kB (new file) 🆕
./bundle/chunk-MYVVRZ7J.js 3.8 kB +3.8 kB (new file) 🆕
./bundle/chunk-OIQO3WIM.js 14.7 MB +14.7 MB (new file) 🆕
./bundle/chunk-RCYULSZG.js 2.78 MB +2.78 MB (new file) 🆕
./bundle/chunk-RWYO7TNK.js 19.5 kB +19.5 kB (new file) 🆕
./bundle/core-2A5SNDGQ.js 48.7 kB +48.7 kB (new file) 🆕
./bundle/devtoolsService-CNIF465P.js 28 kB +28 kB (new file) 🆕
./bundle/gemini-MSPUUYKV.js 583 kB +583 kB (new file) 🆕
./bundle/interactiveCli-DFZUWATS.js 1.29 MB +1.29 MB (new file) 🆕
./bundle/liteRtServerManager-LLDJRBDY.js 2.11 kB +2.11 kB (new file) 🆕
./bundle/oauth2-provider-4M3Z4M4X.js 9.16 kB +9.16 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
./bundle/bundled/third_party/index.js 8 MB 0 B
./bundle/chunk-34MYV7JD.js 2.45 kB 0 B
./bundle/chunk-5AUYMPVF.js 858 B 0 B
./bundle/chunk-5PS3AYFU.js 1.18 kB 0 B
./bundle/chunk-664ZODQF.js 124 kB 0 B
./bundle/chunk-DAHVX5MI.js 206 kB 0 B
./bundle/chunk-ECNYAST2.js 1.97 MB 0 B
./bundle/chunk-IUUIT4SU.js 56.5 kB 0 B
./bundle/chunk-RJTRUG2J.js 39.8 kB 0 B
./bundle/cleanup-ORFERCU6.js 0 B -932 B (removed) 🏆
./bundle/devtools-36NN55EP.js 696 kB 0 B
./bundle/dist-T73EYRDX.js 356 B 0 B
./bundle/events-XB7DADIJ.js 418 B 0 B
./bundle/examples/hooks/scripts/on-start.js 188 B 0 B
./bundle/examples/mcp-server/example.js 1.43 kB 0 B
./bundle/gemini.js 5.1 kB 0 B
./bundle/getMachineId-bsd-TXG52NKR.js 1.55 kB 0 B
./bundle/getMachineId-darwin-7OE4DDZ6.js 1.55 kB 0 B
./bundle/getMachineId-linux-SHIFKOOX.js 1.34 kB 0 B
./bundle/getMachineId-unsupported-5U5DOEYY.js 1.06 kB 0 B
./bundle/getMachineId-win-6KLLGOI4.js 1.72 kB 0 B
./bundle/memoryDiscovery-FB7MMKTA.js 980 B 0 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/client/main.js 222 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js 229 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js 13.4 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/types.js 132 B 0 B
./bundle/sandbox-macos-permissive-open.sb 890 B 0 B
./bundle/sandbox-macos-permissive-proxied.sb 1.31 kB 0 B
./bundle/sandbox-macos-restrictive-open.sb 3.36 kB 0 B
./bundle/sandbox-macos-restrictive-proxied.sb 3.56 kB 0 B
./bundle/sandbox-macos-strict-open.sb 4.82 kB 0 B
./bundle/sandbox-macos-strict-proxied.sb 5.02 kB 0 B
./bundle/src-QVCVGIUX.js 47 kB 0 B
./bundle/start-G5BDDDPC.js 0 B -652 B (removed) 🏆
./bundle/tree-sitter-7U6MW5PS.js 274 kB 0 B
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB 0 B
./bundle/cleanup-4BVZSJFS.js 932 B +932 B (new file) 🆕
./bundle/start-CTMNXOUN.js 652 B +652 B (new file) 🆕

compressed-size-action

@gemini-cli gemini-cli Bot added the status/need-issue Pull requests that need to have an associated issue. label May 5, 2026
@kschaab kschaab added this pull request to the merge queue May 5, 2026
Merged via the queue into main with commit 1d72a12 May 5, 2026
27 checks passed
@kschaab kschaab deleted the keithsc/fix/a2a-tool-approval-race branch May 5, 2026 02:59
@kschaab
Copy link
Copy Markdown
Contributor Author

kschaab commented May 5, 2026

/patch

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

🚀 [Step 1/4] Patch workflow(s) waiting for approval!

📋 Details:

  • Channels: stable,preview
  • Commit: 1d72a120fb655b70d3d664f014482af11c81e681
  • Workflows Created: 2

⏳ Status: The patch creation workflow has been triggered and is waiting for deployment approval. Please visit the specific workflow links below and approve the runs.

🔗 Track Progress:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

🚀 [Step 2/4] Patch PR Created!

📋 Patch Details:

📝 Next Steps:

  1. Review and approve the hotfix PR: #26508
  2. Once merged, the patch release will automatically trigger
  3. You'll receive updates here when the release completes

🔗 Track Progress:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

🚀 [Step 2/4] Patch PR Created!

📋 Patch Details:

📝 Next Steps:

  1. Review and approve the hotfix PR: #26510
  2. Once merged, the patch release will automatically trigger
  3. You'll receive updates here when the release completes

🔗 Track Progress:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

🚀 [Step 3/4] Patch Release Waiting for Approval!

📋 Release Details:

  • Environment: prod
  • Channel: preview → publishing to npm tag preview
  • Version: v0.41.0-preview.1
  • Hotfix PR: Merged ✅
  • Release Branch: release/v0.41.0-preview.1-pr-26479

⏳ Status: The patch release has been triggered and is waiting for deployment approval. Please visit the specific workflow run link below and approve the deployment. You'll receive another update when it completes.

🔗 Track Progress:

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

[Step 4/4] Patch Release Complete!

📦 Release Details:

🎉 Status: Your patch has been successfully released and published to npm!

📝 What's Available:

🔗 Links:

kimjune01 pushed a commit to kimjune01/gemini-cli-claude that referenced this pull request May 6, 2026
…tus reporting (google-gemini#26479)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status/need-issue Pull requests that need to have an associated issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants