Skip to content

Conversation

@scidomino
Copy link
Collaborator

@scidomino scidomino commented Jan 21, 2026

Summary

drain stdin on exit to prevent printing garbage characters

Related Issues

Fixes #16801

How to Validate

This issue is hard to reproduce so just check that it doesn't break anything.

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

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @scidomino, 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 an issue where unexpected 'garbage characters' could appear on the console when the application exits. It introduces a mechanism to explicitly drain the standard input buffer during the cleanup phase, ensuring that any pending input is consumed harmlessly and preventing its erroneous display. This change aims to improve the robustness and cleanliness of the application's shutdown process.

Highlights

  • New drainStdin Utility: Introduced a new asynchronous utility function drainStdin designed to manage and clear the standard input buffer.
  • Integrated into Exit Cleanup: The drainStdin function is now called as part of the runExitCleanup process, ensuring it executes before the application fully exits.
  • Prevents Garbage Characters: The primary purpose of drainStdin is to prevent the printing of unexpected 'garbage characters' on exit by resuming stdin, removing existing 'data' listeners, and attaching a no-op listener to consume any buffered input.
  • OS Buffer Flush: A short 50ms delay is included within drainStdin to allow the operating system's input buffer to flush completely.
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.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

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.

@scidomino scidomino marked this pull request as ready for review January 21, 2026 20:38
@scidomino scidomino requested a review from a team as a code owner January 21, 2026 20:38
Copy link
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

The pull request introduces a mechanism to drain stdin on exit to prevent garbage characters from being printed in the terminal. This is achieved by resuming stdin and consuming all data for a short period. While the intention is good, the implementation uses a fixed setTimeout of 50ms, which introduces a race condition and is not guaranteed to solve the problem under all circumstances, especially on a heavily loaded system. It also adds a constant delay to the application's exit time. My review focuses on the fragility of this time-based approach.

Comment on lines +98 to +100
// Give it a moment to flush the OS buffer.
await new Promise((resolve) => setTimeout(resolve, 50));
Copy link
Contributor

Choose a reason for hiding this comment

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

high

Using a fixed setTimeout to drain the stdin buffer introduces a race condition. While this might work in most cases, it's not guaranteed to be effective. If the system is under heavy load, or if there's a large amount of data in the input buffer, 50ms might not be sufficient to drain it completely. This could lead to the original problem of garbage characters reappearing. Conversely, for a quick exit, this adds an unconditional 50ms delay to the process shutdown time, which can be perceived as a performance regression.

A more robust, deterministic solution should be investigated. If one is not feasible, this magic number should be extracted into a named constant with a detailed comment explaining the heuristic and its trade-offs.

@github-actions
Copy link

github-actions bot commented Jan 21, 2026

Size Change: +229 B (0%)

Total Size: 23.1 MB

ℹ️ View Unchanged
Filename Size Change
./bundle/gemini.js 23.1 MB +229 B (0%)
./bundle/sandbox-macos-permissive-closed.sb 1.03 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-closed.sb 3.29 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

compressed-size-action

Copy link
Collaborator

@jacob314 jacob314 left a comment

Choose a reason for hiding this comment

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

lgtm

@gemini-cli gemini-cli bot added the area/core Issues related to User Interface, OS Support, Core Functionality label Jan 21, 2026
@scidomino scidomino enabled auto-merge January 21, 2026 20:58
@scidomino scidomino added this pull request to the merge queue Jan 21, 2026
Merged via the queue into main with commit dce450b Jan 21, 2026
25 checks passed
@scidomino scidomino deleted the tomm_exit branch January 21, 2026 21:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/core Issues related to User Interface, OS Support, Core Functionality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Gemini CLI often shows 9;5u on exit in Ghostty

2 participants