Skip to content

fix(core): make read_background_output delay abort-aware#27839

Open
SandyTao520 wants to merge 1 commit into
mainfrom
st/fix/abort-aware-background-read-delay
Open

fix(core): make read_background_output delay abort-aware#27839
SandyTao520 wants to merge 1 commit into
mainfrom
st/fix/abort-aware-background-read-delay

Conversation

@SandyTao520

Copy link
Copy Markdown
Contributor

Summary

Pressing ESC to cancel a read_background_output call marked it as cancelled
in the UI, but the spinner kept spinning and new prompts were queued. The
tool's optional delay_ms sleep used a plain setTimeout that ignored the
abort signal, so the underlying tool promise kept the scheduler's executing
slot occupied until the timer fired.

Details

  • ReadBackgroundOutputInvocation.execute now uses the abortable
    setTimeout from node:timers/promises, passing the execution
    abortSignal.
  • On cancellation the pending delay rejects immediately with an
    AbortError, which tool-executor.ts already converts into a
    Cancelled result via its isAbortError handling — no executor changes
    needed.
  • Added unit tests covering abort-during-delay and an already-aborted
    signal.

Related Issues

Fixes #18007

How to Validate

  1. Run npm test -w @google/gemini-cli-core -- src/tools/shellBackgroundTools.test.ts
    — all 12 tests pass, including the two new abort cases.
  2. Manual: start a background shell command, have the agent call
    read_background_output with a large delay_ms (e.g. 30000), press ESC.
    The spinner stops immediately and the next prompt is accepted without
    queueing.

Pre-Merge Checklist

  • Updated relevant documentation and README (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

Pressing ESC during a read_background_output call with delay_ms left the
scheduler blocked until the timer fired, since the sleep ignored the abort
signal. Use the abortable timers/promises setTimeout so cancellation
rejects immediately with an AbortError, which the tool executor already
converts into a Cancelled result.

Fixes #18007
@SandyTao520 SandyTao520 requested a review from a team as a code owner June 10, 2026 18:38
@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 addresses a responsiveness issue in the read_background_output tool where cancellation requests were ignored during the configured delay period. By switching to an abort-aware timer, the tool now correctly respects the AbortSignal, allowing the system to immediately halt execution and release the scheduler slot upon user cancellation.

Highlights

  • Abort-aware delay implementation: Updated the read_background_output tool to use node:timers/promises's setTimeout with an AbortSignal, ensuring that any pending delays are immediately cancelled when a user interrupts the process.
  • Improved cancellation responsiveness: Fixed an issue where background tool execution remained blocked during the delay_ms period even after a user requested cancellation, preventing unnecessary queuing of new prompts.
  • Added regression testing: Introduced new unit tests to verify that read_background_output correctly rejects with an AbortError when the signal is triggered during a delay or is already aborted.
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 the 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 counterproductive. 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.

@github-actions github-actions Bot added the size/s A small PR label Jun 10, 2026
@github-actions

Copy link
Copy Markdown

📊 PR Size: size/S

  • Lines changed: 34
  • Additions: +32
  • Deletions: -2
  • Files changed: 2

@github-actions

Copy link
Copy Markdown

🛑 Action Required: Evaluation Approval

Steering changes have been detected in this PR. To prevent regressions, a maintainer must approve the evaluation run before this PR can be merged.

Maintainers:

  1. Go to the Workflow Run Summary.
  2. Click the yellow 'Review deployments' button.
  3. Select the 'eval-gate' environment and click 'Approve'.

Once approved, the evaluation results will be posted here automatically.

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

Copy link
Copy Markdown
Contributor

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 updates the ReadBackgroundOutputInvocation class in shellBackgroundTools.ts to use an abort-aware delay using setTimeout from node:timers/promises instead of a standard Promise with setTimeout. This ensures that when the user cancels, the delay is aborted immediately rather than blocking the scheduler. Corresponding unit tests have been added in shellBackgroundTools.test.ts to verify that the delay aborts correctly when the signal is aborted or already aborted. There are no review comments to address, and I have no feedback to provide.

@github-actions

Copy link
Copy Markdown

Size Change: +38 B (0%)

Total Size: 33.9 MB

Filename Size Change
./bundle/chunk-42QHW2SC.js 0 B -49.2 kB (removed) 🏆
./bundle/chunk-4I2I7254.js 0 B -16.4 MB (removed) 🏆
./bundle/chunk-6E64QBRQ.js 0 B -3.77 kB (removed) 🏆
./bundle/chunk-HYZJSAM6.js 0 B -2.79 MB (removed) 🏆
./bundle/chunk-JZZT7NLW.js 0 B -19.5 kB (removed) 🏆
./bundle/chunk-R324SQRK.js 0 B -3.43 kB (removed) 🏆
./bundle/chunk-STGQJFLO.js 0 B -661 kB (removed) 🏆
./bundle/chunk-SUN5ZVKV.js 0 B -13 kB (removed) 🏆
./bundle/core-3FNMUWMY.js 0 B -49.9 kB (removed) 🏆
./bundle/devtoolsService-T6EUYQBM.js 0 B -28 kB (removed) 🏆
./bundle/gemini-EBFXJQ5N.js 0 B -589 kB (removed) 🏆
./bundle/interactiveCli-BRCXK66I.js 0 B -1.3 MB (removed) 🏆
./bundle/liteRtServerManager-RFO4KVQF.js 0 B -2.08 kB (removed) 🏆
./bundle/oauth2-provider-UMFUVW6D.js 0 B -9.12 kB (removed) 🏆
./bundle/chunk-4KJ4RQEZ.js 49.2 kB +49.2 kB (new file) 🆕
./bundle/chunk-AWVYCTWR.js 3.43 kB +3.43 kB (new file) 🆕
./bundle/chunk-BAVJJ2LR.js 13 kB +13 kB (new file) 🆕
./bundle/chunk-BPC76XMM.js 2.79 MB +2.79 MB (new file) 🆕
./bundle/chunk-J4NX7SEI.js 3.77 kB +3.77 kB (new file) 🆕
./bundle/chunk-Q44NJMRU.js 19.5 kB +19.5 kB (new file) 🆕
./bundle/chunk-SYN7RK3W.js 661 kB +661 kB (new file) 🆕
./bundle/chunk-WK45ALGL.js 16.4 MB +16.4 MB (new file) 🆕
./bundle/core-WNZK32W6.js 49.9 kB +49.9 kB (new file) 🆕
./bundle/devtoolsService-SLP25BAX.js 28 kB +28 kB (new file) 🆕
./bundle/gemini-DR7EHSJ6.js 589 kB +589 kB (new file) 🆕
./bundle/interactiveCli-RTTFCFAN.js 1.3 MB +1.3 MB (new file) 🆕
./bundle/liteRtServerManager-VJO5R2DG.js 2.08 kB +2.08 kB (new file) 🆕
./bundle/oauth2-provider-WDJC242V.js 9.12 kB +9.12 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-6HI7VNOG.js 124 kB 0 B
./bundle/chunk-DAHVX5MI.js 206 kB 0 B
./bundle/chunk-IUUIT4SU.js 56.5 kB 0 B
./bundle/chunk-TUDYL3X4.js 40.3 kB 0 B
./bundle/cleanup-QUDIO6SM.js 0 B -902 B (removed) 🏆
./bundle/devtools-V7NE4CQA.js 696 kB 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.38 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/https-proxy-agent-AVGR4LHR.js 490 B 0 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB 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-LG4OHBW7.js 233 kB 0 B
./bundle/src-QVCVGIUX.js 47 kB 0 B
./bundle/start-2V3YWT52.js 0 B -622 B (removed) 🏆
./bundle/tree-sitter-7U6MW5PS.js 274 kB 0 B
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB 0 B
./bundle/worker/worker-entry.js 361 kB 0 B
./bundle/cleanup-HS3KYXDH.js 902 B +902 B (new file) 🆕
./bundle/start-HDCAG4JO.js 622 B +622 B (new file) 🆕

compressed-size-action

@gemini-cli gemini-cli Bot added the area/unknown Triage automation assigns this label to issues that it is unable to classify label Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/unknown Triage automation assigns this label to issues that it is unable to classify size/s A small PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make the world a better place

1 participant