Skip to content

fix(policy): add EBUSY fallback and TOML parse recovery (#19919) - #21541

Merged
scidomino merged 7 commits into
google-gemini:mainfrom
krishdef7:fix/policy-persistence-complete
Jun 3, 2026
Merged

fix(policy): add EBUSY fallback and TOML parse recovery (#19919)#21541
scidomino merged 7 commits into
google-gemini:mainfrom
krishdef7:fix/policy-persistence-complete

Conversation

@krishdef7

@krishdef7 krishdef7 commented Mar 7, 2026

Copy link
Copy Markdown
Contributor

Follow-up to #19921 by @Sikandar1310291, which fixes #19919.
That PR addressed the core issue but two items from @mrpmohiburrahman's review were unaddressed and the branch had conflicts with main. This PR cherry-picks their work and adds:

EBUSY fallback - extends the rename error catch to handle EBUSY alongside EXDEV, covering Docker bind-mount scenarios on Linux aarch64
TOML parse recovery - if the policy file is corrupted, backs it up to .bak, emits a user-visible warning, and resets to a clean state instead of bricking the CLI

All 13 persistence tests pass. 4 pre-existing failures in workspace-policy.test.ts and config.test.ts are unrelated to this change and present on main.
Fixes #19919
Credit: @Sikandar1310291 and @awais62 for the original implementation.

@krishdef7
krishdef7 requested a review from a team as a code owner March 7, 2026 06:28
@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 refactors the input handling mechanism to explicitly differentiate between typed and pasted user input. A new isPasted flag has been introduced and propagated through the input submission pipeline, enabling the system to intelligently modify behavior for pasted content. Specifically, this change prevents automatic @ command expansion when input is pasted, enhancing user control and predictability. Note: The provided code changes do not align with the PR title and description, which mention policy fixes related to EBUSY and TOML parsing. This summary is based solely on the observed code modifications.

Highlights

  • Input Handling Refinement: Introduced an isPasted flag to accurately identify if user input originated from a paste event, allowing for differentiated processing.
  • @ Command Expansion Control: Modified the @ command processing logic to skip automatic expansion for pasted input, preventing unintended command execution and improving user experience.
  • API Updates for Paste Detection: Updated InputPrompt's onSubmit prop, AppContainer's handleFinalSubmit and submitQuery, and useGeminiStream's prepareQuery and submitQuery to propagate the new isPasted flag throughout the input submission flow.
  • Test Coverage: Adjusted existing tests for InputPrompt to correctly pass the isPasted parameter, ensuring the new functionality is properly validated.
Changelog
  • packages/cli/src/ui/AppContainer.tsx
    • The handleFinalSubmit and submitQuery functions were updated to accept an isPasted boolean parameter.
  • packages/cli/src/ui/components/InputPrompt.test.tsx
    • Test cases for InputPrompt were modified to include the isPasted parameter (mostly false) in onSubmit calls, with one specific test for paste events passing true.
  • packages/cli/src/ui/components/InputPrompt.tsx
    • The onSubmit prop in InputPromptProps was updated to include an optional isPasted boolean.
    • The handleSubmit function was modified to detect if input was pasted and pass this information to onSubmit.
    • The recentUnsafePasteTime was added to the handleSubmit useCallback dependencies.
  • packages/cli/src/ui/hooks/atCommandProcessor.ts
    • The HandleAtCommandParams interface was updated to include an optional isPasted boolean.
    • The handleAtCommand function was modified to skip @ command expansion if the input was identified as pasted.
  • packages/cli/src/ui/hooks/useGeminiStream.ts
    • The prepareQuery function signature was updated to include an isPasted boolean parameter.
    • The submitQuery function signature was updated to include an optional isPasted property within its options object.
    • The isPasted flag is now correctly propagated from submitQuery to prepareQuery and then to handleAtCommand.
Activity
  • No human activity has been recorded for this pull request yet.
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.

@krishdef7
krishdef7 force-pushed the fix/policy-persistence-complete branch from 26e7fd1 to ffce059 Compare March 7, 2026 06:37

@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 introduces a mechanism to prevent automatic @ command expansion when the input is pasted, which is a useful feature to avoid unintended behavior. However, the pull request title and description are completely unrelated to these changes, referring instead to policy file fixes. This discrepancy is critical as it makes the repository's history misleading and hard to follow. Please update the title and description to accurately reflect the changes made in this PR. The code changes themselves seem to correctly implement the paste detection for unsafe and large pastes, but I've noted one case that appears to be missed.

Note: Security Review did not run due to the size of the PR.

Comment thread packages/cli/src/ui/components/InputPrompt.tsx Outdated
@krishdef7
krishdef7 force-pushed the fix/policy-persistence-complete branch from ffce059 to 9f9afce Compare March 7, 2026 06:42
@gemini-cli gemini-cli Bot added priority/p2 Important but can be addressed in a future release. area/core Issues related to User Interface, OS Support, Core Functionality help wanted We will accept PRs from all issues marked as "help wanted". Thanks for your support! labels Mar 7, 2026
@krishdef7
krishdef7 force-pushed the fix/policy-persistence-complete branch from 9f9afce to 3ce09f4 Compare March 11, 2026 09:40
@krishdef7

Copy link
Copy Markdown
Contributor Author

The bot summary above is stale, it describes an earlier version of this branch that accidentally included unrelated commits. The current diff is +215/-26, touching only packages/core/src/policy/. The bot summary will not update retroactively.
Hi @Abhijit-2592 @mrpmohiburrahman, you reviewed #19921 which this PR builds on. This PR cherry-picks that work and adds the two items from your review that were unaddressed: the EBUSY fallback and TOML parse recovery. Would appreciate your eyes on this when you get a chance.

@krishdef7
krishdef7 force-pushed the fix/policy-persistence-complete branch from 05ed99d to e4b54aa Compare March 11, 2026 11:19
@samidhachari

Copy link
Copy Markdown

Thanks for the fix and for clarifying the earlier bot summary. Since the bot mentioned that the previous diff included unrelated commits, just to confirm — the current changes are now limited to packages/core/src/policy/ and fully align with the PR title and description, correct?

@krishdef7
krishdef7 force-pushed the fix/policy-persistence-complete branch from e4b54aa to ef04c64 Compare March 13, 2026 06:28
@krishdef7

krishdef7 commented Mar 13, 2026

Copy link
Copy Markdown
Contributor Author

Yes, confirmed, the current diff touches only packages/core/src/policy/ (3 files: config.ts, persistence.test.ts, policy-updater.test.ts). The earlier bot summary described an accidentally included unrelated branch that has since been cleaned up.

@krishdef7

Copy link
Copy Markdown
Contributor Author

Added two missing tests to persistence.test.ts: EBUSY fallback (mirrors the EXDEV test) and TOML parse recovery (corrupted file → backup to .bak → reset to clean state). Also fixed all mocking to use vi.spyOn instead of vi.mocked, the latter doesn't work here since node:fs/promises is replaced wholesale by memfs rather than wrapped by vitest's mock system. All 13 tests passing.

@krishdef7
krishdef7 force-pushed the fix/policy-persistence-complete branch from ef04c64 to 3da98c3 Compare March 14, 2026 06:18
@krishdef7

Copy link
Copy Markdown
Contributor Author

/gemini review

@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 introduces important robustness improvements to the policy persistence logic. However, critical security vulnerabilities have been identified and highlighted in the comments: the use of fs.copyFile in these new paths follows symbolic links, which could be exploited by a malicious workspace to overwrite or disclose sensitive files. It is strongly recommended to add checks to ensure the policy file is not a symbolic link before performing copy operations, as detailed in the specific feedback. Despite this, the changes are well-implemented with solid error handling and comprehensive tests, indicating high overall quality.

Comment thread packages/core/src/policy/config.ts Outdated
Comment thread packages/core/src/policy/config.ts
@krishdef7
krishdef7 force-pushed the fix/policy-persistence-complete branch from 3da98c3 to 380cb1a Compare March 16, 2026 04:37
@krishdef7

Copy link
Copy Markdown
Contributor Author

/gemini review

@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 addresses handling file renaming failures (EXDEV/EBUSY) in the Gemini CLI policy configuration, particularly in Docker bind-mount scenarios. It introduces a fallback mechanism by copying and unlinking files to ensure policy persistence. The changes include modifications to packages/core/src/policy/config.ts and packages/core/src/policy/persistence.test.ts, along with a minor update to packages/core/src/policy/policy-updater.test.ts.

Comment thread packages/core/src/policy/config.ts
Comment thread packages/core/src/policy/persistence.test.ts Outdated
Comment thread packages/core/src/policy/persistence.test.ts Outdated
Comment thread packages/core/src/policy/persistence.test.ts
Comment thread packages/core/src/policy/persistence.test.ts
Comment thread packages/core/src/policy/persistence.test.ts Outdated
@krishdef7
krishdef7 force-pushed the fix/policy-persistence-complete branch from 380cb1a to 0721c0e Compare March 20, 2026 18:19
@krishdef7

Copy link
Copy Markdown
Contributor Author

@mrpmohiburrahman @Abhijit-2592, rebased onto latest main. This directly addresses the two items flagged in your review on #19921: EBUSY fallback and TOML parse recovery, both with symlink guards. All 13 tests pass. Would appreciate a review when you get a chance.

@krishdef7

Copy link
Copy Markdown
Contributor Author

Closing to focus bandwidth on higher-priority PRs. The EBUSY fallback and TOML parse recovery work stands on its own, happy to reopen if a maintainer wants to pull this forward.

@cocosheng-g

Copy link
Copy Markdown
Contributor

please solve conflicts

…e-gemini#19919)

- Include actual error cause in user-visible feedback message
- Clean up orphaned tmp files when write operations fail
- Abort persistence on non-ENOENT read errors (e.g. EACCES)
  to prevent silently overwriting existing policy files
- Add EXDEV cross-device rename fallback (copy + unlink)
- Fix existing tests to use proper ENOENT errors
- Add 4 new tests for error diagnostics, cleanup, EACCES
  abort, and EXDEV fallback
alt-glitch pushed a commit to NousResearch/hermes-agent that referenced this pull request Jun 14, 2026
* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* feat(dashboard): add Debug Share to the System page

Surface `hermes debug share` in the dashboard. The System > Operations
section gets a dedicated card that uploads a redacted report + full logs
and returns the paste URLs as real, copyable links instead of a log tail.

- debug.py: factor a pure build_debug_share() returning structured
  {urls, failures, redacted, auto_delete_seconds}; run_debug_share now
  calls it (CLI output unchanged).
- web_server.py: POST /api/ops/debug-share runs the share core in a
  worker thread and returns the structured payload synchronously (the
  URLs are the whole point — not a backgrounded action).
- api.ts: runDebugShare() + DebugShareResponse.
- SystemPage.tsx: share card with a redaction toggle (on by default),
  per-link + copy-all buttons, and the 6h auto-delete countdown.
- tests: build_debug_share core + endpoint (redact toggle, failure 502,
  token gate).
alt-glitch pushed a commit to NousResearch/hermes-agent that referenced this pull request Jun 14, 2026
* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* fix(dashboard): explain WHY a chat WS connection was refused

The embedded-chat PTY WebSocket (/api/pty) collapsed every rejection
into a bare close code: 4401 for any auth failure, 4403 for three
unrelated failures (host mismatch, origin mismatch, peer-IP). Neither
the server log nor the browser said which gate fired or why, so a
"chat won't connect" report was undiagnosable without a repro.

Server (web_server.py):
- _ws_auth_reason / _ws_host_origin_reason / _ws_client_reason return a
  short machine-parseable reason; old bool wrappers kept for callers/tests.
- pty_ws splits the overloaded 4403 into 4401 (auth), 4403 (host/origin),
  4408 (peer not allowed), 4404 (chat disabled), and sends the reason on
  the close frame (clamped to the 123-byte RFC6455 limit).
- Each path logs one line: 'pty auth rejected reason=.. mode=.. cred=.. peer=..'
  / 'pty refused: <reason> ..'. Accepted path logs 'pty accepted peer=..
  mode=.. cred=..' so an audit shows HOW a peer authed, not just that it did.

tui_gateway/ws.py:
- 'ws send/write failed' now logs error_type=<ExcName> so an exception
  whose str() is empty (closed-transport sends) no longer logs 'error='.

web/src/pages/ChatPage.tsx:
- console.warn the real close code + server reason on every close.
- Map 4404/4408 to specific banners; 4401/4403 banners echo the server
  reason; [session ended] prints the close code.

E2E verified all five reject paths + accepted path produce matching
close code, wire reason, and server log line.
kossteg pushed a commit to kossteg/hermes-agent that referenced this pull request Jun 16, 2026
* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* feat(dashboard): add Debug Share to the System page

Surface `hermes debug share` in the dashboard. The System > Operations
section gets a dedicated card that uploads a redacted report + full logs
and returns the paste URLs as real, copyable links instead of a log tail.

- debug.py: factor a pure build_debug_share() returning structured
  {urls, failures, redacted, auto_delete_seconds}; run_debug_share now
  calls it (CLI output unchanged).
- web_server.py: POST /api/ops/debug-share runs the share core in a
  worker thread and returns the structured payload synchronously (the
  URLs are the whole point — not a backgrounded action).
- api.ts: runDebugShare() + DebugShareResponse.
- SystemPage.tsx: share card with a redaction toggle (on by default),
  per-link + copy-all buttons, and the 6h auto-delete countdown.
- tests: build_debug_share core + endpoint (redact toggle, failure 502,
  token gate).
kossteg pushed a commit to kossteg/hermes-agent that referenced this pull request Jun 16, 2026
…earch#38743)

* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* fix(dashboard): explain WHY a chat WS connection was refused

The embedded-chat PTY WebSocket (/api/pty) collapsed every rejection
into a bare close code: 4401 for any auth failure, 4403 for three
unrelated failures (host mismatch, origin mismatch, peer-IP). Neither
the server log nor the browser said which gate fired or why, so a
"chat won't connect" report was undiagnosable without a repro.

Server (web_server.py):
- _ws_auth_reason / _ws_host_origin_reason / _ws_client_reason return a
  short machine-parseable reason; old bool wrappers kept for callers/tests.
- pty_ws splits the overloaded 4403 into 4401 (auth), 4403 (host/origin),
  4408 (peer not allowed), 4404 (chat disabled), and sends the reason on
  the close frame (clamped to the 123-byte RFC6455 limit).
- Each path logs one line: 'pty auth rejected reason=.. mode=.. cred=.. peer=..'
  / 'pty refused: <reason> ..'. Accepted path logs 'pty accepted peer=..
  mode=.. cred=..' so an audit shows HOW a peer authed, not just that it did.

tui_gateway/ws.py:
- 'ws send/write failed' now logs error_type=<ExcName> so an exception
  whose str() is empty (closed-transport sends) no longer logs 'error='.

web/src/pages/ChatPage.tsx:
- console.warn the real close code + server reason on every close.
- Map 4404/4408 to specific banners; 4401/4403 banners echo the server
  reason; [session ended] prints the close code.

E2E verified all five reject paths + accepted path produce matching
close code, wire reason, and server log line.
T02200059 pushed a commit to T02200059/hermes-agent that referenced this pull request Jun 18, 2026
* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* feat(dashboard): add Debug Share to the System page

Surface `hermes debug share` in the dashboard. The System > Operations
section gets a dedicated card that uploads a redacted report + full logs
and returns the paste URLs as real, copyable links instead of a log tail.

- debug.py: factor a pure build_debug_share() returning structured
  {urls, failures, redacted, auto_delete_seconds}; run_debug_share now
  calls it (CLI output unchanged).
- web_server.py: POST /api/ops/debug-share runs the share core in a
  worker thread and returns the structured payload synchronously (the
  URLs are the whole point — not a backgrounded action).
- api.ts: runDebugShare() + DebugShareResponse.
- SystemPage.tsx: share card with a redaction toggle (on by default),
  per-link + copy-all buttons, and the 6h auto-delete countdown.
- tests: build_debug_share core + endpoint (redact toggle, failure 502,
  token gate).
T02200059 pushed a commit to T02200059/hermes-agent that referenced this pull request Jun 18, 2026
…earch#38743)

* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* fix(dashboard): explain WHY a chat WS connection was refused

The embedded-chat PTY WebSocket (/api/pty) collapsed every rejection
into a bare close code: 4401 for any auth failure, 4403 for three
unrelated failures (host mismatch, origin mismatch, peer-IP). Neither
the server log nor the browser said which gate fired or why, so a
"chat won't connect" report was undiagnosable without a repro.

Server (web_server.py):
- _ws_auth_reason / _ws_host_origin_reason / _ws_client_reason return a
  short machine-parseable reason; old bool wrappers kept for callers/tests.
- pty_ws splits the overloaded 4403 into 4401 (auth), 4403 (host/origin),
  4408 (peer not allowed), 4404 (chat disabled), and sends the reason on
  the close frame (clamped to the 123-byte RFC6455 limit).
- Each path logs one line: 'pty auth rejected reason=.. mode=.. cred=.. peer=..'
  / 'pty refused: <reason> ..'. Accepted path logs 'pty accepted peer=..
  mode=.. cred=..' so an audit shows HOW a peer authed, not just that it did.

tui_gateway/ws.py:
- 'ws send/write failed' now logs error_type=<ExcName> so an exception
  whose str() is empty (closed-transport sends) no longer logs 'error='.

web/src/pages/ChatPage.tsx:
- console.warn the real close code + server reason on every close.
- Map 4404/4408 to specific banners; 4401/4403 banners echo the server
  reason; [session ended] prints the close code.

E2E verified all five reject paths + accepted path produce matching
close code, wire reason, and server log line.
waefrebeorn pushed a commit to waefrebeorn/slermes that referenced this pull request Jul 2, 2026
* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* feat(dashboard): add Debug Share to the System page

Surface `hermes debug share` in the dashboard. The System > Operations
section gets a dedicated card that uploads a redacted report + full logs
and returns the paste URLs as real, copyable links instead of a log tail.

- debug.py: factor a pure build_debug_share() returning structured
  {urls, failures, redacted, auto_delete_seconds}; run_debug_share now
  calls it (CLI output unchanged).
- web_server.py: POST /api/ops/debug-share runs the share core in a
  worker thread and returns the structured payload synchronously (the
  URLs are the whole point — not a backgrounded action).
- api.ts: runDebugShare() + DebugShareResponse.
- SystemPage.tsx: share card with a redaction toggle (on by default),
  per-link + copy-all buttons, and the 6h auto-delete countdown.
- tests: build_debug_share core + endpoint (redact toggle, failure 502,
  token gate).
waefrebeorn pushed a commit to waefrebeorn/slermes that referenced this pull request Jul 2, 2026
…earch#38743)

* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* fix(dashboard): explain WHY a chat WS connection was refused

The embedded-chat PTY WebSocket (/api/pty) collapsed every rejection
into a bare close code: 4401 for any auth failure, 4403 for three
unrelated failures (host mismatch, origin mismatch, peer-IP). Neither
the server log nor the browser said which gate fired or why, so a
"chat won't connect" report was undiagnosable without a repro.

Server (web_server.py):
- _ws_auth_reason / _ws_host_origin_reason / _ws_client_reason return a
  short machine-parseable reason; old bool wrappers kept for callers/tests.
- pty_ws splits the overloaded 4403 into 4401 (auth), 4403 (host/origin),
  4408 (peer not allowed), 4404 (chat disabled), and sends the reason on
  the close frame (clamped to the 123-byte RFC6455 limit).
- Each path logs one line: 'pty auth rejected reason=.. mode=.. cred=.. peer=..'
  / 'pty refused: <reason> ..'. Accepted path logs 'pty accepted peer=..
  mode=.. cred=..' so an audit shows HOW a peer authed, not just that it did.

tui_gateway/ws.py:
- 'ws send/write failed' now logs error_type=<ExcName> so an exception
  whose str() is empty (closed-transport sends) no longer logs 'error='.

web/src/pages/ChatPage.tsx:
- console.warn the real close code + server reason on every close.
- Map 4404/4408 to specific banners; 4401/4403 banners echo the server
  reason; [session ended] prints the close code.

E2E verified all five reject paths + accepted path produce matching
close code, wire reason, and server log line.
software-0ficial pushed a commit to software-0ficial/gemini-cli that referenced this pull request Jul 9, 2026
…i#19919) (google-gemini#21541)

Signed-off-by: krishdef7 <gargkrish06@gmail.com>
Co-authored-by: Sikandar <ma5161310@gmail.com>
Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>
santhreal pushed a commit to santhreal/hermes-agent that referenced this pull request Jul 13, 2026
* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* feat(dashboard): add Debug Share to the System page

Surface `hermes debug share` in the dashboard. The System > Operations
section gets a dedicated card that uploads a redacted report + full logs
and returns the paste URLs as real, copyable links instead of a log tail.

- debug.py: factor a pure build_debug_share() returning structured
  {urls, failures, redacted, auto_delete_seconds}; run_debug_share now
  calls it (CLI output unchanged).
- web_server.py: POST /api/ops/debug-share runs the share core in a
  worker thread and returns the structured payload synchronously (the
  URLs are the whole point — not a backgrounded action).
- api.ts: runDebugShare() + DebugShareResponse.
- SystemPage.tsx: share card with a redaction toggle (on by default),
  per-link + copy-all buttons, and the 6h auto-delete countdown.
- tests: build_debug_share core + endpoint (redact toggle, failure 502,
  token gate).
santhreal pushed a commit to santhreal/hermes-agent that referenced this pull request Jul 13, 2026
…earch#38743)

* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* fix(dashboard): explain WHY a chat WS connection was refused

The embedded-chat PTY WebSocket (/api/pty) collapsed every rejection
into a bare close code: 4401 for any auth failure, 4403 for three
unrelated failures (host mismatch, origin mismatch, peer-IP). Neither
the server log nor the browser said which gate fired or why, so a
"chat won't connect" report was undiagnosable without a repro.

Server (web_server.py):
- _ws_auth_reason / _ws_host_origin_reason / _ws_client_reason return a
  short machine-parseable reason; old bool wrappers kept for callers/tests.
- pty_ws splits the overloaded 4403 into 4401 (auth), 4403 (host/origin),
  4408 (peer not allowed), 4404 (chat disabled), and sends the reason on
  the close frame (clamped to the 123-byte RFC6455 limit).
- Each path logs one line: 'pty auth rejected reason=.. mode=.. cred=.. peer=..'
  / 'pty refused: <reason> ..'. Accepted path logs 'pty accepted peer=..
  mode=.. cred=..' so an audit shows HOW a peer authed, not just that it did.

tui_gateway/ws.py:
- 'ws send/write failed' now logs error_type=<ExcName> so an exception
  whose str() is empty (closed-transport sends) no longer logs 'error='.

web/src/pages/ChatPage.tsx:
- console.warn the real close code + server reason on every close.
- Map 4404/4408 to specific banners; 4401/4403 banners echo the server
  reason; [session ended] prints the close code.

E2E verified all five reject paths + accepted path produce matching
close code, wire reason, and server log line.
donbowman pushed a commit to donbowman/hermes-agent that referenced this pull request Jul 13, 2026
* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* feat(dashboard): add Debug Share to the System page

Surface `hermes debug share` in the dashboard. The System > Operations
section gets a dedicated card that uploads a redacted report + full logs
and returns the paste URLs as real, copyable links instead of a log tail.

- debug.py: factor a pure build_debug_share() returning structured
  {urls, failures, redacted, auto_delete_seconds}; run_debug_share now
  calls it (CLI output unchanged).
- web_server.py: POST /api/ops/debug-share runs the share core in a
  worker thread and returns the structured payload synchronously (the
  URLs are the whole point — not a backgrounded action).
- api.ts: runDebugShare() + DebugShareResponse.
- SystemPage.tsx: share card with a redaction toggle (on by default),
  per-link + copy-all buttons, and the 6h auto-delete countdown.
- tests: build_debug_share core + endpoint (redact toggle, failure 502,
  token gate).
donbowman pushed a commit to donbowman/hermes-agent that referenced this pull request Jul 13, 2026
…earch#38743)

* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* fix(dashboard): explain WHY a chat WS connection was refused

The embedded-chat PTY WebSocket (/api/pty) collapsed every rejection
into a bare close code: 4401 for any auth failure, 4403 for three
unrelated failures (host mismatch, origin mismatch, peer-IP). Neither
the server log nor the browser said which gate fired or why, so a
"chat won't connect" report was undiagnosable without a repro.

Server (web_server.py):
- _ws_auth_reason / _ws_host_origin_reason / _ws_client_reason return a
  short machine-parseable reason; old bool wrappers kept for callers/tests.
- pty_ws splits the overloaded 4403 into 4401 (auth), 4403 (host/origin),
  4408 (peer not allowed), 4404 (chat disabled), and sends the reason on
  the close frame (clamped to the 123-byte RFC6455 limit).
- Each path logs one line: 'pty auth rejected reason=.. mode=.. cred=.. peer=..'
  / 'pty refused: <reason> ..'. Accepted path logs 'pty accepted peer=..
  mode=.. cred=..' so an audit shows HOW a peer authed, not just that it did.

tui_gateway/ws.py:
- 'ws send/write failed' now logs error_type=<ExcName> so an exception
  whose str() is empty (closed-transport sends) no longer logs 'error='.

web/src/pages/ChatPage.tsx:
- console.warn the real close code + server reason on every close.
- Map 4404/4408 to specific banners; 4401/4403 banners echo the server
  reason; [session ended] prints the close code.

E2E verified all five reject paths + accepted path produce matching
close code, wire reason, and server log line.
kulikman pushed a commit to kulikman/hermes-agent_fork that referenced this pull request Jul 16, 2026
* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* feat(dashboard): add Debug Share to the System page

Surface `hermes debug share` in the dashboard. The System > Operations
section gets a dedicated card that uploads a redacted report + full logs
and returns the paste URLs as real, copyable links instead of a log tail.

- debug.py: factor a pure build_debug_share() returning structured
  {urls, failures, redacted, auto_delete_seconds}; run_debug_share now
  calls it (CLI output unchanged).
- web_server.py: POST /api/ops/debug-share runs the share core in a
  worker thread and returns the structured payload synchronously (the
  URLs are the whole point — not a backgrounded action).
- api.ts: runDebugShare() + DebugShareResponse.
- SystemPage.tsx: share card with a redaction toggle (on by default),
  per-link + copy-all buttons, and the 6h auto-delete countdown.
- tests: build_debug_share core + endpoint (redact toggle, failure 502,
  token gate).
kulikman pushed a commit to kulikman/hermes-agent_fork that referenced this pull request Jul 16, 2026
…earch#38743)

* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* fix(dashboard): explain WHY a chat WS connection was refused

The embedded-chat PTY WebSocket (/api/pty) collapsed every rejection
into a bare close code: 4401 for any auth failure, 4403 for three
unrelated failures (host mismatch, origin mismatch, peer-IP). Neither
the server log nor the browser said which gate fired or why, so a
"chat won't connect" report was undiagnosable without a repro.

Server (web_server.py):
- _ws_auth_reason / _ws_host_origin_reason / _ws_client_reason return a
  short machine-parseable reason; old bool wrappers kept for callers/tests.
- pty_ws splits the overloaded 4403 into 4401 (auth), 4403 (host/origin),
  4408 (peer not allowed), 4404 (chat disabled), and sends the reason on
  the close frame (clamped to the 123-byte RFC6455 limit).
- Each path logs one line: 'pty auth rejected reason=.. mode=.. cred=.. peer=..'
  / 'pty refused: <reason> ..'. Accepted path logs 'pty accepted peer=..
  mode=.. cred=..' so an audit shows HOW a peer authed, not just that it did.

tui_gateway/ws.py:
- 'ws send/write failed' now logs error_type=<ExcName> so an exception
  whose str() is empty (closed-transport sends) no longer logs 'error='.

web/src/pages/ChatPage.tsx:
- console.warn the real close code + server reason on every close.
- Map 4404/4408 to specific banners; 4401/4403 banners echo the server
  reason; [session ended] prints the close code.

E2E verified all five reject paths + accepted path produce matching
close code, wire reason, and server log line.
Gravezzz pushed a commit to Gravezzz/hermes-agent that referenced this pull request Jul 21, 2026
* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* feat(dashboard): add Debug Share to the System page

Surface `hermes debug share` in the dashboard. The System > Operations
section gets a dedicated card that uploads a redacted report + full logs
and returns the paste URLs as real, copyable links instead of a log tail.

- debug.py: factor a pure build_debug_share() returning structured
  {urls, failures, redacted, auto_delete_seconds}; run_debug_share now
  calls it (CLI output unchanged).
- web_server.py: POST /api/ops/debug-share runs the share core in a
  worker thread and returns the structured payload synchronously (the
  URLs are the whole point — not a backgrounded action).
- api.ts: runDebugShare() + DebugShareResponse.
- SystemPage.tsx: share card with a redaction toggle (on by default),
  per-link + copy-all buttons, and the 6h auto-delete countdown.
- tests: build_debug_share core + endpoint (redact toggle, failure 502,
  token gate).
Gravezzz pushed a commit to Gravezzz/hermes-agent that referenced this pull request Jul 21, 2026
…earch#38743)

* Port from google-gemini/gemini-cli#21541: back up corrupted config.yaml

When config.yaml fails to parse, load_config() silently falls back to
DEFAULT_CONFIG and leaves the broken file on disk. If the user then re-runs
the setup wizard or hermes config set (both rewrite config.yaml), their
broken-but-recoverable overrides are lost for good.

Adapts the policy-file recovery from gemini-cli#21541: on the first parse
warning for a given broken file, snapshot it to config.yaml.corrupt.<ts>.bak
(best-effort, symlink-guarded, size-deduped) and tell the user where it
landed. Unlike Gemini's version we deliberately do NOT reset config.yaml to a
clean state — hermes never silently mutates user config, and leaving it means
a hand-fixed file is re-read on the next load.

Tests: 3 new cases (backup created + content preserved + original untouched;
same-size backup dedup; symlink not copied). E2E verified with isolated
HERMES_HOME and a real tab-indented broken config.

* fix(dashboard): explain WHY a chat WS connection was refused

The embedded-chat PTY WebSocket (/api/pty) collapsed every rejection
into a bare close code: 4401 for any auth failure, 4403 for three
unrelated failures (host mismatch, origin mismatch, peer-IP). Neither
the server log nor the browser said which gate fired or why, so a
"chat won't connect" report was undiagnosable without a repro.

Server (web_server.py):
- _ws_auth_reason / _ws_host_origin_reason / _ws_client_reason return a
  short machine-parseable reason; old bool wrappers kept for callers/tests.
- pty_ws splits the overloaded 4403 into 4401 (auth), 4403 (host/origin),
  4408 (peer not allowed), 4404 (chat disabled), and sends the reason on
  the close frame (clamped to the 123-byte RFC6455 limit).
- Each path logs one line: 'pty auth rejected reason=.. mode=.. cred=.. peer=..'
  / 'pty refused: <reason> ..'. Accepted path logs 'pty accepted peer=..
  mode=.. cred=..' so an audit shows HOW a peer authed, not just that it did.

tui_gateway/ws.py:
- 'ws send/write failed' now logs error_type=<ExcName> so an exception
  whose str() is empty (closed-transport sends) no longer logs 'error='.

web/src/pages/ChatPage.tsx:
- console.warn the real close code + server reason on every close.
- Map 4404/4408 to specific banners; 4401/4403 banners echo the server
  reason; [session ended] prints the close code.

E2E verified all five reject paths + accepted path produce matching
close code, wire reason, and server log line.
Cleanskiier27 added a commit to Cleanskiier27/gemini-cli that referenced this pull request Jul 25, 2026
* fix(core): Fix hysteresis in async context management pipelines. (google-gemini#26452)

* Tighten private Auto Memory patch allowlist (google-gemini#26535)

* fix(cli): hide read-only settings scopes (google-gemini#26249)

* fix(ci): preserve executable bit for mac binaries (google-gemini#26600)

* fix(cli): improve mcp list UX in untrusted folders (google-gemini#26457)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* fix(core): prevent silent hang during OAuth auth on headless Linux (google-gemini#26571)

Co-authored-by: Jack Wotherspoon <jackwoth@google.com>

* Changelog for v0.42.0-preview.0 (google-gemini#26537)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* ci: fix Argument list too long in triage workflows (google-gemini#26603)

* refactor(cli): migrate core tools to native ToolDisplay property and fix UI rendering (google-gemini#25186)

* don't wrap args unnecessarily (google-gemini#26599)

* fix(core): preserve system PATH in Git environment to fix ENOENT (google-gemini#25034) (google-gemini#26587)

* fix(routing): fix resolveClassifierModel argument mismatch in ApprovalModeStrategy (google-gemini#26658)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* docs: add vi mode shortcuts and clarify MCP/custom sandbox setup (google-gemini#23853)

Co-authored-by: Sam Roberts <158088236+g-samroberts@users.noreply.github.com>

* fix(ux): fixed issue with transcribed text not showing after releasing space (google-gemini#26609)

* ci: fix json parsing in scheduled triage workflow (google-gemini#26656)

* fix(cli): hide /memory add subcommand when memoryV2 is enabled (google-gemini#26605)

* fix: prevent false command conflicts when launching from home directory (google-gemini#23069)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* fix(core): cache model routing decision in LocalAgentExecutor (google-gemini#26548)

* Changelog for v0.42.0-preview.2 (google-gemini#26597)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>
Co-authored-by: Sam Roberts <158088236+g-samroberts@users.noreply.github.com>

* skip broken test (google-gemini#26705)

* feat: export session to file and import via flag (google-gemini#26514)

* Feat: Add Machine Hostname to CLI interface (google-gemini#25637)

Signed-off-by: M-DEV-1 <mahadevankizhakkedathu@gmail.com>
Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* docs(extensions): refactor releasing guide and add update mechanisms (google-gemini#26595)

* fix(ci): fix maintainer identification in lifecycle manager (google-gemini#26706)

* fix(ui): added quotes around session id in resume tip (google-gemini#26669)

* Changelog for v0.41.0 (google-gemini#26670)

Co-authored-by: g-samroberts <158088236+g-samroberts@users.noreply.github.com>

* refactor(core): agent session protocol changes (google-gemini#26661)

* fix(context): implement loose boundary policy for gc backstop. (google-gemini#26594)

* fix(core): throw explicit error on dropped tool responses (google-gemini#26668)

* fix: resolve "function response turn must come immediately after function call" error (google-gemini#26691)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* fix(core): resolve parallel tool call streaming ID collision (google-gemini#26646)

* feat(core): add LocalSubagentProtocol behind AgentProtocol (google-gemini#25302)

* fix(cli): remove noisy theme registration logs from terminal (google-gemini#25858)

Co-authored-by: Jack Wotherspoon <jackwoth@google.com>

* ci: implement codebase-aware effort level triage (google-gemini#26666)

* feat(acp/core): prefix tool call IDs with tool names to support tool rendering in ACP compliant IDEs. (google-gemini#26676)

* fix(mcp): treat GET 404 as 405 in StreamableHTTPClientTransport (google-gemini#24847)

Co-authored-by: Coco Sheng <cocosheng@google.com>
Co-authored-by: Spencer <spencertang@google.com>
Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* feat(core): add RemoteSubagentProtocol behind AgentProtocol (google-gemini#25303)

* feat(context): Improvements to the snapshotter. (google-gemini#26655)

* fix(context): Change snapshotter model config. (google-gemini#26745)

* fix(cli): allow installing extensions from ssh repo (google-gemini#26274)

Signed-off-by: Daniel Finimundi <danielrf@motorola.com>
Co-authored-by: Dev Randalpura <devrandalpura@google.com>

* fix(cli): prevent duplicate SessionStart systemMessage render (google-gemini#25827)

Co-authored-by: Jacob Richman <jacob314@gmail.com>

* fix(cli/acp): prevent infinite thought loop in ACP mode by disablig nextSpeakerCheck (google-gemini#26874)

* fix(cli): use static tool name in confirmation prompt to avoid parsing errors (google-gemini#26866)

* fix(routing): Refactor tool turn handling for the conversation history in NumericalClassifierStrategy to prevent 400 Bad Request (google-gemini#26761)

* fix(core): handle malformed projects.json in ProjectRegistry (google-gemini#26885)

* fix(ui): added a gutter width to the input prompt width calculation (google-gemini#26882)

* fix: prevent EISDIR crash when customIgnoreFilePaths contains directories (google-gemini#19868) (google-gemini#19898)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* revert 6b9b778 (google-gemini#26893)

* Fix/vscode run current file ts (google-gemini#22894)

Co-authored-by: Spencer <spencertang@google.com>

* Allow Enter to select session while in search mode in /resume (google-gemini#21523)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* fix(core): ignore .pak and .rpa game archive formats by default (google-gemini#26884)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* fix(cli): enable adk non-interactive session (google-gemini#26895)

* fix(cli): restore resume for legacy sessions (google-gemini#26577)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* fix: respect explicit model selection after Flash quota exhaustion (google-gemini#26759) (google-gemini#26872)

* feat(context): Introduce adaptive token calculator to more accurately calculate content sizes. (google-gemini#26888)

* chore: update checkout action configuration in workflows (google-gemini#26897)

* fix (telemetry): inject quota_project_id to prevent fallback to default oauth client (google-gemini#26698)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* Exclude extension context from skill extraction agent (google-gemini#26879)

* Enable NumericalRouter when using dynamic model configs (google-gemini#26929)

* ci: actively triage missing priority labels and intelligently clean up conflicting labels (google-gemini#26865)

* refactor(core): introduce SubagentState enum for progress (google-gemini#26934)

* fix(ci): replace brittle --no-tag with explicit staging-tmp tag (google-gemini#26940)

* Incremental refactor repo agent towards skills-based composition (google-gemini#26717)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* fix(ui): fixed line wrap padding for selection lists (google-gemini#26944)

* fix(core): update read_file schema for v1 compatibility (google-gemini#22183) (google-gemini#26922)

* fix(ci): configure git remote with token for authentication (google-gemini#26949)

* chore(release): bump version to 0.44.0-nightly.20260512.g022e8baef (google-gemini#26957)

* Changelog for v0.42.0 (google-gemini#26958)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* Refactor: Eliminate `no-unsafe-return` suppressions via strict type validation (google-gemini#20668)

Signed-off-by: M-DEV-1 <mahadevankizhakkedathu@gmail.com>
Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* Changelog for v0.43.0-preview.0 (google-gemini#26959)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* feat(core): change agent registration to first-wins and prioritize project (google-gemini#26953)

* feat(cli): merge Auto modes into a single Auto mode (google-gemini#26714)

* fix(core): preserve OAuth refresh tokens during rotation and retrieval (google-gemini#26924)

* fix(cli): allow keychain auth for --list-sessions and non-interactive mode (google-gemini#26921)

* fix(core): handle EISDIR on virtual drives in memory discovery (google-gemini#26985)

* fix(cli): auto-approve shell redirections in AUTO_EDIT mode (google-gemini#27003)

* ci: suppress bot comments during standard triage maintenance (google-gemini#27006)

* fix(core): isolate subagent thread context (google-gemini#26449)

* fix(core): refresh MCP OAuth token usage after re-auth (google-gemini#26312)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* fix(ui): clamped table column widths (google-gemini#26991)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* chore: add execution permission to scripts/review.sh (google-gemini#27009)

* fix(core): made context files append instead of replace (google-gemini#26950)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* fix: add system PATH fallback for ripgrep resolution (google-gemini#26777) (google-gemini#26868)

* chore: clean up launched memory features (google-gemini#26941)

Co-authored-by: Jenna Inouye <jinouye@google.com>

* fix(core): throttle shell text output and bound live UI buffer (google-gemini#26955)

* fix(cli): don't crash when an @-mention captures a non-path blob (google-gemini#25980)

* fix(core): ensure stable fallback for restricted preview models (google-gemini#26999)

* feat(core): expose RAG snippets to local log file for debugging (google-gemini#27016)

* fix(acp/auth): prevent conflicting credentials on enterprise gateways and support optional API keys natively (google-gemini#27021)

* fix(core): respect NO_PROXY for network-based MCP servers (google-gemini#27012)

* fix(cli): resolve permission denied in sandbox on NixOS and other distros (google-gemini#27004)

* fix(ui): preserve new line at the end of edit window (google-gemini#27057)

* fix(core): ensure Vertex AI sets hasAccessToPreviewModels and remove aggressive 404 fallback revocation (google-gemini#27067)

* fix(core): ensure stable admin settings comparison across IPC to prevent restart loop (google-gemini#27066)

* fix(deps): update vulnerable dependencies (google-gemini#27062)

* fix(core): resolve EISDIR errors during file processing (google-gemini#21527) (google-gemini#27041)

* docs(extensions): clarify env var sanitization policy for MCP and ext… (google-gemini#22854)

Co-authored-by: Jack Wotherspoon <jackwoth@google.com>
Co-authored-by: Jenna Inouye <jinouye@google.com>

* fix(ui): add ENAMETOOLONG and ENOTDIR to exceptions for file parsing errors (google-gemini#27069)

* fix(cli): explicitly clear entrypoint when spawning sandbox container (google-gemini#27059)

* docs: update sandbox image command (google-gemini#26774)

* fix(core): externalize https-proxy-agent to fix proxy support (google-gemini#26361)

* security: update dependencies to fix critical and high vulnerabilities (google-gemini#27077)

* Fix/web fetch ctrl c abort (google-gemini#24320)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* fix(core): add aliases and thinking config for gemini-3.1 models (google-gemini#27007)

* fix(core): use hasAccessToPreview for auto model resolution and fix disappearing models (google-gemini#27112)

* feat(core): add adk.agentSessionSubagentEnabled flag (google-gemini#26947)

* fix(core): enforce compile-time exhaustiveness in content-utils (google-gemini#27207)

* feat(skills): add agent-tui and tui-tester skills (google-gemini#27121)

* fix(context): Fix snapshot recovery across sessions. (google-gemini#26939)

* fix(core): add unit tests for stableStringify (google-gemini#27212)

* fix(core): prefer pwsh.exe over Windows PowerShell 5.1 (google-gemini#25859) (google-gemini#25900)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* feat(core): add LocalSessionInvocation (google-gemini#26665)

* refactor: decouple auto model description and configuration from releaseChannel (google-gemini#27227)

Co-authored-by: David Pierce <davidapierce@google.com>

* fix(core): prevent isBinary false-positive on Windows PTY streams (google-gemini#26565)

* fix(cli): Prevent unmapped keys in Vim Normal mode from inserting text into prompt Input. (google-gemini#25139)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* fix(a2a-server): Implement default policy loading for parity with CLI (google-gemini#27073)

* feat(core): add RemoteSessionInvocation (google-gemini#26937)

* fix: allow configured MCP servers in non-interactive mode (google-gemini#27215)

* fix(core): add exception handling to migrateFromFileStorage (google-gemini#27229)

* fix(cli): bundle ink worker-entry.js (google-gemini#27249)

* feat(core): wire AgentSession invocations into agent-tool (google-gemini#26948)

* fix(core): prevent path traversal in custome command file injection (google-gemini#27234)

* fix(core): respect NO_PROXY in global fetch dispatcher (google-gemini#27216)

* fix(core): correctly handle nullable array types in MCP tools (google-gemini#27228)

* Proposal: deterministic encoding for child-process I/O (google-gemini#27247)

* fix(cli): preserve proxy-agent named exports in ESM bundle (google-gemini#27145)

* feat(cli): add Sublime Text and Emacs Client editors, improve error messages and documentation (google-gemini#21090)

Co-authored-by: Ananth Kini <ananthkini1@gmail.com>

* Changelog for v0.43.0-preview.1 (google-gemini#27297)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* fix(devtools): bundle devtools package to avoid resolution errors (google-gemini#27250)

* fix(cli): integrate PolicyEngine into ACP session to prevent deadlocks (google-gemini#23507) (google-gemini#27252)

* fix: robust ripgrep path resolution and 1p hermetic execution support (google-gemini#27253)

* refactor: decouple stored session deletion from ChatRecordingService (google-gemini#22920) (google-gemini#27039)

* fix(core): improve Alpine shell compatibility (google-gemini#26770)

* fix(core): generalize MCP compliance fix for tool results (google-gemini#27045)

* fix(scripts): scrub CI env vars in dev to keep interactive mode (google-gemini#27159)

* fix(core): Added date field for the GCal MCP (google-gemini#27251)

* fix(core): centralize path validation to prevent crashes from malformed prompts (google-gemini#27211)

* fix(core): prevent SIGHUP kills in PTY environments (WSL2/Kitty/Alacritty) (google-gemini#27267)

* fix(core): dynamic fallback routing for exhausted quota models (google-gemini#27315)

* Auto detect pnpm global installation path for macOS and Windows (google-gemini#22748)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Coco Sheng <cocosheng@google.com>

* fix(windows): resolve interactive shell arrow-key navigation on Windows (google-gemini#23505)

* ci: robust stale issue lifecycle and consolidated triage labels (google-gemini#27015)

* fix(context): Ensure last message is processed. (google-gemini#27232)

* chore/release: bump version to 0.44.0-nightly.20260521.g57c42a5c4 (google-gemini#27324)

* fix(ui): added volta to auto update check (google-gemini#27353)

* perf: optimize issue triage and lifecycle management (google-gemini#27346)

* chore(release): bump version to 0.45.0-nightly.20260521.g854f811be (google-gemini#27362)

* fix(cli): prevent Termux relaunch and resize remount loops (google-gemini#27110)

Co-authored-by: Spencer <spencertang@google.com>

* Feat/a2a expose usage metadata (google-gemini#27288)

* feat(context): Complete simplification work. (google-gemini#27345)

* fix(core): force update_topic tool to execute sequentially (google-gemini#27357)

* Changelog for v0.44.0-preview.0 (google-gemini#27360)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* Changelog for v0.43.0 (google-gemini#27361)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* Revert "fix(core): prevent SIGHUP kills in PTY environments" (google-gemini#27401)

* fix(cli): filter internal session context from history during resumption (google-gemini#27391)

* Update default auto routing (google-gemini#27071)

* fix(core): bypass routing classifiers to prevent orphaned function response errors (google-gemini#27389)

* fix(core): suppress PTY resize EBADF errors (google-gemini#27461)

* fix(core): prevent blacklist bypass in mcp list (google-gemini#27377)

Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com>

* fix(cli): ignore unmapped vim normal keys (google-gemini#27102)

* fix(core): harden PTY resize against native crashes (google-gemini#27496)

* Changelog for v0.45.0-preview.0 (google-gemini#27495)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* Changelog for v0.44.0 (google-gemini#27569)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* fix(cli): prevent spam loop when preferredEditor is invalid (google-gemini#25324)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* Adding quote (google-gemini#27571)

* Transition to flash GA model when experiment flag is present. (google-gemini#27570)

* chore(ci): add optimized PR size labeler and batch workflows (google-gemini#27616)

* fix(ci): use pull_request_target trigger to grant write access on fork PRs (google-gemini#27637)

* chore(release): bump version to 0.47.0-nightly.20260602.gcfcecebe8 (google-gemini#27644)

* Changelog for v0.46.0-preview.0 (google-gemini#27641)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* Respect backend definitions for 3.5 flash and Update auto mode to use 3.5 flash when the flag is enabled. (google-gemini#27645)

* fix(policy): add EBUSY fallback and TOML parse recovery (google-gemini#19919) (google-gemini#21541)

Signed-off-by: krishdef7 <gargkrish06@gmail.com>
Co-authored-by: Sikandar <ma5161310@gmail.com>
Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>

* Changelog for v0.45.0 (google-gemini#27642)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* update the max amount of times the Antigravity transition banner can be displayed. (google-gemini#27676)

* chore: remove experimental text from browser agent docs (google-gemini#27746)

* fix(core): implement atomic update in MCP tool discovery (google-gemini#27619)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com>

* Vertex ai model mapping fix (google-gemini#27749)

* Add documentation and migration commands for Antigravity CLI (google-gemini#27765)

Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com>

* Avoid persisting empty resume sessions (google-gemini#27770)

* chore(release): bump version to 0.48.0-nightly.20260609.g3a13b8eeb (google-gemini#27779)

* ci(dependabot): enable cooldown period for npm packages (google-gemini#27743)

* refactor(core): standardize tool output formatting (google-gemini#27772)

* ci: update workflow logging and policy configurations (google-gemini#27853)

* fix(core): Ensure zero-quota limits fail fast to prevent retry loop hang (google-gemini#27698)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* fix(core): handle multi-line escaped quotes in stripShellWrapper (google-gemini#27467)

Co-authored-by: luisfelipe-alt <luisfelipe@google.com>

* fix(cli): prevent path traversal vulnerabilities during skill install… (google-gemini#27767)

* Fix/pending tools and trust overrides (google-gemini#27854)

* ci: use internal environment for scheduled nightly releases (google-gemini#27865) (google-gemini#27939)

* feat(core): Support GDC air-gapped Service Identity after auth library update (google-gemini#27956)

* fix(cli): handle tmux false positive background detection (google-gemini#27572)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com>

* Add static eval source analyzer (google-gemini#27631)

* fix(config): migrate coreTools setting to tools.core (google-gemini#27947)

* fix(core-tools): resolve defensive path resolution for at-reference files (google-gemini#27943)

* Revert "fix(core-tools): resolve defensive path resolution for at-reference files" (google-gemini#27992)

* chore(release): bump version to 0.49.0-nightly.20260617.g4d3dcdce1 (google-gemini#28003)

* Changelog for v0.48.0-preview.0 (google-gemini#27999)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* fix(ci): provide fallbacks for package variables in nightly release (google-gemini#28016)

* chore(deps): pin dependencies and enforce 14-day update cooldown (google-gemini#27948)

* fix(ci): append trailing slash to registry url in npmrc (google-gemini#28038)

* feat: add eval:inventory CLI command and reporting logic (google-gemini#28009)

* fix: resolve workspace publish failures and scheduler event loop starvation (google-gemini#28063)

* fix(ci): use wombat dressing room fallback in nightly release to prevent ENEEDAUTH (google-gemini#28104)

* Add JSON output for eval inventory (google-gemini#28058)

* fix/verify release npm ci ignore scripts (google-gemini#28116)

* fix(ci): prevent workspace binary shadowing in release verification (google-gemini#28132)

* Feat/tool registry discovery (google-gemini#28113)

* fix(ci): prevent bad NPM releases and promote job crashes (google-gemini#28147)

* Changelog for v0.50.0-preview.1 (google-gemini#28150)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* chore(release): bump version to 0.51.0-nightly.20260625.g3fbf93e26 (google-gemini#28151)

* Fix no_proxy test (google-gemini#28131)

Co-authored-by: Jerry Lin <jerrysf@google.com>

* Vertex base url update (google-gemini#28145)

* fix(security): enforce case-insensitive sensitive path blocklist and vscode hitl (google-gemini#27966)

Co-authored-by: David Pierce <davidapierce@google.com>

* fix(core-tools): resolve defensive path resolution for at-reference files and fix macOS tests (google-gemini#28053)

Co-authored-by: David Pierce <davidapierce@google.com>

* feat(caretaker): implement Cloud Run webhook ingestion service (google-gemini#28015)

Co-authored-by: Christian Gunderman <gundermanc@google.com>

* fix(core): resolve symbolic link directory escape in memory import processor (google-gemini#28233)

* feat(caretaker): egress cloud run service skeleton (google-gemini#28167)

* fix(sandbox): make ~/.gitconfig read-only in the macOS sandbox (google-gemini#28221)

Co-authored-by: David Pierce <davidapierce@google.com>

* fix(core): preserve escape sequences in string literals for modern models (google-gemini#28299)

Co-authored-by: David Pierce <davidapierce@google.com>

* fix(core): strip thoughts from scrubbed history turns and resolve thought leakage (google-gemini#27971)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com>
Co-authored-by: David Pierce <davidapierce@google.com>

* Refactor: exclude transient CI configuration files from workspace context (google-gemini#28216)

* feat(caretaker): add triage worker core foundational modules (google-gemini#28163)

* feat(caretaker-egress): implement octokit github action handler for egress service (google-gemini#28303)

* chore(release): bump version to 0.52.0-nightly.20260707.g27a3da3e8 (google-gemini#28323)

* Changelog for v0.51.0-preview.0 (google-gemini#28320)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* Changelog for v0.50.0 (google-gemini#28322)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>
Co-authored-by: David Pierce <davidapierce@google.com>

* fix(core-tools): bypass LLM correction for JSON and IPYNB files in write_file and replace (google-gemini#28223)

Co-authored-by: David Pierce <davidapierce@google.com>

* fix(core): use unambiguous previous intent label in fallback summary (google-gemini#28343)

* feat(caretaker-triage): implement main worker execution loop and egress action publisher (google-gemini#28306)

* fix(privacy): show a clear message when the account has no Code Assist tier (google-gemini#28304)

* fix(core): enrich shared project quota limit errors with setup hint (google-gemini#28391)

* fix(a2a-server): ensure task cancellation aborts execution loop (google-gemini#28316)

* fix(core): simplify plan mode write policy to support relative paths (google-gemini#28398)

* feat(core): Bump node google-auth-library version to 10.9.0 (google-gemini#28385)

Co-authored-by: Jerry Lin <jerrysf@google.com>

* chore/release: bump version to 0.52.0-nightly.20260715.gfa975395b (google-gemini#28402)

* fix(core,a2a): group cancelled tool responses and coalesce consecutive roles to prevent 400 Bad Request (google-gemini#28407)

* feat(caretaker-triage): implement LLM triage orchestrator and container build (google-gemini#28345)

* refactor(cli): align macOS permissive Seatbelt profiles with deny-default model (google-gemini#28424)

* fix(core): mitigate infinite ReAct loops and prompt injection loops (google-gemini#28429)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* fix(a2a-server): enforce workspace trust and task isolation to prevent RCE (google-gemini#28470)

* fix(core): sequentially verify cached credentials and restore GOOGLE_APPLICATION_CREDENTIALS fallback (google-gemini#28472)

Co-authored-by: David Pierce <davidapierce@google.com>

* feat(evals): add eval coverage report command (google-gemini#28169)

* Changelog for v0.53.0-preview.0 (google-gemini#28507)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* Changelog for v0.52.0 (google-gemini#28508)

Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>

* chore(release): bump version to 0.54.0-nightly.20260722.gf743ab579 (google-gemini#28510)

* fix(caretaker): sanitize and wrap issue title in untrusted_context (google-gemini#28352)

* chore(caretaker): update vitest to v3.2.4 and add package-lock.json files (google-gemini#28409)

* fix(core): rotate session ID on model fallback to prevent stateful API errors (google-gemini#28469)

* feat(caretaker-triage): post comment before auto-closing issues (google-gemini#28411)

* fix(core): enforce HTTPS for GoogleCredentialsAuthProvider to prevent cleartext leakage (google-gemini#28517)

* fix(core): filter out thought parts from getHistoryTurns when context management is disabled (google-gemini#28509)

---------

Signed-off-by: M-DEV-1 <mahadevankizhakkedathu@gmail.com>
Signed-off-by: Daniel Finimundi <danielrf@motorola.com>
Signed-off-by: krishdef7 <gargkrish06@gmail.com>
Co-authored-by: joshualitt <joshualitt@google.com>
Co-authored-by: Sandy Tao <sandytao520@icloud.com>
Co-authored-by: Christian Van <113378434+cvan20191@users.noreply.github.com>
Co-authored-by: ruomeng <ruomeng@google.com>
Co-authored-by: Adib234 <30782825+Adib234@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Rhys Sullivan <39114868+RhysSullivan@users.noreply.github.com>
Co-authored-by: Jack Wotherspoon <jackwoth@google.com>
Co-authored-by: gemini-cli-robot <gemini-cli-robot@google.com>
Co-authored-by: gemini-cli-robot <224641728+gemini-cli-robot@users.noreply.github.com>
Co-authored-by: Coco Sheng <cocosheng@google.com>
Co-authored-by: Michael Bleigh <mbleigh@mbleigh.com>
Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>
Co-authored-by: Daniel Weis <danielweis@users.noreply.github.com>
Co-authored-by: Christopher Thomas <cobekgn@gmail.com>
Co-authored-by: Sam Roberts <158088236+g-samroberts@users.noreply.github.com>
Co-authored-by: Dev Randalpura <devrandalpura@google.com>
Co-authored-by: Br1an <932039080@qq.com>
Co-authored-by: AK <akhilbussiness@gmail.com>
Co-authored-by: mahadevan <135952571+M-DEV-1@users.noreply.github.com>
Co-authored-by: Christian Gunderman <gundermanc@google.com>
Co-authored-by: Adam Weidman <65992621+adamfweidman@users.noreply.github.com>
Co-authored-by: Aishanee Shah <aishaneeshah@google.com>
Co-authored-by: JAYADITYA <96861162+JayadityaGit@users.noreply.github.com>
Co-authored-by: Sri Pasumarthi <111310667+sripasg@users.noreply.github.com>
Co-authored-by: krishdef7 <157892833+krishdef7@users.noreply.github.com>
Co-authored-by: Spencer <spencertang@google.com>
Co-authored-by: Daniel Finimundi <daniel@finimundi.com>
Co-authored-by: Aryan Singh <146713101+dimssu@users.noreply.github.com>
Co-authored-by: Jacob Richman <jacob314@gmail.com>
Co-authored-by: Suhaan Raqeeb Khavas <suhaanrk73@gmail.com>
Co-authored-by: Neil Nair <65729206+Neil-N4@users.noreply.github.com>
Co-authored-by: Franco Pieri <geo22therm@gmail.com>
Co-authored-by: Eswar809 <deevieswar44@gmail.com>
Co-authored-by: Kuroda Kayn <kurodakayn@outlook.com>
Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com>
Co-authored-by: Yulong Wu <50110323+TNTCompany@users.noreply.github.com>
Co-authored-by: kevinjwang1 <kevinjwang@google.com>
Co-authored-by: David Pierce <davidapierce@google.com>
Co-authored-by: Sahil Kirad <167863755+sahilkirad@users.noreply.github.com>
Co-authored-by: Jenna Inouye <jinouye@google.com>
Co-authored-by: EMERSON BUSSON <93008583+emersonbusson@users.noreply.github.com>
Co-authored-by: ifitisit <90478348+ifitisit@users.noreply.github.com>
Co-authored-by: PROTHAM <155388736+ProthamD@users.noreply.github.com>
Co-authored-by: 7. Sun <jhao.sun@gmail.com>
Co-authored-by: sotokisehiro <101786086+sotokisehiro@users.noreply.github.com>
Co-authored-by: Anish Sabharwal <anishs1207@gmail.com>
Co-authored-by: kaluchi <kaluchi@gmail.com>
Co-authored-by: Tirth Naik <naik.ti@northeastern.edu>
Co-authored-by: Rajesh patel <145205731+Rajeshpatel07@users.noreply.github.com>
Co-authored-by: Keith Schaab <keith.schaab@gmail.com>
Co-authored-by: Ramón Medrano Llamas <45878745+rmedranollamas@users.noreply.github.com>
Co-authored-by: Om Patel <ompatel.aiml@gmail.com>
Co-authored-by: ashishch432 <55024632+ashishch432@users.noreply.github.com>
Co-authored-by: Andrea Alberti <a.alberti82@gmail.com>
Co-authored-by: Ananth Kini <ananthkini1@gmail.com>
Co-authored-by: Yuvraj Angad Singh <36276913+yuvrajangadsingh@users.noreply.github.com>
Co-authored-by: Debasish <90102437+dibyx@users.noreply.github.com>
Co-authored-by: Hashaam Zahid <68606886+Hashaam101@users.noreply.github.com>
Co-authored-by: tison <wander4096@gmail.com>
Co-authored-by: adithya32 <163162210+KumarADITHYA123@users.noreply.github.com>
Co-authored-by: Syed Ayman Quadri <87442765+saymanq@users.noreply.github.com>
Co-authored-by: jvargassanchez-dot <jvargassanchez@google.com>
Co-authored-by: Billy Biggs <bbiggs@google.com>
Co-authored-by: Om Patel <ompatel@google.com>
Co-authored-by: Mukunda Rao Katta <mukunda.vjcs6@gmail.com>
Co-authored-by: nirali <124287834+Niralisj@users.noreply.github.com>
Co-authored-by: Sikandar <ma5161310@gmail.com>
Co-authored-by: Gaurav <39389231+gsquared94@users.noreply.github.com>
Co-authored-by: luisfelipe-alt <luisfelipe@google.com>
Co-authored-by: Cesar Sanchez Coraspe <sanchezcoraspe@google.com>
Co-authored-by: sidhantgoyal-droid <sidhantgoyal@google.com>
Co-authored-by: amelidev <ameliesther@google.com>
Co-authored-by: Vedant Mahajan <vedant.04.mahajan@gmail.com>
Co-authored-by: Jerry Lin <44830071+jerrylin3321@users.noreply.github.com>
Co-authored-by: Jerry Lin <jerrysf@google.com>
Co-authored-by: Chad <chaddiao0@gmail.com>
Co-authored-by: Chad <chaddiao@google.com>
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 help wanted We will accept PRs from all issues marked as "help wanted". Thanks for your support! priority/p2 Important but can be addressed in a future release. size/l A large sized PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

"Failed to persist policy" error despite correct permissions

6 participants