Compare commits

...

58 Commits

Author SHA1 Message Date
acp-release-bot[bot]
5144aabc52 chore(main): release 0.58.0 (#847)
🤖 I have created a release *beep* *boop*
---


##
[0.58.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.57.0...v0.58.0)
(2026-07-09)


### Features

* **deps:** update to @anthropic-ai/claude-agent-sdk 0.3.205
([#854](https://github.com/agentclientprotocol/claude-agent-acp/issues/854))
([f664ced](f664ced76d))


### Bug Fixes

* Preserve live model on resumed sessions
([#848](https://github.com/agentclientprotocol/claude-agent-acp/issues/848))
([f3d8ae3](f3d8ae3eb3)),
closes
[#845](https://github.com/agentclientprotocol/claude-agent-acp/issues/845)
* Report usage for cancelled active turns
([#846](https://github.com/agentclientprotocol/claude-agent-acp/issues/846))
([b03318f](b03318f59c)),
closes
[#844](https://github.com/agentclientprotocol/claude-agent-acp/issues/844)
* tolerate missing text in streamed thinking chunks
([#852](https://github.com/agentclientprotocol/claude-agent-acp/issues/852))
([e944ced](e944ceddea))
* Use SDK guards for elicitation validation
([#850](https://github.com/agentclientprotocol/claude-agent-acp/issues/850))
([32b9350](32b93501d7))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-07-09 13:40:22 +02:00
dependabot[bot]
f664ced76d feat(deps): update to @anthropic-ai/claude-agent-sdk 0.3.205 (#854)
Bumps the minor group with 12 updates:

| Package | From | To |
| --- | --- | --- |
|
[@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript)
| `0.3.202` | `0.3.204` |
|
[@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)
| `26.1.0` | `26.1.1` |
| @anthropic-ai/claude-agent-sdk-darwin-arm64 | `0.3.202` | `0.3.204` |
| @anthropic-ai/claude-agent-sdk-darwin-x64 | `0.3.202` | `0.3.204` |
| @anthropic-ai/claude-agent-sdk-linux-arm64 | `0.3.202` | `0.3.204` |
| @anthropic-ai/claude-agent-sdk-linux-arm64-musl | `0.3.202` |
`0.3.204` |
| @anthropic-ai/claude-agent-sdk-linux-x64 | `0.3.202` | `0.3.204` |
| @anthropic-ai/claude-agent-sdk-linux-x64-musl | `0.3.202` | `0.3.204`
|
| @anthropic-ai/claude-agent-sdk-win32-arm64 | `0.3.202` | `0.3.204` |
| @anthropic-ai/claude-agent-sdk-win32-x64 | `0.3.202` | `0.3.204` |
|
[rolldown](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown)
| `1.1.4` | `1.1.5` |
| [std-env](https://github.com/unjs/std-env) | `4.1.0` | `4.2.0` |

Updates `@anthropic-ai/claude-agent-sdk` from 0.3.202 to 0.3.204
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/releases">@​anthropic-ai/claude-agent-sdk's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.204</h2>
<h2>What's changed</h2>
<ul>
<li>Updated to parity with Claude Code v2.1.204</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.204
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.204
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.204
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.204
</code></pre>
<h2>v0.3.203</h2>
<h2>What's changed</h2>
<ul>
<li>Added a <code>background_tasks_changed</code> system message with
the full set of live background tasks on every membership change, so
consumers can track background activity as a level instead of pairing
<code>task_started</code>/<code>task_notification</code> edges</li>
<li>Fixed stable releases shipping a <code>sdk.d.ts</code> with
unresolved type references that broke consumer typechecking with
<code>skipLibCheck</code> disabled</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.203
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.203
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.203
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.203
</code></pre>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/claude-agent-sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.204</h2>
<ul>
<li>Updated to parity with Claude Code v2.1.204</li>
</ul>
<h2>0.3.203</h2>
<ul>
<li>Added a <code>background_tasks_changed</code> system message with
the full set of live background tasks on every membership change, so
consumers can track background activity as a level instead of pairing
<code>task_started</code>/<code>task_notification</code> edges</li>
<li>Fixed stable releases shipping a <code>sdk.d.ts</code> with
unresolved type references that broke consumer typechecking with
<code>skipLibCheck</code> disabled</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7feb85d829"><code>7feb85d</code></a>
chore: Update CHANGELOG.md</li>
<li><a
href="eb18b2a6de"><code>eb18b2a</code></a>
chore: Update CHANGELOG.md</li>
<li>See full diff in <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/compare/v0.3.202...v0.3.204">compare
view</a></li>
</ul>
</details>
<br />

Updates `@types/node` from 26.1.0 to 26.1.1
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.202 to
0.3.204

Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.202 to
0.3.204

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.202 to
0.3.204

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.202
to 0.3.204

Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.202 to
0.3.204

Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.202 to
0.3.204

Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.202 to
0.3.204

Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.202 to
0.3.204

Updates `rolldown` from 1.1.4 to 1.1.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rolldown/rolldown/releases">rolldown's
releases</a>.</em></p>
<blockquote>
<h2>v1.1.5</h2>
<h2>[1.1.5] - 2026-07-08</h2>
<h3>🚀 Features</h3>
<ul>
<li>detect top-level import-binding reads as execution-order sensitive
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10180">#10180</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>sourcemap_filenames: add a sourcemapFileNames option (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9271">#9271</a>)
by <a
href="https://github.com/V1OL3TF0X"><code>@​V1OL3TF0X</code></a></li>
<li>binding: record plugin hook result kind in tracing spans (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10154">#10154</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>linking: skip side-effect-free modules in per-entry reachability (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10111">#10111</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>improve error message for unresolved virtual imports (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10156">#10156</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>add descriptive metadata to plugin API (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10106">#10106</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>add <code>--configLoader=native</code> option (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10118">#10118</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>improve invalid annotation warnings (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10185">#10185</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>keep deduplicated asset filenames stable once they can be observed
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10191">#10191</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>sourcemap_filenames: use public option name in pattern errors (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10188">#10188</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>sourcemap_filenames: hash prepared sourcemap content (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10178">#10178</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>tree-shake unused circular declarators exported via export list (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10166">#10166</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>dev: don't panic when an HMR rebuild hits an unresolved import (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10162">#10162</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>propagate errors from output.globals function (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9880">#9880</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>dev: revert cache mutations when a partial scan fails (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10110">#10110</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>dev: update importer relationships of cached modules in incremental
build (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10107">#10107</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>hmr: fall back to full reload when a changed module is not
registered as executed (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10132">#10132</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>chunk-optimizer: follow entry facade edges in runtime placement
cycle check (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10101">#10101</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>dev: ignore watcher events after close (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10113">#10113</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>emit async wrapper for TLA modules under onDemandWrapping (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10086">#10086</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>gate sideEffects:false modules' side effects on body demand (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10080">#10080</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>rolldown_plugin_vite_resolve: return empty object for <code>browser:
false</code> mapped modules (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10082">#10082</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>reset the word-boundary state on newline in Hires::Boundary
sourcemaps (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10025">#10025</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>trim an emptied chunk's outro/intro instead of skipping past it (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10029">#10029</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>test each edited chunk's own start against indent exclude ranges (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10026">#10026</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>preserve sourcemap mappings for indented lines when a CJS module
shares the chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10074">#10074</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>separate tree-shaking side effects from execution order sensitivity
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10168">#10168</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>type construct_vite_preload_call to take an ObjectPattern (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10135">#10135</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>treeshake: single-source the own-export classification shared with
the lazy-barrel loader (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10098">#10098</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>dev: reuse Vite's bundledDev server (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10081">#10081</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>clippy: ban std HashMap/HashSet in favour of FxHashMap/FxHashSet (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10108">#10108</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>treeshake: make body demand a second module bit instead of a stmt
multimap (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10097">#10097</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>seal used_symbol_refs by construction after its last writer (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10091">#10091</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>treeshake: replace inclusion mutual recursion with a worklist engine
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10096">#10096</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>treeshake: split include_statements.rs into focused modules (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10095">#10095</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>drop redundant is_user_defined filter on partitioned entries (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10050">#10050</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>project the retained export interface out of used_symbol_refs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10089">#10089</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>track used external symbols separately from used_symbol_refs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10088">#10088</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>make module namespace inclusion an explicit linking metadata field
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10087">#10087</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rolldown/rolldown/blob/main/CHANGELOG.md">rolldown's
changelog</a>.</em></p>
<blockquote>
<h2>[1.1.5] - 2026-07-08</h2>
<h3>🚀 Features</h3>
<ul>
<li>detect top-level import-binding reads as execution-order sensitive
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10180">#10180</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>sourcemap_filenames: add a sourcemapFileNames option (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9271">#9271</a>)
by <a
href="https://github.com/V1OL3TF0X"><code>@​V1OL3TF0X</code></a></li>
<li>binding: record plugin hook result kind in tracing spans (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10154">#10154</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>linking: skip side-effect-free modules in per-entry reachability (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10111">#10111</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>improve error message for unresolved virtual imports (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10156">#10156</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>add descriptive metadata to plugin API (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10106">#10106</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>add <code>--configLoader=native</code> option (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10118">#10118</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>improve invalid annotation warnings (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10185">#10185</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>keep deduplicated asset filenames stable once they can be observed
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10191">#10191</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>sourcemap_filenames: use public option name in pattern errors (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10188">#10188</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>sourcemap_filenames: hash prepared sourcemap content (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10178">#10178</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>tree-shake unused circular declarators exported via export list (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10166">#10166</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>dev: don't panic when an HMR rebuild hits an unresolved import (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10162">#10162</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>propagate errors from output.globals function (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9880">#9880</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>dev: revert cache mutations when a partial scan fails (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10110">#10110</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>dev: update importer relationships of cached modules in incremental
build (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10107">#10107</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>hmr: fall back to full reload when a changed module is not
registered as executed (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10132">#10132</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>chunk-optimizer: follow entry facade edges in runtime placement
cycle check (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10101">#10101</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>dev: ignore watcher events after close (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10113">#10113</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>emit async wrapper for TLA modules under onDemandWrapping (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10086">#10086</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>gate sideEffects:false modules' side effects on body demand (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10080">#10080</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>rolldown_plugin_vite_resolve: return empty object for <code>browser:
false</code> mapped modules (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10082">#10082</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>reset the word-boundary state on newline in Hires::Boundary
sourcemaps (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10025">#10025</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>trim an emptied chunk's outro/intro instead of skipping past it (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10029">#10029</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>test each edited chunk's own start against indent exclude ranges (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10026">#10026</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>preserve sourcemap mappings for indented lines when a CJS module
shares the chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10074">#10074</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>separate tree-shaking side effects from execution order sensitivity
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10168">#10168</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>type construct_vite_preload_call to take an ObjectPattern (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10135">#10135</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>treeshake: single-source the own-export classification shared with
the lazy-barrel loader (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10098">#10098</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>dev: reuse Vite's bundledDev server (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10081">#10081</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>clippy: ban std HashMap/HashSet in favour of FxHashMap/FxHashSet (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10108">#10108</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>treeshake: make body demand a second module bit instead of a stmt
multimap (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10097">#10097</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>seal used_symbol_refs by construction after its last writer (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10091">#10091</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>treeshake: replace inclusion mutual recursion with a worklist engine
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10096">#10096</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>treeshake: split include_statements.rs into focused modules (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10095">#10095</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>drop redundant is_user_defined filter on partitioned entries (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10050">#10050</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>project the retained export interface out of used_symbol_refs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10089">#10089</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>track used external symbols separately from used_symbol_refs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10088">#10088</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>make module namespace inclusion an explicit linking metadata field
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10087">#10087</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>rename statement evaluation metadata (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10078">#10078</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f09947ab01"><code>f09947a</code></a>
release: v1.1.5 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10194">#10194</a>)</li>
<li><a
href="bb66570a26"><code>bb66570</code></a>
fix: improve invalid annotation warnings (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10185">#10185</a>)</li>
<li><a
href="fb1d3b40d6"><code>fb1d3b4</code></a>
fix(sourcemap_filenames): use public option name in pattern errors (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10188">#10188</a>)</li>
<li><a
href="cccee78311"><code>cccee78</code></a>
test: move string_wizard replace unit tests to the JS magic-string suite
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10">#10</a>...</li>
<li><a
href="4b018b35c8"><code>4b018b3</code></a>
fix(sourcemap_filenames): hash prepared sourcemap content (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10178">#10178</a>)</li>
<li><a
href="72ce2b99c8"><code>72ce2b9</code></a>
feat(sourcemap_filenames): add a sourcemapFileNames option (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9271">#9271</a>)</li>
<li><a
href="7fe2c4d611"><code>7fe2c4d</code></a>
chore(deps): update oxc to 0.139.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10161">#10161</a>)</li>
<li><a
href="f730cac127"><code>f730cac</code></a>
fix: propagate errors from output.globals function (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9880">#9880</a>)</li>
<li><a
href="5b4a4080ff"><code>5b4a408</code></a>
chore(rolldown_plugin_utils): remove dead asset-url and css scaffolding
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10131">#10131</a>)</li>
<li><a
href="460900aeda"><code>460900a</code></a>
docs(cli): clarify disabling boolean/object flags like codeSplitting (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10153">#10153</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/rolldown/rolldown/commits/v1.1.5/packages/rolldown">compare
view</a></li>
</ul>
</details>
<br />

Updates `std-env` from 4.1.0 to 4.2.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/unjs/std-env/releases">std-env's
releases</a>.</em></p>
<blockquote>
<h2>v4.2.0</h2>
<h3>🚀 Enhancements</h3>
<ul>
<li>Add Junie agent support (<a
href="https://redirect.github.com/unjs/std-env/pull/195">#195</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>agents:</strong> Don't detect kiro IDE integrated terminal
as an agent (<a
href="https://redirect.github.com/unjs/std-env/pull/196">#196</a>)</li>
</ul>
<h3>❤️Contributors</h3>
<ul>
<li>Pooya Parsa (<a
href="https://github.com/pi0"><code>@​pi0</code></a>)</li>
<li>Gauthier POGAM (<a
href="https://github.com/GauthierPLM"><code>@​GauthierPLM</code></a>])</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/unjs/std-env/blob/main/CHANGELOG.md">std-env's
changelog</a>.</em></p>
<blockquote>
<h2>v4.2.0</h2>
<p><a
href="https://github.com/unjs/std-env/compare/v4.1.0...v4.2.0">compare
changes</a></p>
<h3>🚀 Enhancements</h3>
<ul>
<li>Add Junie agent support (<a
href="https://redirect.github.com/unjs/std-env/pull/195">#195</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>agents:</strong> Don't detect kiro IDE integrated terminal
as an agent (<a
href="https://redirect.github.com/unjs/std-env/pull/196">#196</a>)</li>
</ul>
<h3>🏡 Chore</h3>
<ul>
<li>Update deps (<a
href="https://github.com/unjs/std-env/commit/aaeddcd">aaeddcd</a>)</li>
<li>Update tsconfig (<a
href="https://github.com/unjs/std-env/commit/9e44e17">9e44e17</a>)</li>
<li>Update tsconfig (<a
href="https://github.com/unjs/std-env/commit/1b2503d">1b2503d</a>)</li>
</ul>
<h3>❤️ Contributors</h3>
<ul>
<li>Pi0x <a href="mailto:x@pi0.io">x@pi0.io</a></li>
<li>Pooya Parsa (<a
href="https://github.com/pi0"><code>@​pi0</code></a>)</li>
<li>Gauthier POGAM--LE MONTAGNER (<a
href="https://github.com/GauthierPLM"><code>@​GauthierPLM</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ddd5e9e076"><code>ddd5e9e</code></a>
chore(release): v4.2.0</li>
<li><a
href="09d5e7805f"><code>09d5e78</code></a>
fix(agents): don't detect kiro IDE integrated terminal as an agent (<a
href="https://redirect.github.com/unjs/std-env/issues/196">#196</a>)</li>
<li><a
href="c5b59ac814"><code>c5b59ac</code></a>
chore(deps): update github-actions to v7 (<a
href="https://redirect.github.com/unjs/std-env/issues/187">#187</a>)</li>
<li><a
href="1b2503d788"><code>1b2503d</code></a>
chore: update tsconfig</li>
<li><a
href="9e44e17f8e"><code>9e44e17</code></a>
chore: update tsconfig</li>
<li><a
href="aaeddcdb8f"><code>aaeddcd</code></a>
chore: update deps</li>
<li><a
href="56aade8cc2"><code>56aade8</code></a>
feat: add Junie agent support (<a
href="https://redirect.github.com/unjs/std-env/issues/195">#195</a>)</li>
<li>See full diff in <a
href="https://github.com/unjs/std-env/compare/v4.1.0...v4.2.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
2026-07-09 13:07:01 +02:00
Jazzen Chen
e944ceddea fix: tolerate missing text in streamed thinking chunks (#852)
## Summary

This makes streamed text/thinking chunk handling defensive when gateways
emit empty or malformed delta payloads.

- Guard `text_delta.text` and `thinking_delta.thinking` before reading
`.length`
- Skip missing/non-string text or thinking content the same way empty
chunks are already skipped
- Add regression coverage for a missing `thinking` delta before a real
text delta
- Add direct `toAcpNotifications` coverage for missing/non-string text
and thinking chunks

## Why

The adapter already skips empty thinking chunks, but some
Anthropic-compatible gateways can emit signature-only or omitted
thinking deltas where `thinking` is absent rather than an empty string.
In that case the adapter currently throws:

```text
Cannot read properties of undefined (reading 'length')
```

That aborts the ACP session even though the following text chunks are
valid.

This change keeps the existing behavior for valid chunks, while treating
missing/non-string chunk text as empty content.

## Test Plan

- `npm run check`
- `npm test -- --run`
- `npm run build`

Also verified manually through a VibeAround Web Chat flow using Claude
Code ACP with an Anthropic-compatible custom endpoint; the session
completed and returned a normal assistant response.

---------

Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
2026-07-08 11:23:13 +00:00
Ben Brandt
32b93501d7 fix: Use SDK guards for elicitation validation (#850) 2026-07-07 15:52:37 +00:00
Ben Brandt
f08c4521ec Fix hinted model alias resolution (#849) 2026-07-07 15:44:54 +00:00
Ben Brandt
f3d8ae3eb3 fix: Preserve live model on resumed sessions (#848)
Closes #845
2026-07-07 17:37:21 +02:00
Ben Brandt
b03318f59c fix: Report usage for cancelled active turns (#846)
Closes #844
2026-07-07 12:05:19 +00:00
acp-release-bot[bot]
2bf865eb42 chore(main): release 0.57.0 (#842)
🤖 I have created a release *beep* *boop*
---


##
[0.57.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.56.0...v0.57.0)
(2026-07-07)


### Features

* Update @anthropic-ai/claude-agent-sdk to 0.3.202
([#843](https://github.com/agentclientprotocol/claude-agent-acp/issues/843))
([1612c07](1612c07895))


### Bug Fixes

* don't emit empty agent_message_chunk
([#841](https://github.com/agentclientprotocol/claude-agent-acp/issues/841))
([d74dd1d](d74dd1d9d3))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-07-07 10:37:50 +02:00
Ben Brandt
1612c07895 feat: Update @anthropic-ai/claude-agent-sdk to 0.3.202 (#843) 2026-07-07 08:28:35 +00:00
Ege Chelebi
d74dd1d9d3 fix: don't emit empty agent_message_chunk (#841)
## Why this is needed

`toAcpNotifications` can emit an `agent_message_chunk` whose content is
an empty string. This happens in two situations:

1. **Streamed text deltas** — the `text` / `text_delta` case builds the
update unconditionally from `chunk.text`, and the Claude Agent SDK can
stream zero-length text deltas (for example, an empty trailing assistant
block at the end of a turn).
2. **Full-string content** — the string-content path emits a chunk even
when the string is empty.

An empty message chunk carries no information, so at best it is noise.
At worst it breaks clients: the ACP spec does not forbid empty content,
so clients handle it inconsistently and some throw. In JetBrains Air the
frontend event consumer throws on an empty-content `agent_message_chunk`
(`Failed to handle agent event`); once that happens the transcript is
**frozen for the rest of the turn** — no further updates render and
queued prompts are never dispatched. In practice this reproduced
repeatedly around image reads and end-of-turn, and the only recovery was
restarting the IDE.

Because the adapter is client-agnostic, this affects any ACP client that
is strict about chunk content, not a single editor — so the correct
place to fix it is here, in the adapter, rather than working around it
in each client.

## Fix

Do not emit empty content. Both call sites are guarded, mirroring the
empty-`thinking` guard that already exists a few lines below in the same
function, so behavior is consistent across content types:

- `text` / `text_delta`: only build the update when `chunk.text.length >
0`;
- string content: return `[]` when the string is empty.

The change is intentionally minimal and conservative — no information is
lost, and non-empty chunks are entirely unaffected.

## Tests

Three unit tests added on `toAcpNotifications`:

- empty string content → no notifications emitted;
- non-empty string content → still emitted unchanged;
- a stream containing an empty text block followed by a non-empty one →
only the non-empty block is emitted.

Full suite green (476 passing); eslint and prettier clean.
2026-07-07 08:17:17 +00:00
dependabot[bot]
f1bf4da891 chore(deps): bump the minor group with 2 updates (#840)
Bumps the minor group with 2 updates:
[@agentclientprotocol/sdk](https://github.com/agentclientprotocol/typescript-sdk)
and [hono](https://github.com/honojs/hono).

Updates `@agentclientprotocol/sdk` from 1.1.0 to 1.2.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/agentclientprotocol/typescript-sdk/releases">@​agentclientprotocol/sdk's
releases</a>.</em></p>
<blockquote>
<h2>v1.2.0</h2>
<h2><a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v1.1.0...v1.2.0">1.2.0</a>
(2026-07-06)</h2>
<h3>Features</h3>
<ul>
<li>Update schema to 1.17.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/204">#204</a>)
(<a
href="fa8b5bd426">fa8b5bd</a>)</li>
<li>Update schema to 1.19.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/213">#213</a>)
(<a
href="6599433640">6599433</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>make ndJsonStream receive path linear in message size (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/210">#210</a>)
(<a
href="2fc41d2822">2fc41d2</a>)</li>
<li>unify JSON-RPC message validation policy across transports (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/212">#212</a>)
(<a
href="5e01eb2ac2">5e01eb2</a>),
closes <a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/211">#211</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/agentclientprotocol/typescript-sdk/blob/main/CHANGELOG.md">@​agentclientprotocol/sdk's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v1.1.0...v1.2.0">1.2.0</a>
(2026-07-06)</h2>
<h3>Features</h3>
<ul>
<li>Update schema to 1.17.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/204">#204</a>)
(<a
href="fa8b5bd426">fa8b5bd</a>)</li>
<li>Update schema to 1.19.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/213">#213</a>)
(<a
href="6599433640">6599433</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>make ndJsonStream receive path linear in message size (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/210">#210</a>)
(<a
href="2fc41d2822">2fc41d2</a>)</li>
<li>unify JSON-RPC message validation policy across transports (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/212">#212</a>)
(<a
href="5e01eb2ac2">5e01eb2</a>),
closes <a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/211">#211</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f587c0be56"><code>f587c0b</code></a>
chore(main): release 1.2.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/205">#205</a>)</li>
<li><a
href="6599433640"><code>6599433</code></a>
feat: Update schema to 1.19.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/213">#213</a>)</li>
<li><a
href="5e01eb2ac2"><code>5e01eb2</code></a>
fix: unify JSON-RPC message validation policy across transports (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/212">#212</a>)</li>
<li><a
href="2fc41d2822"><code>2fc41d2</code></a>
fix: make ndJsonStream receive path linear in message size (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/210">#210</a>)</li>
<li><a
href="e73e42af1f"><code>e73e42a</code></a>
chore(deps): bump crate-ci/typos from 1.47.2 to 1.48.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/207">#207</a>)</li>
<li><a
href="f733390ebe"><code>f733390</code></a>
chore(deps-dev): bump the minor group with 8 updates (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/208">#208</a>)</li>
<li><a
href="fa8b5bd426"><code>fa8b5bd</code></a>
feat: Update schema to 1.17.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/204">#204</a>)</li>
<li>See full diff in <a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v1.1.0...v1.2.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `hono` from 4.12.27 to 4.12.28
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/hono/releases">hono's
releases</a>.</em></p>
<blockquote>
<h2>v4.12.28</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(serve-static): treat empty string content as found by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5062">honojs/hono#5062</a></li>
<li>docs(MIGRATION): fix req.raw.headers reference (property, not
method) by <a
href="https://github.com/EduardF1"><code>@​EduardF1</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5047">honojs/hono#5047</a></li>
<li>chore: don't publish <code>*.tsbuildinfo</code> by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5066">honojs/hono#5066</a></li>
<li>fix(utils/body,validator): normalize Content-Type media type for
case-insensitive matching by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5067">honojs/hono#5067</a></li>
<li>fix: avoid circular dependency between body.ts and request.ts by <a
href="https://github.com/usualoma"><code>@​usualoma</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5071">honojs/hono#5071</a></li>
<li>fix(bun): report the requested subprotocol on WSContext.protocol by
<a href="https://github.com/greymoth-jp"><code>@​greymoth-jp</code></a>
in <a
href="https://redirect.github.com/honojs/hono/pull/5059">honojs/hono#5059</a></li>
<li>chore: bump <code>devDependencies</code> by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5085">honojs/hono#5085</a></li>
<li>fix(aws-lambda): detect V2 events by request context, not rawPath
alone by <a
href="https://github.com/VihaanAgarwal"><code>@​VihaanAgarwal</code></a>
in <a
href="https://redirect.github.com/honojs/hono/pull/5033">honojs/hono#5033</a></li>
<li>docs(context-storage): fix JSDoc by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5086">honojs/hono#5086</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/EduardF1"><code>@​EduardF1</code></a>
made their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/5047">honojs/hono#5047</a></li>
<li><a
href="https://github.com/greymoth-jp"><code>@​greymoth-jp</code></a>
made their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/5059">honojs/hono#5059</a></li>
<li><a
href="https://github.com/VihaanAgarwal"><code>@​VihaanAgarwal</code></a>
made their first contribution in <a
href="https://redirect.github.com/honojs/hono/pull/5033">honojs/hono#5033</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.27...v4.12.28">https://github.com/honojs/hono/compare/v4.12.27...v4.12.28</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="626b185d0e"><code>626b185</code></a>
4.12.28</li>
<li><a
href="d6b1d32a69"><code>d6b1d32</code></a>
docs(context-storage): fix JSDoc (<a
href="https://redirect.github.com/honojs/hono/issues/5086">#5086</a>)</li>
<li><a
href="45b081b9b9"><code>45b081b</code></a>
fix(aws-lambda): detect V2 events by request context, not rawPath alone
(<a
href="https://redirect.github.com/honojs/hono/issues/5033">#5033</a>)</li>
<li><a
href="a05813c058"><code>a05813c</code></a>
chore: bump <code>devDependencies</code> (<a
href="https://redirect.github.com/honojs/hono/issues/5085">#5085</a>)</li>
<li><a
href="872997d283"><code>872997d</code></a>
fix(bun): report the requested subprotocol on WSContext.protocol (<a
href="https://redirect.github.com/honojs/hono/issues/5059">#5059</a>)</li>
<li><a
href="82b321b5b0"><code>82b321b</code></a>
fix: avoid circular dependency between body.ts and request.ts (<a
href="https://redirect.github.com/honojs/hono/issues/5071">#5071</a>)</li>
<li><a
href="b20d4225c9"><code>b20d422</code></a>
fix(utils/body,validator): normalize Content-Type media type for
case-insensi...</li>
<li><a
href="9728702911"><code>9728702</code></a>
chore: don't publish <code>*.tsbuildinfo</code> (<a
href="https://redirect.github.com/honojs/hono/issues/5066">#5066</a>)</li>
<li><a
href="ed8795e5cc"><code>ed8795e</code></a>
docs(MIGRATION): fix req.raw.headers reference (property, not method)
(<a
href="https://redirect.github.com/honojs/hono/issues/5047">#5047</a>)</li>
<li><a
href="03a9416a13"><code>03a9416</code></a>
fix(serve-static): treat empty string content as found (<a
href="https://redirect.github.com/honojs/hono/issues/5062">#5062</a>)</li>
<li>See full diff in <a
href="https://github.com/honojs/hono/compare/v4.12.27...v4.12.28">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
2026-07-06 17:58:26 +02:00
acp-release-bot[bot]
837989ef96 chore(main): release 0.56.0 (#839)
🤖 I have created a release *beep* *boop*
---


##
[0.56.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.55.0...v0.56.0)
(2026-07-06)


### Features

* **deps:** bump @anthropic-ai/claude-agent-sdk to 0.3.201
([#837](https://github.com/agentclientprotocol/claude-agent-acp/issues/837))
([ff2a8a9](ff2a8a9635))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-07-06 11:31:10 +02:00
dependabot[bot]
ff2a8a9635 feat(deps): bump @anthropic-ai/claude-agent-sdk to 0.3.201 (#837)
Bumps the minor group with 11 updates:

| Package | From | To |
| --- | --- | --- |
|
[@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript)
| `0.3.198` | `0.3.199` |
|
[@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript)
| `0.109.1` | `0.110.0` |
| @anthropic-ai/claude-agent-sdk-darwin-arm64 | `0.3.198` | `0.3.199` |
| @anthropic-ai/claude-agent-sdk-darwin-x64 | `0.3.198` | `0.3.199` |
| @anthropic-ai/claude-agent-sdk-linux-arm64 | `0.3.198` | `0.3.199` |
| @anthropic-ai/claude-agent-sdk-linux-arm64-musl | `0.3.198` |
`0.3.199` |
| @anthropic-ai/claude-agent-sdk-linux-x64 | `0.3.198` | `0.3.199` |
| @anthropic-ai/claude-agent-sdk-linux-x64-musl | `0.3.198` | `0.3.199`
|
| @anthropic-ai/claude-agent-sdk-win32-arm64 | `0.3.198` | `0.3.199` |
| @anthropic-ai/claude-agent-sdk-win32-x64 | `0.3.198` | `0.3.199` |
| [picomatch](https://github.com/micromatch/picomatch) | `4.0.4` |
`4.0.5` |

Updates `@anthropic-ai/claude-agent-sdk` from 0.3.198 to 0.3.199
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/releases">@​anthropic-ai/claude-agent-sdk's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.199</h2>
<h2>What's changed</h2>
<ul>
<li>Added <code>requestId</code> to <code>canUseTool</code> callback
options for correlating out-of-band permission responses, and support
for returning <code>null</code> to suppress the SDK's automatic control
response</li>
<li>Added <code>blocked</code> field to <code>workflow_agent</code>
progress events indicating when an agent was blocked by the auto-mode
safety classifier</li>
<li>Added <code>mode:&quot;mask&quot;</code> and per-credential
<code>injectHosts</code> to <code>sandbox.credentials</code> settings
types for injecting masked credentials into sandboxed commands</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.199
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.199
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.199
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.199
</code></pre>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/claude-agent-sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.199</h2>
<ul>
<li>Added <code>requestId</code> to <code>canUseTool</code> callback
options for correlating out-of-band permission responses, and support
for returning <code>null</code> to suppress the SDK's automatic control
response</li>
<li>Added <code>blocked</code> field to <code>workflow_agent</code>
progress events indicating when an agent was blocked by the auto-mode
safety classifier</li>
<li>Added <code>mode:&quot;mask&quot;</code> and per-credential
<code>injectHosts</code> to <code>sandbox.credentials</code> settings
types for injecting masked credentials into sandboxed commands</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a0c02d6d99"><code>a0c02d6</code></a>
chore: Update CHANGELOG.md</li>
<li>See full diff in <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/compare/v0.3.198...v0.3.199">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/sdk` from 0.109.1 to 0.110.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-typescript/releases">@​anthropic-ai/sdk's
releases</a>.</em></p>
<blockquote>
<h2>sdk: v0.110.0</h2>
<h2>0.110.0 (2026-07-02)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.109.1...sdk-v0.110.0">sdk-v0.109.1...sdk-v0.110.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add agent-memory-2026-07-22 beta header (<a
href="a470e10aaa">a470e10</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.110.0 (2026-07-02)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.109.1...sdk-v0.110.0">sdk-v0.109.1...sdk-v0.110.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add agent-memory-2026-07-22 beta header (<a
href="a470e10aaa">a470e10</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4f2eb80719"><code>4f2eb80</code></a>
chore: release main (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/1107">#1107</a>)</li>
<li>See full diff in <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.109.1...sdk-v0.110.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.198 to
0.3.199

Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.198 to
0.3.199

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.198 to
0.3.199

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.198
to 0.3.199

Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.198 to
0.3.199

Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.198 to
0.3.199

Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.198 to
0.3.199

Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.198 to
0.3.199

Updates `picomatch` from 4.0.4 to 4.0.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/micromatch/picomatch/releases">picomatch's
releases</a>.</em></p>
<blockquote>
<h2>4.0.5</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: preserve all branches when rewriting risky repeated extglobs by
<a href="https://github.com/MerlijnW70"><code>@​MerlijnW70</code></a> in
<a
href="https://redirect.github.com/micromatch/picomatch/pull/182">micromatch/picomatch#182</a></li>
<li>fix: honor the windows option when matching basenames by <a
href="https://github.com/MerlijnW70"><code>@​MerlijnW70</code></a> in <a
href="https://redirect.github.com/micromatch/picomatch/pull/183">micromatch/picomatch#183</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/MerlijnW70"><code>@​MerlijnW70</code></a> made
their first contribution in <a
href="https://redirect.github.com/micromatch/picomatch/pull/182">micromatch/picomatch#182</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/micromatch/picomatch/compare/4.0.4...4.0.5">https://github.com/micromatch/picomatch/compare/4.0.4...4.0.5</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4f41a8edad"><code>4f41a8e</code></a>
4.0.5</li>
<li><a
href="02cfc1bf91"><code>02cfc1b</code></a>
Update .verb.md and run verb to generate README documentation</li>
<li><a
href="cc52ff6e86"><code>cc52ff6</code></a>
Only run the upload code coverage step for 1 matrix permutation</li>
<li><a
href="6d426d7fe9"><code>6d426d7</code></a>
Allow workflow to continue if the code coverage step to fails</li>
<li><a
href="a00b954c04"><code>a00b954</code></a>
Merge branch 'codeql-coverage'</li>
<li><a
href="96803818ca"><code>9680381</code></a>
Merge pull request <a
href="https://redirect.github.com/micromatch/picomatch/issues/183">#183</a>
from MerlijnW70/fix/matchbase-windows-basename</li>
<li><a
href="648b4f2f13"><code>648b4f2</code></a>
Merge pull request <a
href="https://redirect.github.com/micromatch/picomatch/issues/182">#182</a>
from MerlijnW70/fix/repeated-extglob-drops-branches</li>
<li><a
href="70e6485a54"><code>70e6485</code></a>
Configure code coverage upload for CodeQL</li>
<li><a
href="ab8bc4df81"><code>ab8bc4d</code></a>
fix: honor the windows option when matching basenames</li>
<li><a
href="628930764f"><code>6289307</code></a>
fix: preserve all branches when rewriting risky repeated extglobs</li>
<li>Additional commits viewable in <a
href="https://github.com/micromatch/picomatch/compare/4.0.4...4.0.5">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
2026-07-06 11:18:45 +02:00
acp-release-bot[bot]
6e0179288a chore(main): release 0.55.0 (#832)
🤖 I have created a release *beep* *boop*
---


##
[0.55.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.54.1...v0.55.0)
(2026-07-02)


### Features

* Add refusal fallback consent dialog support
([#834](https://github.com/agentclientprotocol/claude-agent-acp/issues/834))
([15dfd83](15dfd83daa))
* **deps-dev:** bump the minor group with 3 updates
([#831](https://github.com/agentclientprotocol/claude-agent-acp/issues/831))
([8d5febf](8d5febf854))
* Update to claude-agent-sdk 0.3.198
([#836](https://github.com/agentclientprotocol/claude-agent-acp/issues/836))
([307ab82](307ab82712))


### Bug Fixes

* Handle model refusal fallback updates
([#833](https://github.com/agentclientprotocol/claude-agent-acp/issues/833))
([648e3f6](648e3f60bd))
* Handle SDK idle turns without results
([#835](https://github.com/agentclientprotocol/claude-agent-acp/issues/835))
([57b00cc](57b00ccac6))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-07-02 13:16:28 +02:00
Ben Brandt
307ab82712 feat: Update to claude-agent-sdk 0.3.198 (#836) 2026-07-02 10:42:48 +00:00
Ben Brandt
57b00ccac6 fix: Handle SDK idle turns without results (#835)
Closes #825 (hopefully)
2026-07-02 12:41:21 +02:00
Ben Brandt
15dfd83daa feat: Add refusal fallback consent dialog support (#834) 2026-07-02 10:14:50 +00:00
Ben Brandt
648e3f60bd fix: Handle model refusal fallback updates (#833) 2026-07-02 09:21:49 +00:00
dependabot[bot]
8d5febf854 feat(deps-dev): bump the minor group with 3 updates (#831)
Bumps the minor group with 3 updates:
[@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript),
[@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)
and
[rolldown](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown).

Updates `@anthropic-ai/sdk` from 0.108.0 to 0.109.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-typescript/releases">@​anthropic-ai/sdk's
releases</a>.</em></p>
<blockquote>
<h2>sdk: v0.109.0</h2>
<h2>0.109.0 (2026-06-30)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.108.0...sdk-v0.109.0">sdk-v0.108.0...sdk-v0.109.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add support for Managed Agents event delta
streaming, agent overrides, reverse pagination, vault credential
injection scoping, and agent and deployment webhook events (<a
href="7f3211b488">7f3211b</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.109.0 (2026-06-30)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.108.0...sdk-v0.109.0">sdk-v0.108.0...sdk-v0.109.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add support for Managed Agents event delta
streaming, agent overrides, reverse pagination, vault credential
injection scoping, and agent and deployment webhook events (<a
href="7f3211b488">7f3211b</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="cb829c7642"><code>cb829c7</code></a>
chore: release main</li>
<li><a
href="fd0341dfe7"><code>fd0341d</code></a>
feat(api): add support for Managed Agents event delta streaming, agent
overri...</li>
<li><a
href="90f767ae90"><code>90f767a</code></a>
codegen metadata</li>
<li>See full diff in <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.108.0...sdk-v0.109.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@types/node` from 26.0.1 to 26.1.0
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node">compare
view</a></li>
</ul>
</details>
<br />

Updates `rolldown` from 1.1.3 to 1.1.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rolldown/rolldown/releases">rolldown's
releases</a>.</em></p>
<blockquote>
<h2>v1.1.4</h2>
<h2>[1.1.4] - 2026-07-01</h2>
<h3>🚀 Features</h3>
<ul>
<li>disable <code>experimental.lazyBarrel</code> by default (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10071">#10071</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>dev: disable lazy barrel in dev mode (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10060">#10060</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>generate: keep full JSON interface under preserveModules namespa…
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10056">#10056</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>check finalize_other_specifiers in its own Debug attribute (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10032">#10032</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>serialize the KeepAssign unused minify option as
&quot;keep_assign&quot; (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10031">#10031</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>keep fragments after the newline fragment in MagicString::last_line
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10023">#10023</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>generate: undeclared JSON named exports under preserveModules (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10020">#10020</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10027">#10027</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>deconflict: rename CJS-wrapped locals that shadow chunk-root
bindings (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9921">#9921</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>rolldown: keep entry facade when a shared chunk holds another
entry's module (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9997">#9997</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>treeshake: also bail JSON default split when the object escapes (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9996">#9996</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>don't classify await in a strict-mode function as top-level await
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9987">#9987</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>avoid spurious leading newline in addon hooks
(banner/footer/intro/outro) (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9989">#9989</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>handle JSON default mutation bailouts (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9972">#9972</a>)
by <a
href="https://github.com/TheAlexLichter"><code>@​TheAlexLichter</code></a></li>
<li>plugin: make lazy hook metadata enumerable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9991">#9991</a>)
by <a
href="https://github.com/TheAlexLichter"><code>@​TheAlexLichter</code></a></li>
<li>dev: make init errors in lazy-compiled modules catchable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9981">#9981</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>treeshake: keep computed-key side effects on namespace member access
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9986">#9986</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>binding: validate replace plugin delimiters length instead of
panicking (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9984">#9984</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>reconstruct nested rest patterns in into_expression (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9980">#9980</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>reconstruct rest patterns as spread in into_expression (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9976">#9976</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>preserve export keyword on multi-declarator exports under keepNames
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9974">#9974</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>deterministically keep the shortest name for deduplicated assets (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9948">#9948</a>)
by <a href="https://github.com/x1024"><code>@​x1024</code></a></li>
<li>treeshake: apply @<strong>NO_SIDE_EFFECTS</strong> to cross-chunk
namespace calls (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9960">#9960</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>drop redundant program scope enter/leave in finalizer (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10049">#10049</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>deconflict: extract collect_chunk_scope_captured_names (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10006">#10006</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>unify pre-scan multi-declarator split into one decision site (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9982">#9982</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>common: return bool from SymbolRef::is_not_reassigned (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9962">#9962</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>rolldown: remove outdated comment for removing parenthesized
expression (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10062">#10062</a>)
by <a href="https://github.com/Dunqing"><code>@​Dunqing</code></a></li>
<li>use GitHub-flavored alert for Etiquette note in contribution guide
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10012">#10012</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>replace: explain the delimiters left and right boundaries (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9985">#9985</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>ast-mutation: remove stale Address Use section after pre-scan
refactor (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9983">#9983</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>remove fathom (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9968">#9968</a>)
by <a
href="https://github.com/mdong1909"><code>@​mdong1909</code></a></li>
<li>contribution-guide: code-format main branch references (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9966">#9966</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>contribution-guide: fix stale REPL note and tidy wording (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9957">#9957</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>contribution-guide: clarify when to discuss before opening a PR (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9955">#9955</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
</ul>
<h3>⚡ Performance</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rolldown/rolldown/blob/main/CHANGELOG.md">rolldown's
changelog</a>.</em></p>
<blockquote>
<h2>[1.1.4] - 2026-07-01</h2>
<h3>🚀 Features</h3>
<ul>
<li>disable <code>experimental.lazyBarrel</code> by default (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10071">#10071</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>dev: disable lazy barrel in dev mode (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10060">#10060</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>generate: keep full JSON interface under preserveModules namespa…
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10056">#10056</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>check finalize_other_specifiers in its own Debug attribute (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10032">#10032</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>serialize the KeepAssign unused minify option as
&quot;keep_assign&quot; (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10031">#10031</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>keep fragments after the newline fragment in MagicString::last_line
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10023">#10023</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>generate: undeclared JSON named exports under preserveModules (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10020">#10020</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10027">#10027</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>deconflict: rename CJS-wrapped locals that shadow chunk-root
bindings (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9921">#9921</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>rolldown: keep entry facade when a shared chunk holds another
entry's module (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9997">#9997</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>treeshake: also bail JSON default split when the object escapes (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9996">#9996</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>don't classify await in a strict-mode function as top-level await
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9987">#9987</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>avoid spurious leading newline in addon hooks
(banner/footer/intro/outro) (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9989">#9989</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>handle JSON default mutation bailouts (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9972">#9972</a>)
by <a
href="https://github.com/TheAlexLichter"><code>@​TheAlexLichter</code></a></li>
<li>plugin: make lazy hook metadata enumerable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9991">#9991</a>)
by <a
href="https://github.com/TheAlexLichter"><code>@​TheAlexLichter</code></a></li>
<li>dev: make init errors in lazy-compiled modules catchable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9981">#9981</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>treeshake: keep computed-key side effects on namespace member access
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9986">#9986</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>binding: validate replace plugin delimiters length instead of
panicking (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9984">#9984</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>reconstruct nested rest patterns in into_expression (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9980">#9980</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>reconstruct rest patterns as spread in into_expression (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9976">#9976</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>preserve export keyword on multi-declarator exports under keepNames
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9974">#9974</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>deterministically keep the shortest name for deduplicated assets (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9948">#9948</a>)
by <a href="https://github.com/x1024"><code>@​x1024</code></a></li>
<li>treeshake: apply @<strong>NO_SIDE_EFFECTS</strong> to cross-chunk
namespace calls (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9960">#9960</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>drop redundant program scope enter/leave in finalizer (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10049">#10049</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>deconflict: extract collect_chunk_scope_captured_names (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10006">#10006</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>unify pre-scan multi-declarator split into one decision site (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9982">#9982</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>common: return bool from SymbolRef::is_not_reassigned (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9962">#9962</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>rolldown: remove outdated comment for removing parenthesized
expression (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10062">#10062</a>)
by <a href="https://github.com/Dunqing"><code>@​Dunqing</code></a></li>
<li>use GitHub-flavored alert for Etiquette note in contribution guide
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10012">#10012</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>replace: explain the delimiters left and right boundaries (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9985">#9985</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>ast-mutation: remove stale Address Use section after pre-scan
refactor (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9983">#9983</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>remove fathom (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9968">#9968</a>)
by <a
href="https://github.com/mdong1909"><code>@​mdong1909</code></a></li>
<li>contribution-guide: code-format main branch references (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9966">#9966</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>contribution-guide: fix stale REPL note and tidy wording (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9957">#9957</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>contribution-guide: clarify when to discuss before opening a PR (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9955">#9955</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
</ul>
<h3>⚡ Performance</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6cbd2330dc"><code>6cbd233</code></a>
release: v1.1.4 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10072">#10072</a>)</li>
<li><a
href="a0bd64e4ad"><code>a0bd64e</code></a>
feat: disable <code>experimental.lazyBarrel</code> by default (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10071">#10071</a>)</li>
<li><a
href="e041753ce2"><code>e041753</code></a>
chore: remove the unused BindingGenerateHmrPatchReturn napi type (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10034">#10034</a>)</li>
<li><a
href="d8e5790f34"><code>d8e5790</code></a>
chore: remove the unused ScheduledBuild napi struct (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10033">#10033</a>)</li>
<li><a
href="4468f65cb0"><code>4468f65</code></a>
fix: keep fragments after the newline fragment in MagicString::last_line
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10">#10</a>...</li>
<li><a
href="50db1f3fae"><code>50db1f3</code></a>
revert: &quot;fix(plugin): make lazy hook metadata enumerable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9991">#9991</a>)&quot;
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10005">#10005</a>)</li>
<li><a
href="e0dfef1fc4"><code>e0dfef1</code></a>
fix: avoid spurious leading newline in addon hooks
(banner/footer/intro/outro...</li>
<li><a
href="d3303b75b6"><code>d3303b7</code></a>
fix(plugin): make lazy hook metadata enumerable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9991">#9991</a>)</li>
<li><a
href="dc7bc739b2"><code>dc7bc73</code></a>
test(dev): reject unknown lazy compile modules (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9969">#9969</a>)</li>
<li>See full diff in <a
href="https://github.com/rolldown/rolldown/commits/v1.1.4/packages/rolldown">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-01 17:09:37 +02:00
acp-release-bot[bot]
15ec9ab0dc chore(main): release 0.54.1 (#829)
🤖 I have created a release *beep* *boop*
---


##
[0.54.1](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.54.0...v0.54.1)
(2026-06-30)


### Bug Fixes

* apply modelOverrides when resolving availableModels allowlist
([#827](https://github.com/agentclientprotocol/claude-agent-acp/issues/827))
([98c284b](98c284bb87))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-06-30 19:03:52 +00:00
Hao Zhou
98c284bb87 fix: apply modelOverrides when resolving availableModels allowlist (#827)
## Problem

When `claude-agent-acp` runs against a Bedrock or Vertex deployment
where the
enterprise enforces **short model aliases** in `availableModels` (e.g.
`claude-opus-4-6`), session creation fails immediately with:

```
API Error (claude-opus-4-6): 400 The provided model identifier is invalid.
Try switching to us.anthropic.claude-opus-4-5-20251101-v1:0.
```

### Root cause

`applyAvailableModelsAllowlist` rewrites each allowlisted model's
`value` to the
user's literal entry (the short alias), and that value is what gets
passed to
`query.setModel()`. The provider API rejects short aliases — it requires
provider-specific IDs such as `global.anthropic.claude-opus-4-6-v1[1m]`.

The `modelOverrides` map — which exists precisely to translate aliases
to
provider IDs — was never consulted during allowlist resolution. So even
with a
correct `modelOverrides` configured (via `settings.json` or
`CLAUDE_MODEL_CONFIG`),
the alias still reached the API unchanged.

This is reproducible on the Amazon-internal Toolbox Claude distribution,
which
regenerates `~/.claude/settings.json` on every launch with
`availableModels`
pinned to short aliases — so editing `settings.json` cannot work around
it.

### Trace (with temporary debug logging)

```
settings.model          = "global.anthropic.claude-opus-4-6-v1[1m]"   (desired)
getAvailableModels      currentModel.value = "claude-opus-4-6"        (WRONG)
                        calling query.setModel("claude-opus-4-6")     (rejected)
```

## Fix

`applyAvailableModelsAllowlist` now accepts `settings.modelOverrides`.
When an
allowlist alias has an override mapping, the **overridden provider ID**
becomes
the surfaced model value, so `setModel` passes an ID the provider
accepts.

After the fix:

```
getAvailableModels      currentModel.value = "global.anthropic.claude-opus-4-6-v1[1m]"
                        calling query.setModel("global.anthropic.claude-opus-4-6-v1[1m]")
```

and `acpx claude exec "what model are you using?"` responds normally:

> I'm running on Claude Opus 4.6 with a 1M token context window.

## Testing

- Added a regression test (`maps allowlist aliases through
modelOverrides to
provider IDs`) under the existing `availableModels allowlist from
settings`
  suite.
- Full suite: `411 passed | 17 skipped`.
- `npm run check` (eslint + prettier) clean.
- `tsc` build clean.
- Manually verified end-to-end via `acpx` against a Bedrock-routed
Toolbox
  Claude binary.

---------

Co-authored-by: Hao Zhou <zhuha@amazon.com>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-06-30 19:02:32 +00:00
acp-release-bot[bot]
71d93b3ada chore(main): release 0.54.0 (#823)
🤖 I have created a release *beep* *boop*
---


##
[0.54.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.53.0...v0.54.0)
(2026-06-30)


### Features

* Add Fast mode session config support
([#828](https://github.com/agentclientprotocol/claude-agent-acp/issues/828))
([fa949a2](fa949a20db))
* **deps-dev:** bump prettier from 3.9.1 to 3.9.3 in the minor group
([#821](https://github.com/agentclientprotocol/claude-agent-acp/issues/821))
([b8df8e0](b8df8e0e54))
* **deps:** bump @anthropic-ai/claude-agent-sdk to 0.3.197 for Sonnet 5
([#826](https://github.com/agentclientprotocol/claude-agent-acp/issues/826))
([ef42c46](ef42c46e5a))
* **deps:** bump fast-uri from 3.1.2 to 3.1.3
([#822](https://github.com/agentclientprotocol/claude-agent-acp/issues/822))
([64aa130](64aa130c66))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-06-30 21:01:39 +02:00
dependabot[bot]
ef42c46e5a feat(deps): bump @anthropic-ai/claude-agent-sdk to 0.3.197 for Sonnet 5 (#826)
Bumps the minor group with 23 updates:

| Package | From | To |
| --- | --- | --- |
|
[@agentclientprotocol/sdk](https://github.com/agentclientprotocol/typescript-sdk)
| `1.0.0` | `1.1.0` |
|
[@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript)
| `0.3.195` | `0.3.196` |
|
[@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript)
| `0.106.0` | `0.107.0` |
|
[@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin)
| `8.62.0` | `8.62.1` |
|
[@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)
| `8.62.0` | `8.62.1` |
| [prettier](https://github.com/prettier/prettier) | `3.9.3` | `3.9.4` |
| @anthropic-ai/claude-agent-sdk-darwin-arm64 | `0.3.195` | `0.3.196` |
| @anthropic-ai/claude-agent-sdk-darwin-x64 | `0.3.195` | `0.3.196` |
| @anthropic-ai/claude-agent-sdk-linux-arm64 | `0.3.195` | `0.3.196` |
| @anthropic-ai/claude-agent-sdk-linux-arm64-musl | `0.3.195` |
`0.3.196` |
| @anthropic-ai/claude-agent-sdk-linux-x64 | `0.3.195` | `0.3.196` |
| @anthropic-ai/claude-agent-sdk-linux-x64-musl | `0.3.195` | `0.3.196`
|
| @anthropic-ai/claude-agent-sdk-win32-arm64 | `0.3.195` | `0.3.196` |
| @anthropic-ai/claude-agent-sdk-win32-x64 | `0.3.195` | `0.3.196` |
|
[@typescript-eslint/project-service](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/project-service)
| `8.62.0` | `8.62.1` |
|
[@typescript-eslint/scope-manager](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/scope-manager)
| `8.62.0` | `8.62.1` |
|
[@typescript-eslint/tsconfig-utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/tsconfig-utils)
| `8.62.0` | `8.62.1` |
|
[@typescript-eslint/type-utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/type-utils)
| `8.62.0` | `8.62.1` |
|
[@typescript-eslint/types](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/types)
| `8.62.0` | `8.62.1` |
|
[@typescript-eslint/typescript-estree](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-estree)
| `8.62.0` | `8.62.1` |
|
[@typescript-eslint/utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils)
| `8.62.0` | `8.62.1` |
|
[@typescript-eslint/visitor-keys](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys)
| `8.62.0` | `8.62.1` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) |
`8.1.0` | `8.1.1` |

Updates `@agentclientprotocol/sdk` from 1.0.0 to 1.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/agentclientprotocol/typescript-sdk/releases">@​agentclientprotocol/sdk's
releases</a>.</em></p>
<blockquote>
<h2>v1.1.0</h2>
<h2><a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v1.0.0...v1.1.0">1.1.0</a>
(2026-06-29)</h2>
<h3>Features</h3>
<ul>
<li>Expose request ids in handler contexts (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/202">#202</a>)
(<a
href="eda849ca78">eda849c</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/agentclientprotocol/typescript-sdk/blob/main/CHANGELOG.md">@​agentclientprotocol/sdk's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v1.0.0...v1.1.0">1.1.0</a>
(2026-06-29)</h2>
<h3>Features</h3>
<ul>
<li>Expose request ids in handler contexts (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/202">#202</a>)
(<a
href="eda849ca78">eda849c</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="78023d4152"><code>78023d4</code></a>
chore(main): release 1.1.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/203">#203</a>)</li>
<li><a
href="eda849ca78"><code>eda849c</code></a>
feat: Expose request ids in handler contexts (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/202">#202</a>)</li>
<li>See full diff in <a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v1.0.0...v1.1.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk` from 0.3.195 to 0.3.196
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/releases">@​anthropic-ai/claude-agent-sdk's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.196</h2>
<h2>What's changed</h2>
<ul>
<li>Added <code>prompt_id</code> field to hook input payloads for
correlating hook events with OpenTelemetry prompt-level events</li>
<li>Fixed control protocol deduplication dropping tool-use IDs after
1000 resolutions, which could cause duplicate <code>tool_result</code>
deliveries in long-running sessions</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.196
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.196
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.196
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.196
</code></pre>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/claude-agent-sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.196</h2>
<ul>
<li>Added <code>prompt_id</code> field to hook input payloads for
correlating hook events with OpenTelemetry prompt-level events</li>
<li>Fixed control protocol deduplication dropping tool-use IDs after
1000 resolutions, which could cause duplicate <code>tool_result</code>
deliveries in long-running sessions</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e259047110"><code>e259047</code></a>
chore: Update CHANGELOG.md</li>
<li>See full diff in <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/compare/v0.3.195...v0.3.196">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/sdk` from 0.106.0 to 0.107.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-typescript/releases">@​anthropic-ai/sdk's
releases</a>.</em></p>
<blockquote>
<h2>sdk: v0.107.0</h2>
<h2>0.107.0 (2026-06-29)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.106.0...sdk-v0.107.0">sdk-v0.106.0...sdk-v0.107.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add support for 20260318 web fetch and support
tools (<a
href="d7057ea73b">d7057ea</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>agent-toolset:</strong> bound canonicalize symlink hops;
resolve glob matches before confinement check (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/142">#142</a>)
(<a
href="277be80af6">277be80</a>)</li>
<li><strong>types:</strong> restore BatchCreateParams.Request.params
dropped by codegen merge (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/165">#165</a>)
(<a
href="c6b68d248e">c6b68d2</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>api:</strong> accept user profile ID's when counting tokens
(<a
href="6cda67e3b9">6cda67e</a>)</li>
<li><strong>docs:</strong> updates to descriptions and example values
(<a
href="51a5f8138f">51a5f81</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>update readme requirements to match anthropic docs (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/146">#146</a>)
(<a
href="3818412d37">3818412</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.107.0 (2026-06-29)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.106.0...sdk-v0.107.0">sdk-v0.106.0...sdk-v0.107.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add support for 20260318 web fetch and support
tools (<a
href="d7057ea73b">d7057ea</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>agent-toolset:</strong> bound canonicalize symlink hops;
resolve glob matches before confinement check (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/142">#142</a>)
(<a
href="277be80af6">277be80</a>)</li>
<li><strong>types:</strong> restore BatchCreateParams.Request.params
dropped by codegen merge (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/165">#165</a>)
(<a
href="c6b68d248e">c6b68d2</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>api:</strong> accept user profile ID's when counting tokens
(<a
href="6cda67e3b9">6cda67e</a>)</li>
<li><strong>docs:</strong> updates to descriptions and example values
(<a
href="51a5f8138f">51a5f81</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>update readme requirements to match anthropic docs (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/146">#146</a>)
(<a
href="3818412d37">3818412</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f1662fe32c"><code>f1662fe</code></a>
chore: release main</li>
<li><a
href="c7d44fd31e"><code>c7d44fd</code></a>
fix(types): restore BatchCreateParams.Request.params dropped by codegen
merge...</li>
<li><a
href="e3458100bb"><code>e345810</code></a>
feat(api): add support for 20260318 web fetch and support tools</li>
<li><a
href="c625b047e1"><code>c625b04</code></a>
fix(agent-toolset): bound canonicalize symlink hops; resolve glob
matches bef...</li>
<li><a
href="3a7c513c8f"><code>3a7c513</code></a>
chore(docs): updates to descriptions and example values</li>
<li><a
href="756ec9ef46"><code>756ec9e</code></a>
docs: update readme requirements to match anthropic docs (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/146">#146</a>)</li>
<li><a
href="9d37c71c29"><code>9d37c71</code></a>
chore(api): accept user profile ID's when counting tokens</li>
<li><a
href="d3c49c7b70"><code>d3c49c7</code></a>
codegen metadata</li>
<li>See full diff in <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.106.0...sdk-v0.107.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/eslint-plugin` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/eslint-plugin's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md">@​typescript-eslint/eslint-plugin's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li><a
href="4ecca6d3f9"><code>4ecca6d</code></a>
fix(eslint-plugin): [no-unnecessary-type-assertion] parenthesize object
liter...</li>
<li><a
href="f3a7ec78bf"><code>f3a7ec7</code></a>
chore(eslint-plugin-internal): [no-dynamic-tests] restrict where
noFormat can...</li>
<li><a
href="301f350cd1"><code>301f350</code></a>
fix(eslint-plugin): [no-unnecessary-boolean-literal-compare] preserve
boolean...</li>
<li><a
href="ebce2d40f8"><code>ebce2d4</code></a>
fix(eslint-plugin): [prefer-optional-chain] use suggestion instead of
autofix...</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/eslint-plugin">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/parser` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/parser's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md">@​typescript-eslint/parser's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<p>This was a version bump only for parser to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/parser">compare
view</a></li>
</ul>
</details>
<br />

Updates `prettier` from 3.9.3 to 3.9.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/prettier/prettier/releases">prettier's
releases</a>.</em></p>
<blockquote>
<h2>3.9.4</h2>
<ul>
<li>Angular: Format <code>@content(name)</code> -&gt; <code>@content
(name)</code> to align with other block syntax (<a
href="https://redirect.github.com/prettier/prettier/pull/19499">#19499</a>
by <a href="https://github.com/fisker"><code>@​fisker</code></a>)</li>
</ul>
<p>🔗 <a
href="https://github.com/prettier/prettier/blob/3.9.4/CHANGELOG.md#394">Changelog</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/prettier/prettier/blob/main/CHANGELOG.md">prettier's
changelog</a>.</em></p>
<blockquote>
<h1>3.9.4</h1>
<p><a
href="https://github.com/prettier/prettier/compare/3.9.3...3.9.4">diff</a></p>
<h4>Angular: Format <code>@content(name)</code> -&gt; <code>@content
(name)</code> to align with other block syntax (<a
href="https://redirect.github.com/prettier/prettier/pull/19499">#19499</a>
by <a href="https://github.com/fisker"><code>@​fisker</code></a>)</h4>
<!-- raw HTML omitted -->
<pre lang="html"><code>&lt;!-- Input --&gt;
&lt;FancyButton [label]=&quot;title&quot;&gt;
  @content (icon) {
    &lt;span&gt;Icon!&lt;/span&gt;
  }
  @content (description) {
    &lt;span&gt;Description text&lt;/span&gt;
  }
  &lt;span&gt;Other children&lt;/span&gt;
&lt;/FancyButton&gt;
<p>&lt;!-- Prettier 3.9.3 --&gt;
&lt;FancyButton [label]=&quot;title&quot;&gt;
<a href="https://github.com/content"><code>@​content</code></a>(icon) {
&lt;span&gt;Icon!&lt;/span&gt;
}
<a
href="https://github.com/content"><code>@​content</code></a>(description)
{
&lt;span&gt;Description text&lt;/span&gt;
}
&lt;span&gt;Other children&lt;/span&gt;
&lt;/FancyButton&gt;</p>
<p>&lt;!-- Prettier 3.9.4 --&gt;
&lt;FancyButton [label]=&quot;title&quot;&gt;
<a href="https://github.com/content"><code>@​content</code></a> (icon) {
&lt;span&gt;Icon!&lt;/span&gt;
}
<a href="https://github.com/content"><code>@​content</code></a>
(description) {
&lt;span&gt;Description text&lt;/span&gt;
}
&lt;span&gt;Other children&lt;/span&gt;
&lt;/FancyButton&gt;
</code></pre></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b693cb22b4"><code>b693cb2</code></a>
Release 3.9.4</li>
<li><a
href="2e92ac0ee2"><code>2e92ac0</code></a>
Angular: Format <code>@content(name)</code> -&gt; <code>@content
(name)</code> to align with other blo...</li>
<li><a
href="abed2c22db"><code>abed2c2</code></a>
Bump Prettier dependency to 3.9.3</li>
<li><a
href="6cfbc00921"><code>6cfbc00</code></a>
Clean changelog_unreleased</li>
<li>See full diff in <a
href="https://github.com/prettier/prettier/compare/3.9.3...3.9.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.195 to
0.3.196

Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.195 to
0.3.196

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.195 to
0.3.196

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.195
to 0.3.196

Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.195 to
0.3.196

Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.195 to
0.3.196

Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.195 to
0.3.196

Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.195 to
0.3.196

Updates `@typescript-eslint/project-service` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/project-service's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/project-service/CHANGELOG.md">@​typescript-eslint/project-service's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<p>This was a version bump only for project-service to align it with
other projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/project-service">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/scope-manager` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/scope-manager's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/scope-manager/CHANGELOG.md">@​typescript-eslint/scope-manager's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<p>This was a version bump only for scope-manager to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/scope-manager">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/tsconfig-utils` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/tsconfig-utils's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/tsconfig-utils/CHANGELOG.md">@​typescript-eslint/tsconfig-utils's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<p>This was a version bump only for tsconfig-utils to align it with
other projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/tsconfig-utils">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/type-utils` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/type-utils's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/type-utils/CHANGELOG.md">@​typescript-eslint/type-utils's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<p>This was a version bump only for type-utils to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/type-utils">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/types` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/types's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/types/CHANGELOG.md">@​typescript-eslint/types's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<p>This was a version bump only for types to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/types">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/typescript-estree` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/typescript-estree's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-estree/CHANGELOG.md">@​typescript-eslint/typescript-estree's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<p>This was a version bump only for typescript-estree to align it with
other projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/typescript-estree">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/utils` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/utils's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/utils/CHANGELOG.md">@​typescript-eslint/utils's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<p>This was a version bump only for utils to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/utils">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/visitor-keys` from 8.62.0 to 8.62.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/visitor-keys's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.1</h2>
<h2>8.62.1 (2026-06-29)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] use
suggestion instead of autofix for trailing binary operator (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li>
<li><strong>eslint-plugin:</strong>
[no-unnecessary-boolean-literal-compare] preserve boolean result in
fixer for nullable true comparisons (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
parenthesize object literal at left edge of expression statement (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Patrick Aleite</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/visitor-keys/CHANGELOG.md">@​typescript-eslint/visitor-keys's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.1 (2026-06-29)</h2>
<p>This was a version bump only for visitor-keys to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ea32f4ba5"><code>3ea32f4</code></a>
chore(release): publish 8.62.1</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/visitor-keys">compare
view</a></li>
</ul>
</details>
<br />

Updates `vite` from 8.1.0 to 8.1.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/releases">vite's
releases</a>.</em></p>
<blockquote>
<h2>v8.1.1</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/v8.1.1/packages/vite/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md">vite's
changelog</a>.</em></p>
<blockquote>
<h2><!-- raw HTML omitted --><a
href="https://github.com/vitejs/vite/compare/v8.1.0...v8.1.1">8.1.1</a>
(2026-06-30)<!-- raw HTML omitted --></h2>
<h3>Features</h3>
<ul>
<li>update dynamic import warning to link to Vite docs (<a
href="https://redirect.github.com/vitejs/vite/issues/22823">#22823</a>)
(<a
href="62bd7afd27">62bd7af</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>bundled-dev:</strong> avoid stack overflow on
<code>import.meta.hot.invalidate()</code> (<a
href="https://redirect.github.com/vitejs/vite/issues/22797">#22797</a>)
(<a
href="709eb8ee03">709eb8e</a>)</li>
<li><strong>bundled-dev:</strong> serve assets emitted during HMR/lazy
compile (<a
href="https://redirect.github.com/vitejs/vite/issues/22745">#22745</a>)
(<a
href="5876b2cc2e">5876b2c</a>)</li>
<li><strong>bundledDev:</strong> skip plugin transform hooks for
rolldown-lazy stub modules (<a
href="https://redirect.github.com/vitejs/vite/issues/22778">#22778</a>)
(<a
href="8f925e2e49">8f925e2</a>)</li>
<li><strong>css:</strong> preserve dollar signs in external
<code>@import</code> urls with lightningcss (<a
href="https://redirect.github.com/vitejs/vite/issues/22718">#22718</a>)
(<a
href="9fa7ab4990">9fa7ab4</a>)</li>
<li><strong>css:</strong> resolve tsconfig paths in CSS and Sass <a
href="https://github.com/import"><code>@​import</code></a> (<a
href="https://redirect.github.com/vitejs/vite/issues/22775">#22775</a>)
(<a
href="ef0b891616">ef0b891</a>)</li>
<li><strong>deps:</strong> update all non-major dependencies (<a
href="https://redirect.github.com/vitejs/vite/issues/22734">#22734</a>)
(<a
href="e635f493fa">e635f49</a>)</li>
<li><strong>deps:</strong> update all non-major dependencies (<a
href="https://redirect.github.com/vitejs/vite/issues/22804">#22804</a>)
(<a
href="8837400a67">8837400</a>)</li>
<li><strong>deps:</strong> update rolldown-related dependencies (<a
href="https://redirect.github.com/vitejs/vite/issues/22591">#22591</a>)
(<a
href="2ce6677a15">2ce6677</a>)</li>
<li>escape ids with multiple null bytes (<a
href="https://redirect.github.com/vitejs/vite/issues/22687">#22687</a>)
(<a
href="833fc302f3">833fc30</a>)</li>
<li>hide console window when running 'net use' on Windows (<a
href="https://redirect.github.com/vitejs/vite/issues/22698">#22698</a>)
(<a
href="92b63f219f">92b63f2</a>)</li>
<li>ignore bundled config temp dir (<a
href="https://redirect.github.com/vitejs/vite/issues/22800">#22800</a>)
(<a
href="043a81096d">043a810</a>)</li>
<li>invert <code>esbuild.jsxSideEffects</code> when converting to
<code>oxc.jsx.pure</code> (<a
href="https://redirect.github.com/vitejs/vite/issues/22809">#22809</a>)
(<a
href="33895ba4fa">33895ba</a>)</li>
<li><strong>optimize-deps:</strong> ignore
<code>ERR_CLOSED_SERVER</code> in scanner (<a
href="https://redirect.github.com/vitejs/vite/issues/22784">#22784</a>)
(<a
href="085a0ab704">085a0ab</a>)</li>
<li><strong>optimizer:</strong> scanner should resolve
<code>input</code> from <code>root</code> (<a
href="https://redirect.github.com/vitejs/vite/issues/22769">#22769</a>)
(<a
href="9722b0795b">9722b07</a>)</li>
<li>resolve pnpm .modules.yaml from workspace root instead of cwd (<a
href="https://redirect.github.com/vitejs/vite/issues/22757">#22757</a>)
(<a
href="2531ac7ccd">2531ac7</a>)</li>
<li>return sourcemap field from some plugins that were lacking (<a
href="https://redirect.github.com/vitejs/vite/issues/22782">#22782</a>)
(<a
href="7e18bf802b">7e18bf8</a>)</li>
<li><strong>server:</strong> handle malformed URI in indexHtmlMiddleware
(<a
href="https://redirect.github.com/vitejs/vite/issues/22781">#22781</a>)
(<a
href="84f5cccc75">84f5ccc</a>)</li>
</ul>
<h3>Miscellaneous Chores</h3>
<ul>
<li>improve dependency optimizer messages (<a
href="https://redirect.github.com/vitejs/vite/issues/22549">#22549</a>)
(<a
href="092cb3b424">092cb3b</a>)</li>
</ul>
<h3>Code Refactoring</h3>
<ul>
<li><strong>css:</strong> remove lightningcss null byte bug workaround
(<a
href="https://redirect.github.com/vitejs/vite/issues/22822">#22822</a>)
(<a
href="2dafd3bb7f">2dafd3b</a>)</li>
<li>use pre-defined environments variable to avoid duplicate
<code>Object.values</code> calls (<a
href="https://redirect.github.com/vitejs/vite/issues/22790">#22790</a>)
(<a
href="1113acf6cf">1113acf</a>)</li>
</ul>
<h3>Tests</h3>
<ul>
<li>enable &quot;manual chunk path&quot; test and remove
&quot;worker.format error&quot; test (<a
href="https://redirect.github.com/vitejs/vite/issues/22824">#22824</a>)
(<a
href="c088511f34">c088511</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4ae9e14f2c"><code>4ae9e14</code></a>
release: v8.1.1</li>
<li><a
href="8f925e2e49"><code>8f925e2</code></a>
fix(bundledDev): skip plugin transform hooks for rolldown-lazy stub
modules (...</li>
<li><a
href="c088511f34"><code>c088511</code></a>
test: enable &quot;manual chunk path&quot; test and remove
&quot;worker.format error&quot; test (...</li>
<li><a
href="62bd7afd27"><code>62bd7af</code></a>
feat: update dynamic import warning to link to Vite docs (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/22823">#22823</a>)</li>
<li><a
href="2dafd3bb7f"><code>2dafd3b</code></a>
refactor(css): remove lightningcss null byte bug workaround (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/22822">#22822</a>)</li>
<li><a
href="833fc302f3"><code>833fc30</code></a>
fix: escape ids with multiple null bytes (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/22687">#22687</a>)</li>
<li><a
href="9fa7ab4990"><code>9fa7ab4</code></a>
fix(css): preserve dollar signs in external <code>@import</code> urls
with lightningcss ...</li>
<li><a
href="1113acf6cf"><code>1113acf</code></a>
refactor: use pre-defined environments variable to avoid duplicate
`Object.va...</li>
<li><a
href="709eb8ee03"><code>709eb8e</code></a>
fix(bundled-dev): avoid stack overflow on
<code>import.meta.hot.invalidate()</code> (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/22">#22</a>...</li>
<li><a
href="043a81096d"><code>043a810</code></a>
fix: ignore bundled config temp dir (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/22800">#22800</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/vitejs/vite/commits/v8.1.1/packages/vite">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
2026-06-30 18:40:35 +00:00
Ben Brandt
fa949a20db feat: Add Fast mode session config support (#828) 2026-06-30 18:13:43 +00:00
dependabot[bot]
b8df8e0e54 feat(deps-dev): bump prettier from 3.9.1 to 3.9.3 in the minor group (#821)
Bumps the minor group with 1 update:
[prettier](https://github.com/prettier/prettier).

Updates `prettier` from 3.9.1 to 3.9.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/prettier/prettier/releases">prettier's
releases</a>.</em></p>
<blockquote>
<h2>3.9.3</h2>
<ul>
<li>Markdown: Fix unexpected removal of characters in liquid syntax (<a
href="https://redirect.github.com/prettier/prettier/pull/19489">prettier/prettier#19489</a>
by <a href="https://github.com/seiyab"><code>@​seiyab</code></a>)</li>
<li>TypeScript: Allow decorators to be used with declare on class fields
(<a
href="https://redirect.github.com/prettier/prettier/pull/19492">prettier/prettier#19492</a>
by <a
href="https://github.com/evoactivity"><code>@​evoactivity</code></a>)</li>
</ul>
<p>🔗 <a
href="https://github.com/prettier/prettier/blob/3.9.3/CHANGELOG.md#393">Changelog</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/prettier/prettier/blob/main/CHANGELOG.md">prettier's
changelog</a>.</em></p>
<blockquote>
<h1>3.9.3</h1>
<p><a
href="https://github.com/prettier/prettier/compare/3.9.1...3.9.3">diff</a></p>
<h4>Markdown: Fix unexpected removal of characters in liquid syntax (<a
href="https://redirect.github.com/prettier/prettier/pull/19489">#19489</a>
by <a href="https://github.com/seiyab"><code>@​seiyab</code></a>)</h4>
<!-- raw HTML omitted -->
<pre lang="md"><code>// Input
&lt;!-- Input --&gt;
{{ page.title
}} text
<p>&lt;!-- Prettier 3.9.1 --&gt;<br />
{{ page.title<br />
text</p>
<p>&lt;!-- Prettier 3.9.3 --&gt;<br />
{{ page.title<br />
}} text<br />
</code></pre></p>
<h4>TypeScript: Allow decorators to be used with declare on class fields
(<a
href="https://redirect.github.com/prettier/prettier/pull/19492">#19492</a>
by <a
href="https://github.com/evoactivity"><code>@​evoactivity</code></a>)</h4>
<p>Extensively used within the Ember ecosystem, decorators with
<code>declare</code> on class fields will ignore the babel parser error
and allow Prettier to format the code without breaking it.</p>
<!-- raw HTML omitted -->
<pre lang="ts"><code>// Input
export default class ProjectStatusComponent extends
Component&lt;ProjectStatusSig&gt; {
  @service declare server: ServerService;
}
<p>// Prettier 3.9.1<br />
// SyntaxError: Decorators can't be used with a declare field. (2:3)<br
/>
// 1 | export default class ProjectStatusComponent extends
Component&lt;ProjectStatusSig&gt; {<br />
//&gt; 2 | <a
href="https://github.com/service"><code>@​service</code></a> declare
server: ServerService;<br />
//    |   ^<br />
//  3 | }</p>
<p>// Prettier 3.9.3<br />
export default class ProjectStatusComponent extends
Component&lt;ProjectStatusSig&gt; {<br />
<a href="https://github.com/service"><code>@​service</code></a> declare
server: ServerService;<br />
}<br />
</code></pre></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3732e1dee6"><code>3732e1d</code></a>
Release 3.9.3</li>
<li><a
href="a74a7b05de"><code>a74a7b0</code></a>
Allow decorators to be used with <code>declare</code> on class fields
(<a
href="https://redirect.github.com/prettier/prettier/issues/19492">#19492</a>)</li>
<li><a
href="bd9e11ab41"><code>bd9e11a</code></a>
Correct text identification in liquid syntax (<a
href="https://redirect.github.com/prettier/prettier/issues/19489">#19489</a>)</li>
<li><a
href="269eee3faa"><code>269eee3</code></a>
Bump Prettier dependency to 3.9.1</li>
<li><a
href="ec7ccd1ea4"><code>ec7ccd1</code></a>
Clean changelog_unreleased</li>
<li>See full diff in <a
href="https://github.com/prettier/prettier/compare/3.9.1...3.9.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=prettier&package-manager=npm_and_yarn&previous-version=3.9.1&new-version=3.9.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 16:31:16 +02:00
dependabot[bot]
64aa130c66 feat(deps): bump fast-uri from 3.1.2 to 3.1.3 (#822)
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.2 to
3.1.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/fastify/fast-uri/releases">fast-uri's
releases</a>.</em></p>
<blockquote>
<h2>v3.1.3</h2>
<h2>⚠️ Security Release</h2>
<ul>
<li>Fixes: <a
href="https://github.com/fastify/fast-uri/security/advisories/GHSA-4c8g-83qw-93j6">https://github.com/fastify/fast-uri/security/advisories/GHSA-4c8g-83qw-93j6</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/fastify/fast-uri/compare/v3.1.2...v3.1.3">https://github.com/fastify/fast-uri/compare/v3.1.2...v3.1.3</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0549fe35b0"><code>0549fe3</code></a>
Bumped v3.1.3</li>
<li><a
href="2a6d357a18"><code>2a6d357</code></a>
Merge commit from fork</li>
<li>See full diff in <a
href="https://github.com/fastify/fast-uri/compare/v3.1.2...v3.1.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fast-uri&package-manager=npm_and_yarn&previous-version=3.1.2&new-version=3.1.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 16:30:53 +02:00
acp-release-bot[bot]
47fee47709 chore(main): release 0.53.0 (#817)
🤖 I have created a release *beep* *boop*
---


##
[0.53.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.52.0...v0.53.0)
(2026-06-29)


### Features

* Add ACP logout support
([#816](https://github.com/agentclientprotocol/claude-agent-acp/issues/816))
([0a0468c](0a0468c720))
* **deps:** bump @anthropic-ai/claude-agent-sdk to 0.3.195
([#818](https://github.com/agentclientprotocol/claude-agent-acp/issues/818))
([5dd8746](5dd8746237))


### Bug Fixes

* Emit tool_call before permission request
([#820](https://github.com/agentclientprotocol/claude-agent-acp/issues/820))
([c95fc88](c95fc884e8))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-06-29 13:49:41 +00:00
Ben Brandt
c95fc884e8 fix: Emit tool_call before permission request (#820)
The Claude Agent SDK changed the timing of `canUseTool` — it now runs
*before* the assistant message's `tool_use` block streams to us. As a
result we sent a permission request (and `AskUserQuestion` elicitation)
referencing a `toolCallId` the client had not yet seen via a `tool_call`
update, so clients couldn't associate the prompt with a tool call.

This supersedes #815, which fixed the ordering by blocking `canUseTool`
until the stream emitted the `tool_call`. That approach could deadlock
on cancellation (the `await` had no signal/timeout) and woke the waiter
from only one branch, so suppressed tools never resolved it.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 15:48:22 +02:00
dependabot[bot]
5dd8746237 feat(deps): bump @anthropic-ai/claude-agent-sdk to 0.3.195 (#818)
Bumps the minor group with 11 updates:

| Package | From | To |
| --- | --- | --- |
|
[@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript)
| `0.3.191` | `0.3.193` |
| [prettier](https://github.com/prettier/prettier) | `3.8.4` | `3.8.5` |
| @anthropic-ai/claude-agent-sdk-darwin-arm64 | `0.3.191` | `0.3.193` |
| @anthropic-ai/claude-agent-sdk-darwin-x64 | `0.3.191` | `0.3.193` |
| @anthropic-ai/claude-agent-sdk-linux-arm64 | `0.3.191` | `0.3.193` |
| @anthropic-ai/claude-agent-sdk-linux-arm64-musl | `0.3.191` |
`0.3.193` |
| @anthropic-ai/claude-agent-sdk-linux-x64 | `0.3.191` | `0.3.193` |
| @anthropic-ai/claude-agent-sdk-linux-x64-musl | `0.3.191` | `0.3.193`
|
| @anthropic-ai/claude-agent-sdk-win32-arm64 | `0.3.191` | `0.3.193` |
| @anthropic-ai/claude-agent-sdk-win32-x64 | `0.3.191` | `0.3.193` |
| [range-parser](https://github.com/jshttp/range-parser) | `1.2.1` |
`1.3.0` |

Updates `@anthropic-ai/claude-agent-sdk` from 0.3.191 to 0.3.193
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/releases">@​anthropic-ai/claude-agent-sdk's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.193</h2>
<h2>What's changed</h2>
<ul>
<li>Added <code>promptSuggestions</code> option to Browser SDK
<code>query()</code> to opt the remote CLI into emitting follow-up
suggestions</li>
<li>Fixed brief console window flashes on Windows when spawning CLI
subprocesses</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.193
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.193
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.193
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.193
</code></pre>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/claude-agent-sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.193</h2>
<ul>
<li>Added <code>promptSuggestions</code> option to Browser SDK
<code>query()</code> to opt the remote CLI into emitting follow-up
suggestions</li>
<li>Fixed brief console window flashes on Windows when spawning CLI
subprocesses</li>
</ul>
<h2>0.3.192</h2>
<ul>
<li>Updated to parity with Claude Code v2.1.192</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="761e2bec6f"><code>761e2be</code></a>
chore: Update CHANGELOG.md</li>
<li>See full diff in <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/compare/v0.3.191...v0.3.193">compare
view</a></li>
</ul>
</details>
<br />

Updates `prettier` from 3.8.4 to 3.8.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/prettier/prettier/releases">prettier's
releases</a>.</em></p>
<blockquote>
<h2>3.8.5</h2>
<ul>
<li>Fix Flow variance annotation print (<a
href="https://redirect.github.com/prettier/prettier/pull/19022">#19022</a>
by <a
href="https://github.com/marcoww6"><code>@​marcoww6</code></a>)</li>
</ul>
<p>🔗 <a
href="https://github.com/prettier/prettier/blob/3.8.5/CHANGELOG.md#385">Changelog</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/prettier/prettier/blob/main/CHANGELOG.md">prettier's
changelog</a>.</em></p>
<blockquote>
<h1>3.8.5</h1>
<p><a
href="https://github.com/prettier/prettier/compare/3.8.4...3.8.5">diff</a></p>
<h4>Flow: Support <code>readonly</code> as a variance annotation (<a
href="https://redirect.github.com/prettier/prettier/pull/19022">#19022</a>
by <a
href="https://github.com/marcoww6"><code>@​marcoww6</code></a>)</h4>
<p>Flow now accepts <code>readonly</code> as a property variance
annotation, equivalent to <code>+</code> (covariant/read-only).</p>
<!-- raw HTML omitted -->
<pre lang="jsx"><code>// Input
type T = {
  readonly foo: string,
};
<p>// Prettier 3.8.4<br />
SyntaxError</p>
<p>// Prettier 3.8.5<br />
type T = {<br />
readonly foo: string,<br />
};<br />
</code></pre></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1ce8c47015"><code>1ce8c47</code></a>
Release 3.8.5</li>
<li><a
href="74923fa831"><code>74923fa</code></a>
Fix variance annotation</li>
<li><a
href="8b4eb339d4"><code>8b4eb33</code></a>
Bump Prettier dependency to 3.8.4</li>
<li><a
href="e9cbdfa1b7"><code>e9cbdfa</code></a>
Clean changelog_unreleased</li>
<li>See full diff in <a
href="https://github.com/prettier/prettier/compare/3.8.4...3.8.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.191 to
0.3.193

Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.191 to
0.3.193

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.191 to
0.3.193

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.191
to 0.3.193

Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.191 to
0.3.193

Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.191 to
0.3.193

Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.191 to
0.3.193

Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.191 to
0.3.193

Updates `range-parser` from 1.2.1 to 1.3.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/jshttp/range-parser/releases">range-parser's
releases</a>.</em></p>
<blockquote>
<h2>v1.3.0</h2>
<p><strong>Fixed</strong></p>
<ul>
<li>Improve number parsing (<a
href="https://redirect.github.com/jshttp/range-parser/issues/58">#58</a>)
eba9c7a</li>
<li>Handle invalid start and end byte positions in range parsing (<a
href="https://redirect.github.com/jshttp/range-parser/issues/57">#57</a>)
269cb4e</li>
</ul>
<hr />
<p><a
href="https://github.com/jshttp/range-parser/compare/v1.2.1...v1.3.0">https://github.com/jshttp/range-parser/compare/v1.2.1...v1.3.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f4bf1736f2"><code>f4bf173</code></a>
Clamp a suffix whose length exceeds the representation (<a
href="https://redirect.github.com/jshttp/range-parser/issues/66">#66</a>)</li>
<li><a
href="b49e00f6d3"><code>b49e00f</code></a>
fix: still show ranges if there are multiple ranges, even if some are
invalid...</li>
<li><a
href="4f3b09123c"><code>4f3b091</code></a>
Remove dependabot config (<a
href="https://redirect.github.com/jshttp/range-parser/issues/60">#60</a>)</li>
<li><a
href="eba9c7a9cb"><code>eba9c7a</code></a>
Improve number parsing (<a
href="https://redirect.github.com/jshttp/range-parser/issues/58">#58</a>)</li>
<li><a
href="269cb4eafa"><code>269cb4e</code></a>
fix: handle invalid start and end byte positions in range parsing (<a
href="https://redirect.github.com/jshttp/range-parser/issues/57">#57</a>)</li>
<li><a
href="098e332bfc"><code>098e332</code></a>
build(deps): bump github/codeql-action from 3.31.2 to 4.31.6 (<a
href="https://redirect.github.com/jshttp/range-parser/issues/50">#50</a>)</li>
<li><a
href="3599369124"><code>3599369</code></a>
build(deps): bump actions/checkout from 3.6.0 to 6.0.0 (<a
href="https://redirect.github.com/jshttp/range-parser/issues/51">#51</a>)</li>
<li><a
href="054ea57071"><code>054ea57</code></a>
build(deps): bump github/codeql-action from 2.23.2 to 4.31.2 (<a
href="https://redirect.github.com/jshttp/range-parser/issues/48">#48</a>)</li>
<li><a
href="d230b16695"><code>d230b16</code></a>
build(deps): bump actions/upload-artifact from 3.1.3 to 5.0.0 (<a
href="https://redirect.github.com/jshttp/range-parser/issues/49">#49</a>)</li>
<li><a
href="54f84f423b"><code>54f84f4</code></a>
chore: add funding to package.json (<a
href="https://redirect.github.com/jshttp/range-parser/issues/42">#42</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/jshttp/range-parser/compare/v1.2.1...v1.3.0">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~blakeembrey">blakeembrey</a>, a new
releaser for range-parser since your current version.</p>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
2026-06-29 10:21:47 +00:00
Ben Brandt
0a0468c720 feat: Add ACP logout support (#816) 2026-06-25 21:42:58 +00:00
acp-release-bot[bot]
e9163f8553 chore(main): release 0.52.0 (#811)
🤖 I have created a release *beep* *boop*
---


##
[0.52.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.51.0...v0.52.0)
(2026-06-25)


### Features

* Add version flag handling
([#813](https://github.com/agentclientprotocol/claude-agent-acp/issues/813))
([9616bda](9616bdac47)),
closes
[#809](https://github.com/agentclientprotocol/claude-agent-acp/issues/809)
* **deps-dev:** bump expect-type from 1.3.0 to 1.4.0 in the minor group
([#814](https://github.com/agentclientprotocol/claude-agent-acp/issues/814))
([61272ac](61272acb30))
* **deps:** Update @anthropic-ai/claude-agent-sdk to 0.3.191
([#810](https://github.com/agentclientprotocol/claude-agent-acp/issues/810))
([228f02e](228f02ecfb))
* Push session title updates at turn end
([#812](https://github.com/agentclientprotocol/claude-agent-acp/issues/812))
([1fe7ec0](1fe7ec09a3))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-06-25 17:11:07 +02:00
dependabot[bot]
61272acb30 feat(deps-dev): bump expect-type from 1.3.0 to 1.4.0 in the minor group (#814)
Bumps the minor group with 1 update:
[expect-type](https://github.com/mmkal/expect-type).

Updates `expect-type` from 1.3.0 to 1.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/mmkal/expect-type/releases">expect-type's
releases</a>.</em></p>
<blockquote>
<h2>v1.4.0</h2>
<h2>What's Changed</h2>
<ul>
<li>test: lock non-callable thisParameter fallback by <a
href="https://github.com/mmkal"><code>@​mmkal</code></a> in <a
href="https://redirect.github.com/mmkal/expect-type/pull/214">mmkal/expect-type#214</a></li>
<li>feat: support overloads in <code>thisParameter</code> by <a
href="https://github.com/aryaemami59"><code>@​aryaemami59</code></a> in
<a
href="https://redirect.github.com/mmkal/expect-type/pull/204">mmkal/expect-type#204</a></li>
<li>feat: <code>.branded.inspect</code> to view deep prop types by <a
href="https://github.com/mmkal"><code>@​mmkal</code></a> in <a
href="https://redirect.github.com/mmkal/expect-type/pull/113">mmkal/expect-type#113</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/mmkal/expect-type/compare/v1.3.0...v1.4.0">https://github.com/mmkal/expect-type/compare/v1.3.0...v1.4.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="48743118a1"><code>4874311</code></a>
1.4.0</li>
<li><a
href="27b0e579fd"><code>27b0e57</code></a>
idea: <code>.branded.inspect</code> to view deep prop types (<a
href="https://redirect.github.com/mmkal/expect-type/issues/113">#113</a>)</li>
<li><a
href="2794969582"><code>2794969</code></a>
renovate: update 🌲 (<a
href="https://redirect.github.com/mmkal/expect-type/issues/215">#215</a>)</li>
<li><a
href="29130cdef2"><code>29130cd</code></a>
feat: support overloads in <code>thisParameter</code> (<a
href="https://redirect.github.com/mmkal/expect-type/issues/204">#204</a>)</li>
<li><a
href="658ea8784a"><code>658ea87</code></a>
test: lock non-callable thisParameter fallback (<a
href="https://redirect.github.com/mmkal/expect-type/issues/214">#214</a>)</li>
<li><a
href="22eb69e931"><code>22eb69e</code></a>
renovate: update 🌲 (<a
href="https://redirect.github.com/mmkal/expect-type/issues/212">#212</a>)</li>
<li><a
href="f6ec417af1"><code>f6ec417</code></a>
chore: gate Renovate dependency PRs (<a
href="https://redirect.github.com/mmkal/expect-type/issues/213">#213</a>)</li>
<li><a
href="25403eb822"><code>25403eb</code></a>
renovate: update np, <code>@​types/node</code> and 12 more 🌲 (<a
href="https://redirect.github.com/mmkal/expect-type/issues/133">#133</a>)</li>
<li><a
href="459a1e116b"><code>459a1e1</code></a>
Update <code>@typescript/native-preview</code> as it's stable enough (<a
href="https://redirect.github.com/mmkal/expect-type/issues/186">#186</a>)</li>
<li><a
href="c84e6164c1"><code>c84e616</code></a>
Update pnpm to <code>10.25.0</code> (<a
href="https://redirect.github.com/mmkal/expect-type/issues/187">#187</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/mmkal/expect-type/compare/v1.3.0...v1.4.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=expect-type&package-manager=npm_and_yarn&previous-version=1.3.0&new-version=1.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-25 17:08:42 +02:00
Ben Brandt
9616bdac47 feat: Add version flag handling (#813)
Closes #809
2026-06-25 12:37:02 +00:00
Ben Brandt
1fe7ec09a3 feat: Push session title updates at turn end (#812) 2026-06-25 11:45:50 +00:00
Ben Brandt
228f02ecfb feat(deps): Update @anthropic-ai/claude-agent-sdk to 0.3.191 (#810) 2026-06-25 13:42:57 +02:00
acp-release-bot[bot]
23626c9a43 chore(main): release 0.51.0 (#808)
🤖 I have created a release *beep* *boop*
---


##
[0.51.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.50.0...v0.51.0)
(2026-06-24)


### Features

* **deps:** bump the minor group with 11 updates
([#807](https://github.com/agentclientprotocol/claude-agent-acp/issues/807))
([8f6ebd1](8f6ebd1d91))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-06-24 17:13:16 +02:00
dependabot[bot]
8f6ebd1d91 feat(deps): bump the minor group with 11 updates (#807)
Bumps the minor group with 11 updates:

| Package | From | To |
| --- | --- | --- |
|
[@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript)
| `0.3.186` | `0.3.187` |
| @anthropic-ai/claude-agent-sdk-darwin-arm64 | `0.3.186` | `0.3.187` |
| @anthropic-ai/claude-agent-sdk-darwin-x64 | `0.3.186` | `0.3.187` |
| @anthropic-ai/claude-agent-sdk-linux-arm64 | `0.3.186` | `0.3.187` |
| @anthropic-ai/claude-agent-sdk-linux-arm64-musl | `0.3.186` |
`0.3.187` |
| @anthropic-ai/claude-agent-sdk-linux-x64 | `0.3.186` | `0.3.187` |
| @anthropic-ai/claude-agent-sdk-linux-x64-musl | `0.3.186` | `0.3.187`
|
| @anthropic-ai/claude-agent-sdk-win32-arm64 | `0.3.186` | `0.3.187` |
| @anthropic-ai/claude-agent-sdk-win32-x64 | `0.3.186` | `0.3.187` |
|
[@napi-rs/wasm-runtime](https://github.com/napi-rs/napi-rs/tree/HEAD/wasm-runtime)
| `1.1.5` | `1.1.6` |
|
[rolldown](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown)
| `1.1.2` | `1.1.3` |

Updates `@anthropic-ai/claude-agent-sdk` from 0.3.186 to 0.3.187
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/releases">@​anthropic-ai/claude-agent-sdk's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.187</h2>
<h2>What's changed</h2>
<ul>
<li>Added <code>sandbox.credentials</code> to SDK settings types for
configuring credential file and environment variable denial in sandboxed
commands</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.187
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.187
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.187
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.187
</code></pre>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/claude-agent-sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.187</h2>
<ul>
<li>Added <code>sandbox.credentials</code> to SDK settings types for
configuring credential file and environment variable denial in sandboxed
commands</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4279d963e4"><code>4279d96</code></a>
chore: Update CHANGELOG.md</li>
<li>See full diff in <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/compare/v0.3.186...v0.3.187">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.186 to
0.3.187

Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.186 to
0.3.187

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.186 to
0.3.187

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.186
to 0.3.187

Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.186 to
0.3.187

Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.186 to
0.3.187

Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.186 to
0.3.187

Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.186 to
0.3.187

Updates `@napi-rs/wasm-runtime` from 1.1.5 to 1.1.6
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/napi-rs/napi-rs/blob/main/wasm-runtime/CHANGELOG.md">@​napi-rs/wasm-runtime's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/napi-rs/napi-rs/compare/@napi-rs/wasm-runtime@1.1.5...@napi-rs/wasm-runtime@1.1.6">1.1.6</a>
(2026-06-24)</h2>
<p><strong>Note:</strong> Version bump only for package
<code>@​napi-rs/wasm-runtime</code></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b77119e711"><code>b77119e</code></a>
chore(release): publish</li>
<li><a
href="8c87f474c8"><code>8c87f47</code></a>
chore(deps): update <code>@​tybys/wasm-util</code> to 0.10.3 (<a
href="https://github.com/napi-rs/napi-rs/tree/HEAD/wasm-runtime/issues/3348">#3348</a>)</li>
<li>See full diff in <a
href="https://github.com/napi-rs/napi-rs/commits/@napi-rs/wasm-runtime@1.1.6/wasm-runtime">compare
view</a></li>
</ul>
</details>
<br />

Updates `rolldown` from 1.1.2 to 1.1.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rolldown/rolldown/releases">rolldown's
releases</a>.</em></p>
<blockquote>
<h2>v1.1.3</h2>
<h2>[1.1.3] - 2026-06-24</h2>
<h3>🐛 Bug Fixes</h3>
<ul>
<li><code>defer_drop</code> crashes the browser main thread (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9942">#9942</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>camel-case: correct camel case for nested values (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9933">#9933</a>)
by <a href="https://github.com/kb019"><code>@​kb019</code></a></li>
<li>cli: display --help options in camelCase (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9941">#9941</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>preserve used re-exports under preserveModules (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9122">#9122</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9934">#9934</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>watch: make close reentrant in event callbacks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9904">#9904</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>git for windows treats symlink files as regular files (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9915">#9915</a>)
by <a
href="https://github.com/AliceLanniste"><code>@​AliceLanniste</code></a></li>
<li>dev: cancel pending full reload on build error (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9903">#9903</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>chunking: pass plugin meta to codeSplitting groups name function (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9267">#9267</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
<li>dev: serve assets emitted during HMR/lazy compile (vite#22596) (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9815">#9815</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>release: dry-run step no longer publishes binding packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9866">#9866</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>rolldown_common: model ModuleId as a classified Path/Virtual/Bare
enum (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9927">#9927</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>remove unused LegacyModuleIdx (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9872">#9872</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>remove unused StmtInfos::get_namespace_stmt_info (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9870">#9870</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>remove unused Module::as_external_mut (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9871">#9871</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>remove unused EcmaAst::is_body_empty (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9869">#9869</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>drop dead is_css_module handling in resolve_dependencies (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9867">#9867</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>drop redundant with_commonjs on cjs source type (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9868">#9868</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>clarify on drafting PRs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9952">#9952</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>update contribution guidelines (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9944">#9944</a>)
by <a href="https://github.com/fubhy"><code>@​fubhy</code></a></li>
<li>note Rust crates don't follow semver in AGENTS.md (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9905">#9905</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>add feedback form (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9159">#9159</a>)
by <a
href="https://github.com/TheAlexLichter"><code>@​TheAlexLichter</code></a></li>
</ul>
<h3>⚡ Performance</h3>
<ul>
<li>utils: avoid allocation in default_sanitize_file_name for clean
names (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9928">#9928</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>binding: box once-per-build futures before spawn_future (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9864">#9864</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>utils: avoid wasted allocation in legitimize_identifier_name (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9926">#9926</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>rolldown: fuse the canonical-name dedup and insert in the renamer
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9900">#9900</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>rolldown: probe the name map once in ConflictResolver::resolve (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9899">#9899</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>cut two heap allocations from wrapped ESM init finalize (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9901">#9901</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>rolldown_plugin_vite_reporter: hoist invariant out_dir prefix out of
reporter loop (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9873">#9873</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>drop throwaway Vec in wrapped esm init stmt (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9878">#9878</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>borrow owner_filename in build-import-analysis AddDeps (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9874">#9874</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>🧪 Testing</h3>
<ul>
<li>cover preserveModules named export via namespace re-export (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/6010">#6010</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9937">#9937</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
</ul>
<h3>⚙️ Miscellaneous Tasks</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rolldown/rolldown/blob/main/CHANGELOG.md">rolldown's
changelog</a>.</em></p>
<blockquote>
<h2>[1.1.3] - 2026-06-24</h2>
<h3>🐛 Bug Fixes</h3>
<ul>
<li><code>defer_drop</code> crashes the browser main thread (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9942">#9942</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>camel-case: correct camel case for nested values (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9933">#9933</a>)
by <a href="https://github.com/kb019"><code>@​kb019</code></a></li>
<li>cli: display --help options in camelCase (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9941">#9941</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>preserve used re-exports under preserveModules (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9122">#9122</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9934">#9934</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>watch: make close reentrant in event callbacks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9904">#9904</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>git for windows treats symlink files as regular files (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9915">#9915</a>)
by <a
href="https://github.com/AliceLanniste"><code>@​AliceLanniste</code></a></li>
<li>dev: cancel pending full reload on build error (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9903">#9903</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>chunking: pass plugin meta to codeSplitting groups name function (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9267">#9267</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
<li>dev: serve assets emitted during HMR/lazy compile (vite#22596) (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9815">#9815</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>release: dry-run step no longer publishes binding packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9866">#9866</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>rolldown_common: model ModuleId as a classified Path/Virtual/Bare
enum (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9927">#9927</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>remove unused LegacyModuleIdx (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9872">#9872</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>remove unused StmtInfos::get_namespace_stmt_info (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9870">#9870</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>remove unused Module::as_external_mut (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9871">#9871</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>remove unused EcmaAst::is_body_empty (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9869">#9869</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>drop dead is_css_module handling in resolve_dependencies (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9867">#9867</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>drop redundant with_commonjs on cjs source type (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9868">#9868</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>clarify on drafting PRs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9952">#9952</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>update contribution guidelines (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9944">#9944</a>)
by <a href="https://github.com/fubhy"><code>@​fubhy</code></a></li>
<li>note Rust crates don't follow semver in AGENTS.md (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9905">#9905</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>add feedback form (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9159">#9159</a>)
by <a
href="https://github.com/TheAlexLichter"><code>@​TheAlexLichter</code></a></li>
</ul>
<h3>⚡ Performance</h3>
<ul>
<li>utils: avoid allocation in default_sanitize_file_name for clean
names (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9928">#9928</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>binding: box once-per-build futures before spawn_future (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9864">#9864</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>utils: avoid wasted allocation in legitimize_identifier_name (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9926">#9926</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>rolldown: fuse the canonical-name dedup and insert in the renamer
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9900">#9900</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>rolldown: probe the name map once in ConflictResolver::resolve (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9899">#9899</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>cut two heap allocations from wrapped ESM init finalize (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9901">#9901</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>rolldown_plugin_vite_reporter: hoist invariant out_dir prefix out of
reporter loop (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9873">#9873</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>drop throwaway Vec in wrapped esm init stmt (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9878">#9878</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>borrow owner_filename in build-import-analysis AddDeps (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9874">#9874</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>🧪 Testing</h3>
<ul>
<li>cover preserveModules named export via namespace re-export (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/6010">#6010</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9937">#9937</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
</ul>
<h3>⚙️ Miscellaneous Tasks</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e77f7c792d"><code>e77f7c7</code></a>
release: v1.1.3 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9958">#9958</a>)</li>
<li><a
href="3fb231091e"><code>3fb2310</code></a>
fix(camel-case): correct camel case for nested values (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9933">#9933</a>)</li>
<li><a
href="2f66847d81"><code>2f66847</code></a>
fix(cli): display --help options in camelCase (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9941">#9941</a>)</li>
<li><a
href="9f960eb752"><code>9f960eb</code></a>
fix(watch): make close reentrant in event callbacks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9904">#9904</a>)</li>
<li><a
href="8cbf3ff554"><code>8cbf3ff</code></a>
chore(rolldown_plugin_vite_build_import_analysis): remove unused v2 code
path...</li>
<li><a
href="828bfefe36"><code>828bfef</code></a>
fix: git for windows treats symlink files as regular files (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9915">#9915</a>)</li>
<li><a
href="4ca8e87d43"><code>4ca8e87</code></a>
chore(rolldown_plugin_vite_manifest): remove unused is_enable_v2 code
path (#...</li>
<li><a
href="632c59e6b5"><code>632c59e</code></a>
fix(chunking): pass plugin meta to codeSplitting groups name function
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9267">#9267</a>)</li>
<li><a
href="752820dc2b"><code>752820d</code></a>
fix(dev): serve assets emitted during HMR/lazy compile (vite#22596) (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9815">#9815</a>)</li>
<li><a
href="dfe43a6452"><code>dfe43a6</code></a>
fix(release): dry-run step no longer publishes binding packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9866">#9866</a>)</li>
<li>See full diff in <a
href="https://github.com/rolldown/rolldown/commits/v1.1.3/packages/rolldown">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-24 17:09:58 +02:00
acp-release-bot[bot]
07911601cc chore(main): release 0.50.0 (#802)
🤖 I have created a release *beep* *boop*
---


##
[0.50.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.49.0...v0.50.0)
(2026-06-23)


### Features

* **acp:** Handle ACP request cancellation signals
([#801](https://github.com/agentclientprotocol/claude-agent-acp/issues/801))
([9013d1d](9013d1d468))
* **deps:** bump actions/checkout from 6.0.3 to 7.0.0
([#803](https://github.com/agentclientprotocol/claude-agent-acp/issues/803))
([044c43e](044c43e0c8))
* **deps:** upgrade to @anthropic-ai/claude-agent-sdk@0.3.186
([#806](https://github.com/agentclientprotocol/claude-agent-acp/issues/806))
([a7e6137](a7e6137f68))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-06-23 17:45:20 +02:00
dependabot[bot]
a7e6137f68 feat(deps): upgrade to @anthropic-ai/claude-agent-sdk@0.3.186 (#806)
Bumps the minor group with 23 updates:

| Package | From | To |
| --- | --- | --- |
|
[@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript)
| `0.3.185` | `0.3.186` |
|
[@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin)
| `8.61.1` | `8.62.0` |
|
[@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)
| `8.61.1` | `8.62.0` |
| [globals](https://github.com/sindresorhus/globals) | `17.6.0` |
`17.7.0` |
| @anthropic-ai/claude-agent-sdk-darwin-arm64 | `0.3.185` | `0.3.186` |
| @anthropic-ai/claude-agent-sdk-darwin-x64 | `0.3.185` | `0.3.186` |
| @anthropic-ai/claude-agent-sdk-linux-arm64 | `0.3.185` | `0.3.186` |
| @anthropic-ai/claude-agent-sdk-linux-arm64-musl | `0.3.185` |
`0.3.186` |
| @anthropic-ai/claude-agent-sdk-linux-x64 | `0.3.185` | `0.3.186` |
| @anthropic-ai/claude-agent-sdk-linux-x64-musl | `0.3.185` | `0.3.186`
|
| @anthropic-ai/claude-agent-sdk-win32-arm64 | `0.3.185` | `0.3.186` |
| @anthropic-ai/claude-agent-sdk-win32-x64 | `0.3.185` | `0.3.186` |
| [@tybys/wasm-util](https://github.com/toyobayashi/wasm-util) |
`0.10.2` | `0.10.3` |
|
[@typescript-eslint/project-service](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/project-service)
| `8.61.1` | `8.62.0` |
|
[@typescript-eslint/scope-manager](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/scope-manager)
| `8.61.1` | `8.62.0` |
|
[@typescript-eslint/tsconfig-utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/tsconfig-utils)
| `8.61.1` | `8.62.0` |
|
[@typescript-eslint/type-utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/type-utils)
| `8.61.1` | `8.62.0` |
|
[@typescript-eslint/types](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/types)
| `8.61.1` | `8.62.0` |
|
[@typescript-eslint/typescript-estree](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-estree)
| `8.61.1` | `8.62.0` |
|
[@typescript-eslint/utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils)
| `8.61.1` | `8.62.0` |
|
[@typescript-eslint/visitor-keys](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys)
| `8.61.1` | `8.62.0` |
| [hono](https://github.com/honojs/hono) | `4.12.26` | `4.12.27` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) |
`8.0.16` | `8.1.0` |

Updates `@anthropic-ai/claude-agent-sdk` from 0.3.185 to 0.3.186
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/releases">@​anthropic-ai/claude-agent-sdk's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.186</h2>
<h2>What's changed</h2>
<ul>
<li>Added <code>agent_id</code> field to <code>can_use_tool</code>
control requests — background agents now forward permission prompts to
<code>canUseTool</code> instead of auto-denying, and stdin stays open
while background tasks are running</li>
<li>Added <code>ReadMcpResourceDirTool</code> tool type to SDK schemas —
MCP resource directory listing is now a dedicated tool instead of a
fallback inside <code>ReadMcpResourceTool</code></li>
<li>Added <code>rewind_conversation</code> control request for rewinding
a conversation to a previous point with durable resume anchor
support</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.186
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.186
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.186
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.186
</code></pre>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/claude-agent-sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.186</h2>
<ul>
<li>Added <code>agent_id</code> field to <code>can_use_tool</code>
control requests — background agents now forward permission prompts to
<code>canUseTool</code> instead of auto-denying, and stdin stays open
while background tasks are running</li>
<li>Added <code>ReadMcpResourceDirTool</code> tool type to SDK schemas —
MCP resource directory listing is now a dedicated tool instead of a
fallback inside <code>ReadMcpResourceTool</code></li>
<li>Added <code>rewind_conversation</code> control request for rewinding
a conversation to a previous point with durable resume anchor
support</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="42f6772cba"><code>42f6772</code></a>
chore: Update CHANGELOG.md</li>
<li>See full diff in <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/compare/v0.3.185...v0.3.186">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/eslint-plugin` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/eslint-plugin's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md">@​typescript-eslint/eslint-plugin's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/12444">#12444</a>)</li>
<li><a
href="b784054b6f"><code>b784054</code></a>
chore: use <code>stableTypeOrdering</code> compiler option (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/12427">#12427</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/eslint-plugin">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/parser` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/parser's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md">@​typescript-eslint/parser's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser/issues/12444">#12444</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/parser">compare
view</a></li>
</ul>
</details>
<br />

Updates `globals` from 17.6.0 to 17.7.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/sindresorhus/globals/releases">globals's
releases</a>.</em></p>
<blockquote>
<h2>v17.7.0</h2>
<ul>
<li>Update globals (2026-06-22) (<a
href="https://redirect.github.com/sindresorhus/globals/issues/345">#345</a>)
33b75f9</li>
</ul>
<hr />
<p><a
href="https://github.com/sindresorhus/globals/compare/v17.6.0...v17.7.0">https://github.com/sindresorhus/globals/compare/v17.6.0...v17.7.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a19670cc86"><code>a19670c</code></a>
17.7.0</li>
<li><a
href="9611620bad"><code>9611620</code></a>
Update actions (<a
href="https://redirect.github.com/sindresorhus/globals/issues/346">#346</a>)</li>
<li><a
href="33b75f9dde"><code>33b75f9</code></a>
Update globals (2026-06-22) (<a
href="https://redirect.github.com/sindresorhus/globals/issues/345">#345</a>)</li>
<li><a
href="887dd529bd"><code>887dd52</code></a>
Fix build script (<a
href="https://redirect.github.com/sindresorhus/globals/issues/344">#344</a>)</li>
<li>See full diff in <a
href="https://github.com/sindresorhus/globals/compare/v17.6.0...v17.7.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.185 to
0.3.186

Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.185 to
0.3.186

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.185 to
0.3.186

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.185
to 0.3.186

Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.185 to
0.3.186

Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.185 to
0.3.186

Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.185 to
0.3.186

Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.185 to
0.3.186

Updates `@tybys/wasm-util` from 0.10.2 to 0.10.3
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/toyobayashi/wasm-util/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/project-service` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/project-service's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/project-service/CHANGELOG.md">@​typescript-eslint/project-service's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/project-service/issues/12444">#12444</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/project-service">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/scope-manager` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/scope-manager's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/scope-manager/CHANGELOG.md">@​typescript-eslint/scope-manager's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/scope-manager/issues/12444">#12444</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/scope-manager">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/tsconfig-utils` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/tsconfig-utils's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/tsconfig-utils/CHANGELOG.md">@​typescript-eslint/tsconfig-utils's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/tsconfig-utils/issues/12444">#12444</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/tsconfig-utils">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/type-utils` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/type-utils's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/type-utils/CHANGELOG.md">@​typescript-eslint/type-utils's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/type-utils/issues/12444">#12444</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/type-utils">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/types` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/types's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/types/CHANGELOG.md">@​typescript-eslint/types's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/types/issues/12444">#12444</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/types">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/typescript-estree` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/typescript-estree's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-estree/CHANGELOG.md">@​typescript-eslint/typescript-estree's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-estree/issues/12444">#12444</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/typescript-estree">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/utils` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/utils's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/utils/CHANGELOG.md">@​typescript-eslint/utils's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils/issues/12444">#12444</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/utils">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/visitor-keys` from 8.61.1 to 8.62.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/visitor-keys's
releases</a>.</em></p>
<blockquote>
<h2>v8.62.0</h2>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>add &quot;files&quot; to rule-schema-to-typescript-types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/visitor-keys/CHANGELOG.md">@​typescript-eslint/visitor-keys's
changelog</a>.</em></p>
<blockquote>
<h2>8.62.0 (2026-06-22)</h2>
<h3>🚀 Features</h3>
<ul>
<li>remove redundant package.json &quot;files&quot; (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54e285728e"><code>54e2857</code></a>
chore(release): publish 8.62.0</li>
<li><a
href="81e4c2654c"><code>81e4c26</code></a>
feat: remove redundant package.json &quot;files&quot; (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys/issues/12444">#12444</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/visitor-keys">compare
view</a></li>
</ul>
</details>
<br />

Updates `hono` from 4.12.26 to 4.12.27
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/hono/releases">hono's
releases</a>.</em></p>
<blockquote>
<h2>v4.12.27</h2>
<h2>Security fixes</h2>
<p>This release includes fixes for the following security issues:</p>
<h3>hono/jsx does not isolate context per request</h3>
<p>Affects: <code>hono/jsx</code>, <code>hono/jsx-renderer</code>.
During SSR, context was stored process-wide instead of per request, so
<code>useContext()</code>/<code>useRequestContext()</code> read after an
<code>await</code> in an async component could return another concurrent
request's value — leading to cross-request data disclosure or
authorization checks against the wrong request. GHSA-hvrm-45r6-mjfj</p>
<h3>Server-Side XSS via JSX escaping bypass in cx()</h3>
<p>Affects: <code>hono/css</code>. <code>cx()</code> marked its composed
class name as already-escaped without escaping the input, so untrusted
input passed as a class name could break out of the JSX
<code>class</code> attribute during SSR and inject markup (XSS).
GHSA-w62v-xxxg-mg59</p>
<h3>API Gateway v1 adapter can drop a repeated request header value</h3>
<p>Affects: <code>hono/aws-lambda</code>. The API Gateway v1 (and VPC
Lattice) adapter de-duplicated repeated header values by substring
instead of exact match, dropping a value that is a substring of another
(e.g. <code>203.0.113.1</code> dropped when <code>203.0.113.10</code> is
present) — affecting logic such as <code>X-Forwarded-For</code>-based IP
restriction. GHSA-xgm2-5f3f-mvvc</p>
<hr />
<p>Users of <code>hono/jsx</code>/<code>hono/jsx-renderer</code>,
<code>hono/css</code> (<code>cx()</code>), or the
<code>hono/aws-lambda</code> API Gateway v1 / VPC Lattice adapters are
encouraged to upgrade.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="97c6fe1f12"><code>97c6fe1</code></a>
4.12.27</li>
<li><a
href="aa921770d0"><code>aa92177</code></a>
Merge commit from fork</li>
<li><a
href="cd3f6f7194"><code>cd3f6f7</code></a>
Merge commit from fork</li>
<li><a
href="d4853a8f27"><code>d4853a8</code></a>
fix(jsx): make merged context-isolation tests pass tsc type check (<a
href="https://redirect.github.com/honojs/hono/issues/5037">#5037</a>)</li>
<li><a
href="6735fea78d"><code>6735fea</code></a>
fix(jsx): cast awaitedFallback through unknown to fix Deno type check
(<a
href="https://redirect.github.com/honojs/hono/issues/5036">#5036</a>)</li>
<li><a
href="fab3b13639"><code>fab3b13</code></a>
Merge commit from fork</li>
<li><a
href="9f0dadf141"><code>9f0dadf</code></a>
ci: use npm Staged publishing (<a
href="https://redirect.github.com/honojs/hono/issues/5035">#5035</a>)</li>
<li>See full diff in <a
href="https://github.com/honojs/hono/compare/v4.12.26...v4.12.27">compare
view</a></li>
</ul>
</details>
<br />

Updates `vite` from 8.0.16 to 8.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/releases">vite's
releases</a>.</em></p>
<blockquote>
<h2>create-vite@8.1.0</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/create-vite@8.1.0/packages/create-vite/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
<h2>plugin-legacy@8.1.0</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/plugin-legacy@8.1.0/packages/plugin-legacy/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
<h2>v8.1.0</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/v8.1.0/packages/vite/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
<h2>plugin-legacy@8.1.0-beta.0</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/plugin-legacy@8.1.0-beta.0/packages/plugin-legacy/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
<h2>v8.1.0-beta.0</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/v8.1.0-beta.0/packages/vite/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md">vite's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/vitejs/vite/compare/v8.1.0-beta.0...v8.1.0">8.1.0</a>
(2026-06-23)</h2>
<h3>Features</h3>
<ul>
<li>extend <code>server.fs.deny</code> list with common files (<a
href="https://redirect.github.com/vitejs/vite/issues/22707">#22707</a>)
(<a
href="61ba8fdc65">61ba8fd</a>)</li>
<li>update rolldown to 1.1.2 (<a
href="https://redirect.github.com/vitejs/vite/issues/22695">#22695</a>)
(<a
href="4f008a6213">4f008a6</a>)</li>
<li>use <code>~</code> for Rolldown (<a
href="https://redirect.github.com/vitejs/vite/issues/22693">#22693</a>)
(<a
href="9928722f7d">9928722</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>bundled-dev:</strong> errors should be kept when incremental
build fails (<a
href="https://redirect.github.com/vitejs/vite/issues/22617">#22617</a>)
(<a
href="9a0dd481ac">9a0dd48</a>)</li>
<li>cache falsy values in perEnvironmentState (<a
href="https://redirect.github.com/vitejs/vite/issues/22715">#22715</a>)
(<a
href="0e91e79841">0e91e79</a>)</li>
<li><strong>glob:</strong> respect caseSensitive option in hmr matcher
(<a
href="https://redirect.github.com/vitejs/vite/issues/22711">#22711</a>)
(<a
href="65f525e643">65f525e</a>)</li>
<li><strong>html:</strong> omit nonce on import map when cspNonce is
unset (<a
href="https://redirect.github.com/vitejs/vite/issues/22713">#22713</a>)
(<a
href="8340bb51ca">8340bb5</a>)</li>
<li><strong>optimizer:</strong> skip null-valued exports in
expandGlobIds glob resolution (<a
href="https://redirect.github.com/vitejs/vite/issues/22611">#22611</a>)
(<a
href="8b9f5cd9f1">8b9f5cd</a>)</li>
<li>resolved build options should be kept as a getter (<a
href="https://redirect.github.com/vitejs/vite/issues/22691">#22691</a>)
(<a
href="3527191cad">3527191</a>)</li>
<li><strong>server:</strong> handle malformed URI in memory files
middleware (<a
href="https://redirect.github.com/vitejs/vite/issues/22714">#22714</a>)
(<a
href="df9e0a589f">df9e0a5</a>)</li>
<li>use literal envPrefix queries for Vite Task (<a
href="https://redirect.github.com/vitejs/vite/issues/22706">#22706</a>)
(<a
href="da727337b1">da72733</a>)</li>
<li>warn on deprecated envFile (<a
href="https://redirect.github.com/vitejs/vite/issues/22555">#22555</a>)
(<a
href="ed7b28352e">ed7b283</a>)</li>
</ul>
<h3>Code Refactoring</h3>
<ul>
<li><strong>client:</strong> inline dev-id value in CSS selector (<a
href="https://redirect.github.com/vitejs/vite/issues/22736">#22736</a>)
(<a
href="57f59bc843">57f59bc</a>)</li>
<li>remove unused removeRawQuery util (<a
href="https://redirect.github.com/vitejs/vite/issues/22724">#22724</a>)
(<a
href="403cc608e4">403cc60</a>)</li>
<li>use <code>rolldownOptions</code> property for chunkImportMap (<a
href="https://redirect.github.com/vitejs/vite/issues/22692">#22692</a>)
(<a
href="8e8816ca9f">8e8816c</a>)</li>
</ul>
<h2><a
href="https://github.com/vitejs/vite/compare/v8.0.16...v8.1.0-beta.0">8.1.0-beta.0</a>
(2026-06-15)</h2>
<h3>Features</h3>
<ul>
<li><code>import.meta.glob</code> support <code>caseSensitive</code>
option (<a
href="https://redirect.github.com/vitejs/vite/issues/21707">#21707</a>)
(<a
href="2ad6737a83">2ad6737</a>)</li>
<li>add warning to discourage Vite with yarn pnp (<a
href="https://redirect.github.com/vitejs/vite/issues/21906">#21906</a>)
(<a
href="3fbb55add6">3fbb55a</a>)</li>
<li><strong>build:</strong> chunk importmap (<a
href="https://redirect.github.com/vitejs/vite/issues/21580">#21580</a>)
(<a
href="e1803128e5">e180312</a>)</li>
<li><strong>css:</strong> support lightningcss plugin dependency (<a
href="https://redirect.github.com/vitejs/vite/issues/21748">#21748</a>)
(<a
href="0b7aaedc98">0b7aaed</a>)</li>
<li><strong>deps:</strong> bump <code>@​vitejs/devtools</code> peer
dependency version (<a
href="https://redirect.github.com/vitejs/vite/issues/22542">#22542</a>)
(<a
href="d2c2bc090b">d2c2bc0</a>)</li>
<li><strong>html:</strong> add <code>html.additionalAssetSources</code>
option (<a
href="https://redirect.github.com/vitejs/vite/issues/21412">#21412</a>)
(<a
href="a41404b889">a41404b</a>)</li>
<li>integrate with Vite Task for zero-config build caching (<a
href="https://redirect.github.com/vitejs/vite/issues/22453">#22453</a>)
(<a
href="f8d75f7723">f8d75f7</a>)</li>
<li>rename <code>server.hmr</code> options to <code>server.ws</code>
options (<a
href="https://redirect.github.com/vitejs/vite/issues/21357">#21357</a>)
(<a
href="9ce3036d31">9ce3036</a>)</li>
<li><strong>server:</strong> support multiple hosts in
__VITE_ADDITIONAL_SERVER_ALLOWED_HOSTS (<a
href="https://redirect.github.com/vitejs/vite/issues/21501">#21501</a>)
(<a
href="735f9a19a9">735f9a1</a>)</li>
<li>track dependencies when loading config with native (<a
href="https://redirect.github.com/vitejs/vite/issues/22602">#22602</a>)
(<a
href="a7e2da8cdb">a7e2da8</a>)</li>
<li><strong>types:</strong> add more precise typing for known
<code>query</code> types to match known <code>as</code> types (<a
href="https://redirect.github.com/vitejs/vite/issues/21863">#21863</a>)
(<a
href="cc39e55401">cc39e55</a>)</li>
<li>update rolldown to 1.1.1 (<a
href="https://redirect.github.com/vitejs/vite/issues/22593">#22593</a>)
(<a
href="8a13d6337e">8a13d63</a>)</li>
<li><strong>wasm:</strong> direct .wasm imports (WASM ESM Integration)
(<a
href="https://redirect.github.com/vitejs/vite/issues/21779">#21779</a>)
(<a
href="c23d85b965">c23d85b</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>apply correct fs restrictions for pnpm gvs (<a
href="https://redirect.github.com/vitejs/vite/issues/22415">#22415</a>)
(<a
href="092320bfe1">092320b</a>)</li>
<li><strong>css:</strong> support external CSS with lightningcss (<a
href="https://redirect.github.com/vitejs/vite/issues/18389">#18389</a>)
(<a
href="d64a1a5557">d64a1a5</a>)</li>
<li><strong>deps:</strong> update all non-major dependencies (<a
href="https://redirect.github.com/vitejs/vite/issues/22637">#22637</a>)
(<a
href="44bb9d95a2">44bb9d9</a>)</li>
<li><strong>deps:</strong> update all non-major dependencies (<a
href="https://redirect.github.com/vitejs/vite/issues/22681">#22681</a>)
(<a
href="f4f063382d">f4f0633</a>)</li>
<li><strong>html:</strong> insert import map before modulepreload that
is not self-close tag (<a
href="https://redirect.github.com/vitejs/vite/issues/21409">#21409</a>)
(<a
href="e399c89a7d">e399c89</a>)</li>
<li><strong>optimizer:</strong> preserve sourcemaps for transformed
optimized deps with follow-up transforms (<a
href="https://redirect.github.com/vitejs/vite/issues/22428">#22428</a>)
(<a
href="1298951ebc">1298951</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5909efd8fb"><code>5909efd</code></a>
fix: allow multiple <code>bindCLIShortcuts</code> calls with shortcut
merging (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/21103">#21103</a>)</li>
<li><a
href="39a0a15fd2"><code>39a0a15</code></a>
chore(deps): update rolldown-related dependencies (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/21095">#21095</a>)</li>
<li><a
href="6a34ac3422"><code>6a34ac3</code></a>
fix(deps): update all non-major dependencies (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/21096">#21096</a>)</li>
<li><a
href="02ceaec45e"><code>02ceaec</code></a>
chore(deps): update dependency <code>@​rollup/plugin-commonjs</code> to
v29 (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/21099">#21099</a>)</li>
<li><a
href="572aaca459"><code>572aaca</code></a>
release: v7.2.2</li>
<li><a
href="728c8eeebc"><code>728c8ee</code></a>
fix: revert &quot;refactor: use fs.cpSync (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/21019">#21019</a>)&quot;
(<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/21081">#21081</a>)</li>
<li><a
href="a532e68c6b"><code>a532e68</code></a>
release: v7.2.1</li>
<li><a
href="82d2d6ccf5"><code>82d2d6c</code></a>
fix(worker): some worker asset was missing (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/21074">#21074</a>)</li>
<li><a
href="f83264f5d9"><code>f83264f</code></a>
refactor(build): rename <code>indexOfMatchInSlice</code> to
<code>findPreloadMarker</code> (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/21054">#21054</a>)</li>
<li><a
href="8293de0e17"><code>8293de0</code></a>
release: v7.2.0</li>
<li>Additional commits viewable in <a
href="https://github.com/vitejs/vite/commits/create-vite@8.1.0/packages/vite">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 17:15:12 +02:00
dependabot[bot]
044c43e0c8 feat(deps): bump actions/checkout from 6.0.3 to 7.0.0 (#803)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3
to 7.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/checkout/releases">actions/checkout's
releases</a>.</em></p>
<blockquote>
<h2>v7.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>block checking out fork pr for pull_request_target and workflow_run
by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li>
<li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the
minor-actions-dependencies group across 1 directory by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2458">actions/checkout#2458</a></li>
<li>Bump flatted from 3.3.1 to 3.4.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2460">actions/checkout#2460</a></li>
<li>Bump js-yaml from 4.1.0 to 4.2.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2461">actions/checkout#2461</a></li>
<li>Bump <code>@​actions/core</code> and
<code>@​actions/tool-cache</code> and Remove uuid by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2459">actions/checkout#2459</a></li>
<li>upgrade module to esm and update dependencies by <a
href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2463">actions/checkout#2463</a></li>
<li>Bump the minor-npm-dependencies group across 1 directory with 3
updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2462">actions/checkout#2462</a></li>
<li>getting ready for checkout v7 release by <a
href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2464">actions/checkout#2464</a></li>
<li>update error wording by <a
href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2467">actions/checkout#2467</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v6.0.3...v7.0.0">https://github.com/actions/checkout/compare/v6.0.3...v7.0.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/actions/checkout/blob/main/CHANGELOG.md">actions/checkout's
changelog</a>.</em></p>
<blockquote>
<h1>Changelog</h1>
<h2>v7.0.0</h2>
<ul>
<li>Block checking out fork PR for pull_request_target and workflow_run
by <a href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li>
<li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the
minor-actions-dependencies group across 1 directory by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2458">actions/checkout#2458</a></li>
<li>Bump flatted from 3.3.1 to 3.4.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2460">actions/checkout#2460</a></li>
<li>Bump js-yaml from 4.1.0 to 4.2.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2461">actions/checkout#2461</a></li>
<li>Bump <code>@​actions/core</code> and
<code>@​actions/tool-cache</code> and Remove uuid by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2459">actions/checkout#2459</a></li>
<li>upgrade module to esm and update dependencies by <a
href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2463">actions/checkout#2463</a></li>
<li>Bump the minor-npm-dependencies group across 1 directory with 3
updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/checkout/pull/2462">actions/checkout#2462</a></li>
</ul>
<h2>v6.0.3</h2>
<ul>
<li>Fix checkout init for SHA-256 repositories by <a
href="https://github.com/yaananth"><code>@​yaananth</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2439">actions/checkout#2439</a></li>
<li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a
href="https://github.com/yaananth"><code>@​yaananth</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li>
</ul>
<h2>v6.0.2</h2>
<ul>
<li>Fix tag handling: preserve annotations and explicit fetch-tags by <a
href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2356">actions/checkout#2356</a></li>
</ul>
<h2>v6.0.1</h2>
<ul>
<li>Add worktree support for persist-credentials includeIf by <a
href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2327">actions/checkout#2327</a></li>
</ul>
<h2>v6.0.0</h2>
<ul>
<li>Persist creds to a separate file by <a
href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2286">actions/checkout#2286</a></li>
<li>Update README to include Node.js 24 support details and requirements
by <a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/2248">actions/checkout#2248</a></li>
</ul>
<h2>v5.0.1</h2>
<ul>
<li>Port v6 cleanup to v5 by <a
href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2301">actions/checkout#2301</a></li>
</ul>
<h2>v5.0.0</h2>
<ul>
<li>Update actions checkout to use node 24 by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li>
</ul>
<h2>v4.3.1</h2>
<ul>
<li>Port v6 cleanup to v4 by <a
href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2305">actions/checkout#2305</a></li>
</ul>
<h2>v4.3.0</h2>
<ul>
<li>docs: update README.md by <a
href="https://github.com/motss"><code>@​motss</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li>
<li>Add internal repos for checking out multiple repositories by <a
href="https://github.com/mouismail"><code>@​mouismail</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li>
<li>Documentation update - add recommended permissions to Readme by <a
href="https://github.com/benwells"><code>@​benwells</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li>
<li>Adjust positioning of user email note and permissions heading by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li>
<li>Update README.md by <a
href="https://github.com/nebuk89"><code>@​nebuk89</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li>
<li>Update CODEOWNERS for actions by <a
href="https://github.com/TingluoHuang"><code>@​TingluoHuang</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li>
<li>Update package dependencies by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li>
</ul>
<h2>v4.2.2</h2>
<ul>
<li><code>url-helper.ts</code> now leverages well-known environment
variables by <a href="https://github.com/jww3"><code>@​jww3</code></a>
in <a
href="https://redirect.github.com/actions/checkout/pull/1941">actions/checkout#1941</a></li>
<li>Expand unit test coverage for <code>isGhes</code> by <a
href="https://github.com/jww3"><code>@​jww3</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1946">actions/checkout#1946</a></li>
</ul>
<h2>v4.2.1</h2>
<ul>
<li>Check out other refs/* by commit if provided, fall back to ref by <a
href="https://github.com/orhantoy"><code>@​orhantoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/1924">actions/checkout#1924</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9c091bb21b"><code>9c091bb</code></a>
update error wording (<a
href="https://redirect.github.com/actions/checkout/issues/2467">#2467</a>)</li>
<li><a
href="1044a6dea9"><code>1044a6d</code></a>
getting ready for checkout v7 release (<a
href="https://redirect.github.com/actions/checkout/issues/2464">#2464</a>)</li>
<li><a
href="f0282184c7"><code>f028218</code></a>
Bump the minor-npm-dependencies group across 1 directory with 3 updates
(<a
href="https://redirect.github.com/actions/checkout/issues/2462">#2462</a>)</li>
<li><a
href="d914b262ff"><code>d914b26</code></a>
upgrade module to esm and update dependencies (<a
href="https://redirect.github.com/actions/checkout/issues/2463">#2463</a>)</li>
<li><a
href="537c7ef99c"><code>537c7ef</code></a>
Bump <code>@​actions/core</code> and <code>@​actions/tool-cache</code>
and Remove uuid (<a
href="https://redirect.github.com/actions/checkout/issues/2459">#2459</a>)</li>
<li><a
href="130a169078"><code>130a169</code></a>
Bump js-yaml from 4.1.0 to 4.2.0 (<a
href="https://redirect.github.com/actions/checkout/issues/2461">#2461</a>)</li>
<li><a
href="7d09575332"><code>7d09575</code></a>
Bump flatted from 3.3.1 to 3.4.2 (<a
href="https://redirect.github.com/actions/checkout/issues/2460">#2460</a>)</li>
<li><a
href="0f9f3aa320"><code>0f9f3aa</code></a>
Bump actions/publish-immutable-action (<a
href="https://redirect.github.com/actions/checkout/issues/2458">#2458</a>)</li>
<li><a
href="f9e715a95f"><code>f9e715a</code></a>
block checking out fork pr for pull_request_target and workflow_run (<a
href="https://redirect.github.com/actions/checkout/issues/2454">#2454</a>)</li>
<li>See full diff in <a
href="df4cb1c069...9c091bb21b">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=6.0.3&new-version=7.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 16:46:08 +02:00
Ben Brandt
9013d1d468 feat(acp): Handle ACP request cancellation signals (#801) 2026-06-22 14:48:42 +02:00
acp-release-bot[bot]
d5e1b7fa72 chore(main): release 0.49.0 (#795)
🤖 I have created a release *beep* *boop*
---


##
[0.49.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.48.0...v0.49.0)
(2026-06-22)


### Features

* Update to claude-agent-sdk 0.3.185
([#798](https://github.com/agentclientprotocol/claude-agent-acp/issues/798))
([8dc8c86](8dc8c86426))


### Bug Fixes

* Deduplicate streamed assistant blocks by content
([#800](https://github.com/agentclientprotocol/claude-agent-acp/issues/800))
([960f62d](960f62d765))
* Infer 1M context from model descriptions
([#799](https://github.com/agentclientprotocol/claude-agent-acp/issues/799))
([508453c](508453c288))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-06-22 13:48:57 +02:00
Ben Brandt
960f62d765 fix: Deduplicate streamed assistant blocks by content (#800)
It seems some providers are still having issues here...
2026-06-22 12:46:49 +02:00
Ben Brandt
508453c288 fix: Infer 1M context from model descriptions (#799) 2026-06-22 12:37:07 +02:00
Ben Brandt
8dc8c86426 feat: Update to claude-agent-sdk 0.3.185 (#798) 2026-06-22 12:10:34 +02:00
acp-release-bot[bot]
b4b7f561e2 chore(main): release 0.48.0 (#788)
🤖 I have created a release *beep* *boop*
---


##
[0.48.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.47.0...v0.48.0)
(2026-06-19)


### Features

* Agent selection dropdown in config options
([#794](https://github.com/agentclientprotocol/claude-agent-acp/issues/794))
([5729c47](5729c471f9))
* **deps:** bump the minor group with 11 updates
([#787](https://github.com/agentclientprotocol/claude-agent-acp/issues/787))
([ad3b5fe](ad3b5fe745))
* Update to claude-agent-sdk 0.3.183
([#791](https://github.com/agentclientprotocol/claude-agent-acp/issues/791))
([744b2d4](744b2d4112))
* Update to new ACP SDK patterns
([#790](https://github.com/agentclientprotocol/claude-agent-acp/issues/790))
([2554c7b](2554c7bf98))


### Bug Fixes

* duplicate assistant text when turn activates mid-message
([#789](https://github.com/agentclientprotocol/claude-agent-acp/issues/789))
([1c80bf8](1c80bf8e56))
* Skip empty thinking chunks
([#793](https://github.com/agentclientprotocol/claude-agent-acp/issues/793))
([15fdf26](15fdf26fc7))
* surface Bash tool image output instead of dropping it
([#617](https://github.com/agentclientprotocol/claude-agent-acp/issues/617))
([a759e64](a759e64ef6))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-06-19 13:19:37 +02:00
Luca Dibattista
41cde99fd7 test: isolate CLAUDE_CONFIG_DIR in settings tests to stop user-tier leak (#769)
## Summary

`src/tests/settings.test.ts` didn't isolate the **user settings tier**,
so the `availableModels` merge tests failed on any machine whose real
`~/.claude/settings.json` defines `availableModels`.

`SettingsManager.loadAllSettings()` resolves through the SDK's
`resolveSettings({ cwd })`, which reads the user `settings.json` from
`process.env.CLAUDE_CONFIG_DIR` at call time and falls back to the real
`~/.claude` when it's unset. The tests set up only the project/local
tiers under a temp `cwd` and left the user tier pointing at the
developer's real home, so the developer's own settings merged into the
result.

This only surfaced for `availableModels` because that key is **unioned**
across tiers — leaked entries get prepended. `model` and
`permissions.defaultMode` use override semantics (project tier wins), so
they masked the leak. Example failure with `availableModels:
["sonnet","opus","haiku"]` in the user's real settings:

```
- Expected
+ Received
+   "sonnet",
+   "opus",
+   "haiku",
    "claude-haiku-4-5",
    "claude-opus-4-7[1m]",
    "claude-sonnet-4-6[1m]",
```

## Fix

Point `CLAUDE_CONFIG_DIR` at an empty per-test directory in `beforeEach`
(and restore it in `afterEach`) so the user tier contributes nothing.
This mirrors the isolation already used in `acp-agent-settings.test.ts`.

Test-only change; no production code touched.

## Test Plan

- `settings.test.ts` run plainly with a real `~/.claude` containing
`availableModels` → 10 passed (previously 2 failing).
- `settings.test.ts` run with `CLAUDE_CONFIG_DIR` pointed at a directory
holding decoy `availableModels`/`model` → 10 passed, confirming
`beforeEach` overrides any external user tier.
- Full suite with no env wrapper → 355 passed, 0 failed.
- lint + prettier clean.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 11:19:12 +00:00
Ben Brandt
5729c471f9 feat: Agent selection dropdown in config options (#794)
- **feat: add agent selection as ACP session config option**
- **fix: harden agent selection edge cases + SDK roster guard**
- **fix: reserve "default" agent sentinel to prevent collision**

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 13:17:00 +02:00
David Alvarez
a759e64ef6 fix: surface Bash tool image output instead of dropping it (#617)
## What's broken

The Bash branch of `toolUpdateFromToolResult` (`src/tools.ts`) guards
the array-content path on `"text" in result[0]`. When the local Bash
tool produces image content — `[{ type: "image", source: { type:
"base64", ... } }]`, e.g. when a command pipes a base64 data URI — the
guard rejects the array and `output` stays empty. The image is silently
dropped from the ACP `tool_call_update` and the client renders nothing.

## Fix

Distinguish text-only arrays (existing terminal-stream behavior) from
arrays containing non-text blocks. For the latter, bypass the terminal
`_meta` channel (binary payloads can't be streamed through it) and
delegate to `toAcpContentUpdate` so images surface as ACP content
blocks.

The change is contained to the Bash case in `toolUpdateFromToolResult`;
no other tool dispatch is affected.

## Tests

Three regression tests added in `src/tests/tools.test.ts` under a new
`describe("with image array tool_result …")`:

- pure image, `supportsTerminalOutput: false` — image surfaces as ACP
content
- pure image, `supportsTerminalOutput: true` — `_meta` is correctly
bypassed and image still surfaces
- mixed text + image — both blocks surface in order

All existing tests pass. Total: 240 → 243.

## Validation

- `npm run check` ✅
- `npm run build` ✅
- `npm run test:run` ✅ (243 passed, 13 integration skipped)

Co-authored-by: dave <dave@mint.lan>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
2026-06-19 10:27:32 +00:00
Ben Brandt
15fdf26fc7 fix: Skip empty thinking chunks (#793)
These carried a signature but we don't need that in the updates if it is
empty.
2026-06-19 10:18:36 +00:00
Ben Brandt
9f38cb67df test: Improve tmp dirs in tests (#792) 2026-06-19 12:08:11 +02:00
Ben Brandt
744b2d4112 feat: Update to claude-agent-sdk 0.3.183 (#791) 2026-06-19 10:03:32 +00:00
Ben Brandt
2554c7bf98 feat: Update to new ACP SDK patterns (#790) 2026-06-19 11:48:41 +02:00
Hugo Baraúna
1c80bf8e56 fix: duplicate assistant text when turn activates mid-message (#789)
I generated this PR using AI. if not helpful, please delete it.

Or, maybe its value is just to show a potential bug.

I found this bug when using Tidewave. I noticed text was being
duplicated when using claude and claude-agent-acp 0.47.0.

I asked the agent to investigate, and this PR seems to fix it.

---

## Summary

- Stop `resetTurnScratch()` from nulling `currentStreamMessageId` on
turn activation, which was causing the assistant's message text to
render **twice** (concatenated) in the feed.

## Problem

When a turn activates mid-message, the agent's message text renders
twice, back-to-back. Only prose duplicates — never tool calls — and
specifically the text/thinking block that streams *after* the
activation. Reproduces on `0.47.0` with a prompt like *"say a sentence,
run a shell command that sleeps 10s, then say a sentence."*
2026-06-19 08:28:54 +00:00
dependabot[bot]
ad3b5fe745 feat(deps): bump the minor group with 11 updates (#787)
Bumps the minor group with 11 updates:

| Package | From | To |
| --- | --- | --- |
|
[@agentclientprotocol/sdk](https://github.com/agentclientprotocol/typescript-sdk)
| `0.26.0` | `0.27.0` |
|
[@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript)
| `0.3.179` | `0.3.181` |
| @anthropic-ai/claude-agent-sdk-darwin-arm64 | `0.3.179` | `0.3.181` |
| @anthropic-ai/claude-agent-sdk-darwin-x64 | `0.3.179` | `0.3.181` |
| @anthropic-ai/claude-agent-sdk-linux-arm64 | `0.3.179` | `0.3.181` |
| @anthropic-ai/claude-agent-sdk-linux-arm64-musl | `0.3.179` |
`0.3.181` |
| @anthropic-ai/claude-agent-sdk-linux-x64 | `0.3.179` | `0.3.181` |
| @anthropic-ai/claude-agent-sdk-linux-x64-musl | `0.3.179` | `0.3.181`
|
| @anthropic-ai/claude-agent-sdk-win32-arm64 | `0.3.179` | `0.3.181` |
| @anthropic-ai/claude-agent-sdk-win32-x64 | `0.3.179` | `0.3.181` |
| [hono](https://github.com/honojs/hono) | `4.12.25` | `4.12.26` |

Updates `@agentclientprotocol/sdk` from 0.26.0 to 0.27.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/agentclientprotocol/typescript-sdk/releases">@​agentclientprotocol/sdk's
releases</a>.</em></p>
<blockquote>
<h2>v0.27.0</h2>
<h2><a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v0.26.0...v0.27.0">0.27.0</a>
(2026-06-18)</h2>
<p>This is a big release! We have rewritten the SDK to have a more
ergonomic design for creating new agents and clients. You can read more
in the <a
href="https://github.com/agentclientprotocol/typescript-sdk/blob/main/MIGRATION_0.26_0.27.md">Migration
Guide</a> for how to migrate.</p>
<p>For now, you will still have the old interfaces available to ease the
migration, but they are deprecated and will be removed in a future
release.</p>
<h3>Features</h3>
<ul>
<li>Experimental Streamable HTTP &amp; WebSocket Transport (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/155">#155</a>)
(<a
href="d6a3d88107">d6a3d88</a>)</li>
<li>New SDK design (see MIGRATION_0.26_0.27.md) (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/181">#181</a>)
(<a
href="87e2df33b5">87e2df3</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/agentclientprotocol/typescript-sdk/blob/main/CHANGELOG.md">@​agentclientprotocol/sdk's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v0.26.0...v0.27.0">0.27.0</a>
(2026-06-18)</h2>
<p>This is a big release! We have rewritten the SDK to have a more
ergonomic design for creating new agents and clients. You can read more
in the <a
href="https://github.com/agentclientprotocol/typescript-sdk/blob/main/MIGRATION_0.26_0.27.md">Migration
Guide</a> for how to migrate.</p>
<p>For now, you will still have the old interfaces available to ease the
migration, but they are deprecated and will be removed in a future
release.</p>
<h3>Features</h3>
<ul>
<li>Experimental Streamable HTTP &amp; WebSocket Transport (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/155">#155</a>)
(<a
href="d6a3d88107">d6a3d88</a>)</li>
<li>New SDK design (see MIGRATION_0.26_0.27.md) (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/181">#181</a>)
(<a
href="87e2df33b5">87e2df3</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a3437f5f3f"><code>a3437f5</code></a>
chore(main): release 0.27.0 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/182">#182</a>)</li>
<li><a
href="a3acfa25d7"><code>a3acfa2</code></a>
chore: Cleanup documentation of ctx args and slim down public api (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/184">#184</a>)</li>
<li><a
href="bd1f514d02"><code>bd1f514</code></a>
Update dev deps (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/183">#183</a>)</li>
<li><a
href="87e2df33b5"><code>87e2df3</code></a>
feat: New SDK design (see MIGRATION_0.26_0.27.md) (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/181">#181</a>)</li>
<li><a
href="d6a3d88107"><code>d6a3d88</code></a>
feat: Experimental Streamable HTTP &amp; WebSocket Transport (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/155">#155</a>)</li>
<li>See full diff in <a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v0.26.0...v0.27.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk` from 0.3.179 to 0.3.181
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/releases">@​anthropic-ai/claude-agent-sdk's
releases</a>.</em></p>
<blockquote>
<h2>v0.3.181</h2>
<h2>What's changed</h2>
<ul>
<li>Added <code>errorCode</code>, <code>canUserPurchaseCredits</code>,
and <code>hasChargeableSavedPaymentMethod</code> fields to
<code>SDKRateLimitInfo</code> for detecting credits-required rate
limits</li>
<li>Added <code>tool_use_meta.icon_url</code> to assistant messages,
populated from MCP server directory metadata</li>
<li>Fixed SDK-hosted Remote Control sessions dropping
<code>file_attachments</code> from inbound user messages</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.181
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.181
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.181
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.181
</code></pre>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md">@​anthropic-ai/claude-agent-sdk's
changelog</a>.</em></p>
<blockquote>
<h2>0.3.181</h2>
<ul>
<li>Added <code>errorCode</code>, <code>canUserPurchaseCredits</code>,
and <code>hasChargeableSavedPaymentMethod</code> fields to
<code>SDKRateLimitInfo</code> for detecting credits-required rate
limits</li>
<li>Added <code>tool_use_meta.icon_url</code> to assistant messages,
populated from MCP server directory metadata</li>
<li>Fixed SDK-hosted Remote Control sessions dropping
<code>file_attachments</code> from inbound user messages</li>
</ul>
<h2>0.3.180</h2>
<ul>
<li>Updated to parity with Claude Code v2.1.180</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4d3840c936"><code>4d3840c</code></a>
chore: Update CHANGELOG.md</li>
<li>See full diff in <a
href="https://github.com/anthropics/claude-agent-sdk-typescript/compare/v0.3.179...v0.3.181">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.179 to
0.3.181

Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.179 to
0.3.181

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.179 to
0.3.181

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.179
to 0.3.181

Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.179 to
0.3.181

Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.179 to
0.3.181

Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.179 to
0.3.181

Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.179 to
0.3.181

Updates `hono` from 4.12.25 to 4.12.26
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/honojs/hono/releases">hono's
releases</a>.</em></p>
<blockquote>
<h2>v4.12.26</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(lambda-edge): satisfy Deno lib types for Content-Length body
encoding by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5013">honojs/hono#5013</a></li>
<li>ci: publish to npm from CI with OIDC trusted publishing by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5028">honojs/hono#5028</a></li>
<li>chore: remove unused devcontainer and gitpod configs by <a
href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5029">honojs/hono#5029</a></li>
<li>chore: replace arg and glob with Bun native APIs in build script by
<a href="https://github.com/yusukebe"><code>@​yusukebe</code></a> in <a
href="https://redirect.github.com/honojs/hono/pull/5030">honojs/hono#5030</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/honojs/hono/compare/v4.12.25...v4.12.26">https://github.com/honojs/hono/compare/v4.12.25...v4.12.26</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="27b7992f82"><code>27b7992</code></a>
4.12.26</li>
<li><a
href="d29982cc40"><code>d29982c</code></a>
chore: replace arg and glob with Bun native APIs in build script</li>
<li><a
href="16215d5f50"><code>16215d5</code></a>
chore: remove unused devcontainer and gitpod configs (<a
href="https://redirect.github.com/honojs/hono/issues/5029">#5029</a>)</li>
<li><a
href="c574cf1640"><code>c574cf1</code></a>
ci: publish to npm from CI with OIDC trusted publishing (<a
href="https://redirect.github.com/honojs/hono/issues/5028">#5028</a>)</li>
<li><a
href="e50df01453"><code>e50df01</code></a>
fix(lambda-edge): satisfy Deno lib types for Content-Length body
encoding (<a
href="https://redirect.github.com/honojs/hono/issues/5">#5</a>...</li>
<li>See full diff in <a
href="https://github.com/honojs/hono/compare/v4.12.25...v4.12.26">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new
releaser for hono since your current version.</p>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
2026-06-18 16:55:17 +02:00
acp-release-bot[bot]
794aa84684 chore(main): release 0.47.0 (#784)
🤖 I have created a release *beep* *boop*
---


##
[0.47.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.46.0...v0.47.0)
(2026-06-17)


### Features

* Update to claude-agent-sdk 0.3.179
([#783](https://github.com/agentclientprotocol/claude-agent-acp/issues/783))
([59a098c](59a098c2b5))


### Bug Fixes

* Duplicate assistant messages in feed
([#785](https://github.com/agentclientprotocol/claude-agent-acp/issues/785))
([12d34e6](12d34e64e5))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: acp-release-bot[bot] <246668977+acp-release-bot[bot]@users.noreply.github.com>
2026-06-17 12:17:10 +02:00
Ben Brandt
12d34e64e5 fix: Duplicate assistant messages in feed (#785) 2026-06-17 12:12:26 +02:00
Ben Brandt
59a098c2b5 feat: Update to claude-agent-sdk 0.3.179 (#783) 2026-06-17 09:04:56 +00:00
26 changed files with 5583 additions and 770 deletions

View File

@@ -21,7 +21,7 @@ jobs:
timeout-minutes: 5
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- name: Use Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e

View File

@@ -44,7 +44,7 @@ jobs:
contents: read
id-token: write
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
# Setup .npmrc file to publish to npm
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
with:

View File

@@ -1,3 +1,3 @@
{
".": "0.46.0"
".": "0.58.0"
}

View File

@@ -1,5 +1,152 @@
# Changelog
## [0.58.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.57.0...v0.58.0) (2026-07-09)
### Features
* **deps:** update to @anthropic-ai/claude-agent-sdk 0.3.205 ([#854](https://github.com/agentclientprotocol/claude-agent-acp/issues/854)) ([f664ced](https://github.com/agentclientprotocol/claude-agent-acp/commit/f664ced76df00674d88aedd018a4261da3bc3f3a))
### Bug Fixes
* Preserve live model on resumed sessions ([#848](https://github.com/agentclientprotocol/claude-agent-acp/issues/848)) ([f3d8ae3](https://github.com/agentclientprotocol/claude-agent-acp/commit/f3d8ae3eb389ee9367f48c8762562a55280ade0a)), closes [#845](https://github.com/agentclientprotocol/claude-agent-acp/issues/845)
* Report usage for cancelled active turns ([#846](https://github.com/agentclientprotocol/claude-agent-acp/issues/846)) ([b03318f](https://github.com/agentclientprotocol/claude-agent-acp/commit/b03318f59c6165146c8d8e036227f35c3abd0ff4)), closes [#844](https://github.com/agentclientprotocol/claude-agent-acp/issues/844)
* tolerate missing text in streamed thinking chunks ([#852](https://github.com/agentclientprotocol/claude-agent-acp/issues/852)) ([e944ced](https://github.com/agentclientprotocol/claude-agent-acp/commit/e944ceddea79950d6bfb6339266862507c4b964f))
* Use SDK guards for elicitation validation ([#850](https://github.com/agentclientprotocol/claude-agent-acp/issues/850)) ([32b9350](https://github.com/agentclientprotocol/claude-agent-acp/commit/32b93501d7a35a3b405b5022b4caaad492eed11c))
## [0.57.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.56.0...v0.57.0) (2026-07-07)
### Features
* Update @anthropic-ai/claude-agent-sdk to 0.3.202 ([#843](https://github.com/agentclientprotocol/claude-agent-acp/issues/843)) ([1612c07](https://github.com/agentclientprotocol/claude-agent-acp/commit/1612c078953c134e12368a2d968a9bcf14d31b55))
### Bug Fixes
* don't emit empty agent_message_chunk ([#841](https://github.com/agentclientprotocol/claude-agent-acp/issues/841)) ([d74dd1d](https://github.com/agentclientprotocol/claude-agent-acp/commit/d74dd1d9d356050fc87f9fdab8599f1546b12a2c))
## [0.56.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.55.0...v0.56.0) (2026-07-06)
### Features
* **deps:** bump @anthropic-ai/claude-agent-sdk to 0.3.201 ([#837](https://github.com/agentclientprotocol/claude-agent-acp/issues/837)) ([ff2a8a9](https://github.com/agentclientprotocol/claude-agent-acp/commit/ff2a8a963536a4265700e4f2003a0ffff93c9087))
## [0.55.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.54.1...v0.55.0) (2026-07-02)
### Features
* Add refusal fallback consent dialog support ([#834](https://github.com/agentclientprotocol/claude-agent-acp/issues/834)) ([15dfd83](https://github.com/agentclientprotocol/claude-agent-acp/commit/15dfd83daa84ced98ecbaa7c83fd5a53124030c1))
* **deps-dev:** bump the minor group with 3 updates ([#831](https://github.com/agentclientprotocol/claude-agent-acp/issues/831)) ([8d5febf](https://github.com/agentclientprotocol/claude-agent-acp/commit/8d5febf85485c1ad19b81501fb5c6d4275448a7c))
* Update to claude-agent-sdk 0.3.198 ([#836](https://github.com/agentclientprotocol/claude-agent-acp/issues/836)) ([307ab82](https://github.com/agentclientprotocol/claude-agent-acp/commit/307ab82712213413446466d808e161073e94fc7f))
### Bug Fixes
* Handle model refusal fallback updates ([#833](https://github.com/agentclientprotocol/claude-agent-acp/issues/833)) ([648e3f6](https://github.com/agentclientprotocol/claude-agent-acp/commit/648e3f60bd7e6eadb5f86b0dc475104ab12e7b02))
* Handle SDK idle turns without results ([#835](https://github.com/agentclientprotocol/claude-agent-acp/issues/835)) ([57b00cc](https://github.com/agentclientprotocol/claude-agent-acp/commit/57b00ccac610e2eeaf0a753934a0c3b78d27ccb0))
## [0.54.1](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.54.0...v0.54.1) (2026-06-30)
### Bug Fixes
* apply modelOverrides when resolving availableModels allowlist ([#827](https://github.com/agentclientprotocol/claude-agent-acp/issues/827)) ([98c284b](https://github.com/agentclientprotocol/claude-agent-acp/commit/98c284bb871a96710596dfdc2b9ea25d2400f6b2))
## [0.54.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.53.0...v0.54.0) (2026-06-30)
### Features
* Add Fast mode session config support ([#828](https://github.com/agentclientprotocol/claude-agent-acp/issues/828)) ([fa949a2](https://github.com/agentclientprotocol/claude-agent-acp/commit/fa949a20db0e33f2d63aebeb37e9fea212d8ee95))
* **deps-dev:** bump prettier from 3.9.1 to 3.9.3 in the minor group ([#821](https://github.com/agentclientprotocol/claude-agent-acp/issues/821)) ([b8df8e0](https://github.com/agentclientprotocol/claude-agent-acp/commit/b8df8e0e5460fd782214f4dde488f7476c80c454))
* **deps:** bump @anthropic-ai/claude-agent-sdk to 0.3.197 for Sonnet 5 ([#826](https://github.com/agentclientprotocol/claude-agent-acp/issues/826)) ([ef42c46](https://github.com/agentclientprotocol/claude-agent-acp/commit/ef42c46e5aea3bb53f433b9f9dd36a62a9f2df6a))
* **deps:** bump fast-uri from 3.1.2 to 3.1.3 ([#822](https://github.com/agentclientprotocol/claude-agent-acp/issues/822)) ([64aa130](https://github.com/agentclientprotocol/claude-agent-acp/commit/64aa130c66c299f9835193796ba372b3ed40e7c1))
## [0.53.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.52.0...v0.53.0) (2026-06-29)
### Features
* Add ACP logout support ([#816](https://github.com/agentclientprotocol/claude-agent-acp/issues/816)) ([0a0468c](https://github.com/agentclientprotocol/claude-agent-acp/commit/0a0468c72092b7ceccc551b4353dd92f9c22cbb8))
* **deps:** bump @anthropic-ai/claude-agent-sdk to 0.3.195 ([#818](https://github.com/agentclientprotocol/claude-agent-acp/issues/818)) ([5dd8746](https://github.com/agentclientprotocol/claude-agent-acp/commit/5dd87462376597eb7b695200f4c716af46e764d6))
### Bug Fixes
* Emit tool_call before permission request ([#820](https://github.com/agentclientprotocol/claude-agent-acp/issues/820)) ([c95fc88](https://github.com/agentclientprotocol/claude-agent-acp/commit/c95fc884e82e5a297d1b17b8965690260867835b))
## [0.52.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.51.0...v0.52.0) (2026-06-25)
### Features
* Add version flag handling ([#813](https://github.com/agentclientprotocol/claude-agent-acp/issues/813)) ([9616bda](https://github.com/agentclientprotocol/claude-agent-acp/commit/9616bdac47505e4a14c36d667fcffc9ae97e1f2a)), closes [#809](https://github.com/agentclientprotocol/claude-agent-acp/issues/809)
* **deps-dev:** bump expect-type from 1.3.0 to 1.4.0 in the minor group ([#814](https://github.com/agentclientprotocol/claude-agent-acp/issues/814)) ([61272ac](https://github.com/agentclientprotocol/claude-agent-acp/commit/61272acb30dcafaa2455d334b11ce2ad97339707))
* **deps:** Update @anthropic-ai/claude-agent-sdk to 0.3.191 ([#810](https://github.com/agentclientprotocol/claude-agent-acp/issues/810)) ([228f02e](https://github.com/agentclientprotocol/claude-agent-acp/commit/228f02ecfb23be16e59e121c6b42c0f2b2f40a4e))
* Push session title updates at turn end ([#812](https://github.com/agentclientprotocol/claude-agent-acp/issues/812)) ([1fe7ec0](https://github.com/agentclientprotocol/claude-agent-acp/commit/1fe7ec09a3a7bcb7501231dae4b0ffe6ef9b70a4))
## [0.51.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.50.0...v0.51.0) (2026-06-24)
### Features
* **deps:** bump the minor group with 11 updates ([#807](https://github.com/agentclientprotocol/claude-agent-acp/issues/807)) ([8f6ebd1](https://github.com/agentclientprotocol/claude-agent-acp/commit/8f6ebd1d9198edf723f4c8c1aa2b49b906c46646))
## [0.50.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.49.0...v0.50.0) (2026-06-23)
### Features
* **acp:** Handle ACP request cancellation signals ([#801](https://github.com/agentclientprotocol/claude-agent-acp/issues/801)) ([9013d1d](https://github.com/agentclientprotocol/claude-agent-acp/commit/9013d1d46883a7f3774a63a9dca16c4a0f634a97))
* **deps:** bump actions/checkout from 6.0.3 to 7.0.0 ([#803](https://github.com/agentclientprotocol/claude-agent-acp/issues/803)) ([044c43e](https://github.com/agentclientprotocol/claude-agent-acp/commit/044c43e0c894082b9e747c01e9dbde6e21036823))
* **deps:** upgrade to @anthropic-ai/claude-agent-sdk@0.3.186 ([#806](https://github.com/agentclientprotocol/claude-agent-acp/issues/806)) ([a7e6137](https://github.com/agentclientprotocol/claude-agent-acp/commit/a7e6137f6877b72b8daa39e74971c3559db8d28f))
## [0.49.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.48.0...v0.49.0) (2026-06-22)
### Features
* Update to claude-agent-sdk 0.3.185 ([#798](https://github.com/agentclientprotocol/claude-agent-acp/issues/798)) ([8dc8c86](https://github.com/agentclientprotocol/claude-agent-acp/commit/8dc8c864263fa50d03bec7ebff7aee776604cb3d))
### Bug Fixes
* Deduplicate streamed assistant blocks by content ([#800](https://github.com/agentclientprotocol/claude-agent-acp/issues/800)) ([960f62d](https://github.com/agentclientprotocol/claude-agent-acp/commit/960f62d76582ae5c9c5575ab66974809049ce1d0))
* Infer 1M context from model descriptions ([#799](https://github.com/agentclientprotocol/claude-agent-acp/issues/799)) ([508453c](https://github.com/agentclientprotocol/claude-agent-acp/commit/508453c288b4a12701abd507199e7fa0ab172171))
## [0.48.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.47.0...v0.48.0) (2026-06-19)
### Features
* Agent selection dropdown in config options ([#794](https://github.com/agentclientprotocol/claude-agent-acp/issues/794)) ([5729c47](https://github.com/agentclientprotocol/claude-agent-acp/commit/5729c471f92e1d2a191eb2a6d18c2be47821e9ec))
* **deps:** bump the minor group with 11 updates ([#787](https://github.com/agentclientprotocol/claude-agent-acp/issues/787)) ([ad3b5fe](https://github.com/agentclientprotocol/claude-agent-acp/commit/ad3b5fe74527f83964695a1e8056d010b981fc79))
* Update to claude-agent-sdk 0.3.183 ([#791](https://github.com/agentclientprotocol/claude-agent-acp/issues/791)) ([744b2d4](https://github.com/agentclientprotocol/claude-agent-acp/commit/744b2d41128f67091d4136283594c0db11ea4db5))
* Update to new ACP SDK patterns ([#790](https://github.com/agentclientprotocol/claude-agent-acp/issues/790)) ([2554c7b](https://github.com/agentclientprotocol/claude-agent-acp/commit/2554c7bf980472760a6e7810b826f030d2c3af25))
### Bug Fixes
* duplicate assistant text when turn activates mid-message ([#789](https://github.com/agentclientprotocol/claude-agent-acp/issues/789)) ([1c80bf8](https://github.com/agentclientprotocol/claude-agent-acp/commit/1c80bf8e56a9279dc799e7bbdcae87241e99c18b))
* Skip empty thinking chunks ([#793](https://github.com/agentclientprotocol/claude-agent-acp/issues/793)) ([15fdf26](https://github.com/agentclientprotocol/claude-agent-acp/commit/15fdf26fc7d3a6c51e89d3e56fc91dd00cb3d7ae))
* surface Bash tool image output instead of dropping it ([#617](https://github.com/agentclientprotocol/claude-agent-acp/issues/617)) ([a759e64](https://github.com/agentclientprotocol/claude-agent-acp/commit/a759e64ef6d9b7c5bfe9a6e6b182db835f8ed3b6))
## [0.47.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.46.0...v0.47.0) (2026-06-17)
### Features
* Update to claude-agent-sdk 0.3.179 ([#783](https://github.com/agentclientprotocol/claude-agent-acp/issues/783)) ([59a098c](https://github.com/agentclientprotocol/claude-agent-acp/commit/59a098c2b530bbae034e9a2dfbd31f8b4ef2a4d0))
### Bug Fixes
* Duplicate assistant messages in feed ([#785](https://github.com/agentclientprotocol/claude-agent-acp/issues/785)) ([12d34e6](https://github.com/agentclientprotocol/claude-agent-acp/commit/12d34e64e53564602ac1c38a30127e234c5c25ff))
## [0.46.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.45.1...v0.46.0) (2026-06-16)

View File

@@ -40,7 +40,7 @@ export default [
"default-case": "error",
"prefer-const": "error",
"no-var": "error",
eqeqeq: ["error", "always"],
eqeqeq: ["error", "smart"],
curly: ["error", "all"],
},
},

618
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@
"publishConfig": {
"access": "public"
},
"version": "0.46.0",
"version": "0.58.0",
"description": "An ACP-compatible coding agent powered by the Claude Agent SDK (TypeScript)",
"main": "dist/lib.js",
"types": "dist/lib.d.ts",
@@ -59,23 +59,27 @@
},
"author": "Zed Industries",
"license": "Apache-2.0",
"engines": {
"node": ">=22"
},
"dependencies": {
"@agentclientprotocol/sdk": "0.26.0",
"@anthropic-ai/claude-agent-sdk": "0.3.178",
"@agentclientprotocol/sdk": "1.2.1",
"@anthropic-ai/claude-agent-sdk": "0.3.205",
"zod": "^3.25.0 || ^4.0.0"
},
"devDependencies": {
"@anthropic-ai/sdk": "0.104.2",
"@anthropic-ai/sdk": "0.110.0",
"@eslint/js": "10.0.1",
"@types/node": "25.9.3",
"@typescript-eslint/eslint-plugin": "8.61.1",
"@typescript-eslint/parser": "8.61.1",
"eslint": "10.5.0",
"@tsconfig/node22": "22.0.5",
"@types/node": "26.1.1",
"@typescript-eslint/eslint-plugin": "8.63.0",
"@typescript-eslint/parser": "8.63.0",
"eslint": "10.6.0",
"eslint-config-prettier": "10.1.8",
"globals": "17.6.0",
"prettier": "3.8.4",
"globals": "17.7.0",
"prettier": "3.9.4",
"ts-node": "10.9.2",
"typescript": "6.0.3",
"vitest": "4.1.9"
"vitest": "4.1.10"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,8 @@
import { randomUUID } from "node:crypto";
import { CreateElicitationResponse } from "@agentclientprotocol/sdk";
import type {
CreateElicitationRequest,
CreateElicitationResponse,
ElicitationAcceptAction,
ElicitationPropertySchema,
ElicitationSchema,
EnumOption,
@@ -68,6 +69,20 @@ export function mcpElicitationToCreateRequest(
};
}
/**
* Content of an accepted elicitation response.
*
* Uses the SDK's validating guard rather than an `action === "accept"` check:
* the guard both narrows past the union's custom/future variant and validates
* the payload, so a malformed accept (right tag, ill-typed content) yields
* empty content — the same classification the SDK's wire validators apply.
*/
function acceptedElicitationContent(
response: CreateElicitationResponse,
): NonNullable<ElicitationAcceptAction["content"]> {
return CreateElicitationResponse.isAccept(response) ? (response.content ?? {}) : {};
}
/**
* Map an ACP elicitation response back to the MCP `ElicitResult` the SDK expects
* to hand back to the requesting server.
@@ -77,7 +92,7 @@ export function createElicitationResponseToElicitResult(
): ElicitationResult {
switch (response.action) {
case "accept":
return { action: "accept", content: response.content ?? {} };
return { action: "accept", content: acceptedElicitationContent(response) };
case "decline":
return { action: "decline" };
case "cancel":
@@ -126,33 +141,13 @@ function questionCustomFieldKey(index: number): string {
}
/**
* `_meta` key under which a bridged enum option carries its structured
* `description`/`preview`, since ACP's `EnumOption` has no field for either.
* Namespaced like the agent's other `_meta` extensions (`_claude/...`).
* `_meta` key under which a bridged enum option carries its `preview`, the one
* option field ACP's `EnumOption` still has no slot for (descriptions are
* first-class as of schema 1.19). Namespaced like the agent's other `_meta`
* extensions (`_claude/...`).
*/
const OPTION_META_KEY = "_claude/askUserQuestionOption";
/** A single option as supplied by the AskUserQuestion tool. */
type AskUserQuestionOption = AskUserQuestion["options"][number];
/**
* Build the `_meta` payload that carries an option's structured `description`
* and optional `preview` for clients that can render them as distinct fields.
* Returns `undefined` when neither is present, so we don't emit an empty `_meta`.
*/
function askUserQuestionOptionMeta(
option: AskUserQuestionOption,
): NonNullable<EnumOption["_meta"]> | undefined {
const detail: { description?: string; preview?: string } = {};
if (option.description) {
detail.description = option.description;
}
if (option.preview) {
detail.preview = option.preview;
}
return Object.keys(detail).length > 0 ? { [OPTION_META_KEY]: detail } : undefined;
}
/**
* Render the AskUserQuestion tool's questions as an ACP form elicitation.
*
@@ -160,7 +155,8 @@ function askUserQuestionOptionMeta(
* question text, so the question text appears in exactly one place per field.
* Single-select questions use a titled `oneOf` enum; multi-select questions use
* an array with a titled `anyOf` item enum. The enum `const` is always the
* option label, since that is what the tool records as the answer.
* option label, since that is what the tool records as the answer; an option's
* secondary text travels in the enum option's own `description` field.
*
* Each question is followed by its own optional free-text "custom answer" field
* (`question_<n>_custom`), mirroring the CLI's per-question "Other" box: the
@@ -180,19 +176,16 @@ export function askUserQuestionsToCreateRequest(
const options: EnumOption[] = question.options.map((option) => {
const enumOption: EnumOption = {
const: option.label,
// `title` stays a flattened "label — description" string so clients that
// only read `const`/`title` still surface the description. Clients that
// understand the `_meta` below should prefer its structured fields (and
// treat `const` as the clean label) rather than parsing this title.
title: option.description ? `${option.label} — ${option.description}` : option.label,
title: option.label,
};
// The SDK option carries a `description` (secondary text) and an optional
// `preview` (mockups, code snippets, comparisons shown on focus). Neither
// has a structural slot in `EnumOption`, so forward them under ACP's
// reserved `_meta` extension point for clients that can render them.
const meta = askUserQuestionOptionMeta(option);
if (meta) {
enumOption._meta = meta;
if (option.description) {
enumOption.description = option.description;
}
// The SDK option's `preview` (mockups, code snippets, comparisons shown
// on focus) still has no structural slot in `EnumOption`, so forward it
// under ACP's reserved `_meta` extension point for clients that render it.
if (option.preview) {
enumOption._meta = { [OPTION_META_KEY]: { preview: option.preview } };
}
return enumOption;
});
@@ -232,8 +225,7 @@ export function askUserQuestionsToCreateRequest(
/** Outcome of an AskUserQuestion elicitation, decoupled from any transport. */
export type AskUserQuestionOutcome =
| { action: "answered"; updatedInput: Record<string, unknown> }
| { action: "cancel" };
{ action: "answered"; updatedInput: Record<string, unknown> } | { action: "cancel" };
/**
* Fold an ACP elicitation response into the AskUserQuestion tool's input.
@@ -244,22 +236,23 @@ export type AskUserQuestionOutcome =
* custom-answer field (`question_<n>_custom`) takes precedence over that
* question's selection, since the user typed their own answer instead of
* picking one. Decline yields empty answers (the model is told the user skipped
* rather than the turn aborting); cancel aborts the tool call.
* rather than the turn aborting); cancel — and any custom/future action we
* don't understand — aborts the tool call.
*/
export function applyAskElicitationResponse(
response: CreateElicitationResponse,
toolInput: Record<string, unknown>,
questions: AskUserQuestion[],
): AskUserQuestionOutcome {
if (response.action === "cancel") {
return { action: "cancel" };
}
if (response.action === "decline") {
return { action: "answered", updatedInput: { ...toolInput, answers: {} } };
}
const content = response.content ?? {};
if (response.action !== "accept") {
return { action: "cancel" };
}
const content = acceptedElicitationContent(response);
// Typed against the tool's own output schema so the answer/response shapes
// stay in sync with what the built-in tool's call() expects to read back.
const answers: AskUserQuestionOutput["answers"] = {};
@@ -299,3 +292,113 @@ function normalizeElicitationSchema(
}
return { ...(schema as ElicitationSchema), type: "object" };
}
/**
* The `request_user_dialog` kind the CLI emits when a model refusal has a
* fallback available but needs user consent before retrying (e.g. Claude Fable
* declining a request with Opus available as the fallback). Declaring this
* kind in `supportedDialogKinds` is the opt-in: the CLI fails closed and never
* emits an undeclared kind — the flow degrades to the classic refusal error
* ending the turn.
*/
export const REFUSAL_FALLBACK_DIALOG_KIND = "refusal_fallback_prompt";
/**
* Payload of the `refusal_fallback_prompt` dialog. The dialog protocol
* transports payloads opaquely, so this shape is recovered from the CLI's own
* schema (v2.1.177): `originalModel`/`fallbackModel` are required strings;
* `apiRefusalCategory` (nullable), `guidanceText`, and
* `retractedMessageUuids` are optional. We ignore `retractedMessageUuids` —
* ACP has no way to retract already-streamed chunks.
*/
export type RefusalFallbackPrompt = {
originalModel: string;
fallbackModel: string;
apiRefusalCategory: string | null;
guidanceText?: string;
};
/**
* Validate the opaque dialog payload into a {@link RefusalFallbackPrompt}.
* Returns `null` when the required fields are missing or mistyped (a newer CLI
* may reshape the payload), so the caller can cancel the dialog and let the
* CLI apply its default behavior instead of rendering something misleading.
*/
export function extractRefusalFallbackPrompt(
payload: Record<string, unknown>,
): RefusalFallbackPrompt | null {
const { originalModel, fallbackModel, apiRefusalCategory, guidanceText } = payload;
if (typeof originalModel !== "string" || typeof fallbackModel !== "string") {
return null;
}
return {
originalModel,
fallbackModel,
apiRefusalCategory: typeof apiRefusalCategory === "string" ? apiRefusalCategory : null,
...(typeof guidanceText === "string" && guidanceText ? { guidanceText } : {}),
};
}
/** Form-field key carrying the user's choice in the refusal-fallback form. */
const REFUSAL_FALLBACK_CHOICE_KEY = "choice";
/** Wire values of the dialog's result enum (CLI schema). `edit_prompt` is
* deliberately not offered: in the CLI it prefills the composer with the
* refused prompt for edit-and-retry, and ACP has no composer-prefill surface
* — the user can simply edit and resend on their own. */
const RETRY_FALLBACK_RESULT = "retry_fallback";
const KEEP_REFUSAL_RESULT = "cancelled";
/**
* Render the refusal-fallback consent prompt as an ACP form elicitation: a
* single-select between retrying on the fallback model and keeping the
* refusal. The enum `const`s are the dialog's wire result values, so the
* response maps back without a translation table.
*/
export function refusalFallbackToCreateRequest(
prompt: RefusalFallbackPrompt,
sessionId: string,
): CreateElicitationRequest {
const category = prompt.apiRefusalCategory ? ` (${prompt.apiRefusalCategory})` : "";
const guidance = prompt.guidanceText ? `\n\n${prompt.guidanceText}` : "";
return {
mode: "form",
sessionId,
message:
`${prompt.originalModel} declined this request${category}. ` +
`Retry with ${prompt.fallbackModel}?` +
guidance,
requestedSchema: {
type: "object",
properties: {
[REFUSAL_FALLBACK_CHOICE_KEY]: {
type: "string",
oneOf: [
{
const: RETRY_FALLBACK_RESULT,
title: `Retry with ${prompt.fallbackModel}`,
description: `The session continues on ${prompt.fallbackModel}.`,
},
{
const: KEEP_REFUSAL_RESULT,
title: "Keep the refusal",
description: "You can send a new message.",
},
],
},
},
},
};
}
/**
* Map the elicitation response back to the dialog's result enum. Only an
* explicit accept-with-retry resolves to `retry_fallback`; decline, cancel, a
* skipped field, or an unrecognized value all keep the refusal — the dialog's
* own default — so a dismissed or half-filled form can never trigger a model
* switch the user didn't ask for.
*/
export function refusalFallbackResultFromResponse(response: CreateElicitationResponse): string {
const choice = acceptedElicitationContent(response)[REFUSAL_FALLBACK_CHOICE_KEY];
return choice === RETRY_FALLBACK_RESULT ? RETRY_FALLBACK_RESULT : KEEP_REFUSAL_RESULT;
}

View File

@@ -2,7 +2,11 @@
import { resolveSettings } from "@anthropic-ai/claude-agent-sdk";
import { claudeCliPath, runAcp } from "./acp-agent.js";
import packageJson from "../package.json" with { type: "json" };
// `--cli` is checked first so that `--version`/`-v` (and any other flags) are
// forwarded to the wrapped native CLI rather than swallowed by our own version
// handler below. Our version flag only applies when not delegating.
if (process.argv.includes("--cli")) {
const { spawn } = await import("node:child_process");
const args = process.argv.slice(2).filter((arg) => arg !== "--cli");
@@ -33,6 +37,9 @@ if (process.argv.includes("--cli")) {
console.error(err);
process.exit(1);
});
} else if (process.argv.includes("--version") || process.argv.includes("-v")) {
console.log(packageJson.version);
process.exit(0);
} else {
// Apply env vars from the managed-policy tier before any SDK call so the
// SDK subprocess inherits them. Going through resolveSettings (vs. a raw

View File

@@ -2,8 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
import * as fs from "node:fs";
import * as path from "node:path";
import * as os from "node:os";
import type { AgentSideConnection } from "@agentclientprotocol/sdk";
import type { ClaudeAcpAgent as ClaudeAcpAgentType } from "../acp-agent.js";
import type { AcpClient, ClaudeAcpAgent as ClaudeAcpAgentType } from "../acp-agent.js";
const { querySpy } = vi.hoisted(() => ({
querySpy: vi.fn(),
@@ -21,13 +20,13 @@ describe("ClaudeAcpAgent settings", () => {
let tempDir: string;
let originalClaudeConfigDir: string | undefined;
function createMockClient(): AgentSideConnection {
function createMockClient(): AcpClient {
return {
sessionUpdate: async () => {},
requestPermission: async () => ({ outcome: { outcome: "cancelled" } }),
readTextFile: async () => ({ content: "" }),
writeTextFile: async () => ({}),
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
}
function mockQuery() {
@@ -812,6 +811,55 @@ describe("ClaudeAcpAgent settings", () => {
}
}
});
it("maps allowlist aliases through modelOverrides to provider IDs", async () => {
// Bedrock/Vertex deployments enforce short aliases in availableModels
// but require provider-specific IDs at the API. Without applying
// modelOverrides during allowlist resolution, the alias is surfaced as
// the model value and passed verbatim to setModel, which the provider
// API rejects with a 400 "invalid model identifier".
await fs.promises.writeFile(
path.join(tempDir, "settings.json"),
JSON.stringify({
availableModels: ["claude-opus-4-6", "claude-sonnet-4-6"],
model: "claude-opus-4-6",
modelOverrides: {
"claude-opus-4-6": "global.anthropic.claude-opus-4-6-v1[1m]",
"claude-sonnet-4-6": "global.anthropic.claude-sonnet-4-6[1m]",
},
}),
);
const projectDir = path.join(tempDir, "project");
await fs.promises.mkdir(projectDir, { recursive: true });
const { setModelSpy } = mockQueryWithModels([
{ value: "default", displayName: "Default", description: "Default model" },
{ value: "opus", displayName: "Opus", description: "Claude Opus 4.6" },
{ value: "sonnet", displayName: "Sonnet", description: "Claude Sonnet 4.6" },
]);
const { ClaudeAcpAgent } = await import("../acp-agent.js");
const agent: ClaudeAcpAgentType = new ClaudeAcpAgent(createMockClient());
const response = await (agent as any).createSession({
cwd: projectDir,
mcpServers: [],
_meta: { disableBuiltInTools: true },
});
const modelOption = response.configOptions.find((o: any) => o.id === "model");
expect(modelOption.options.map((o: any) => o.value)).toEqual([
"default",
"global.anthropic.claude-opus-4-6-v1[1m]",
"global.anthropic.claude-sonnet-4-6[1m]",
]);
// The allowlist synthesized the overridden ID (the SDK only surfaced the
// `opus` alias), so the adapter syncs the provider ID via setModel — never
// the raw alias that Bedrock would reject.
expect(setModelSpy).toHaveBeenCalledWith("global.anthropic.claude-opus-4-6-v1[1m]");
expect(modelOption.currentValue).toBe("global.anthropic.claude-opus-4-6-v1[1m]");
});
});
it("resolves model aliases like opus[1m] to the correct model", async () => {

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,9 @@
import { mkdtemp, rm } from "node:fs/promises";
import * as os from "node:os";
import * as path from "node:path";
import { AgentSideConnection, SessionNotification } from "@agentclientprotocol/sdk";
import { SessionNotification } from "@agentclientprotocol/sdk";
import type { Options } from "@anthropic-ai/claude-agent-sdk";
import type { ClaudeAcpAgent as ClaudeAcpAgentType } from "../acp-agent.js";
import type { AcpClient, ClaudeAcpAgent as ClaudeAcpAgentType } from "../acp-agent.js";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
let capturedOptions: Options | undefined;
@@ -52,7 +52,7 @@ describe("additionalRoots", () => {
requestPermission: async () => ({ outcome: { outcome: "cancelled" } }),
readTextFile: async () => ({ content: "" }),
writeTextFile: async () => ({}),
} as unknown as AgentSideConnection);
} as unknown as AcpClient);
});
afterEach(

View File

@@ -0,0 +1,42 @@
import { describe, it, expect } from "vitest";
import { randomUUID } from "crypto";
import { query } from "@anthropic-ai/claude-agent-sdk";
import type { SDKUserMessage } from "@anthropic-ai/claude-agent-sdk";
import { Pushable } from "../utils.js";
import { discoverCustomAgents, BUILTIN_AGENT_NAMES } from "../acp-agent.js";
// `discoverCustomAgents` distinguishes user/plugin-configured agents from
// Claude Code's built-in subagents by name (BUILTIN_AGENT_NAMES), since the
// SDK's `AgentInfo` carries no built-in/source flag. That hardcoded set drifts
// silently if the SDK changes its default roster: a newly added built-in would
// leak into the ACP "Agent" picker as if the user had configured it. This
// integration test runs the real SDK so the set is flagged the moment it does.
describe.skipIf(!process.env.RUN_INTEGRATION_TESTS)("agent discovery (SDK)", () => {
it("BUILTIN_AGENT_NAMES exactly covers the SDK's default agent roster", async () => {
const input = new Pushable<SDKUserMessage>();
const q = query({
prompt: input,
options: {
systemPrompt: { type: "preset", preset: "claude_code" },
sessionId: randomUUID(),
// No setting sources → no user/project/local custom agents are loaded,
// so `supportedAgents()` reports exactly the intrinsic built-ins
// regardless of what the developer has in ~/.claude/agents.
settingSources: [],
includePartialMessages: true,
},
});
try {
const reported = (await q.supportedAgents()).map((a) => a.name).sort();
expect(reported).toEqual([...BUILTIN_AGENT_NAMES].sort());
// With the built-ins being the only agents present, discovery surfaces
// nothing — the ACP "Agent" picker is correctly omitted.
expect(await discoverCustomAgents(q)).toEqual([]);
} finally {
input.end();
q.return(undefined);
}
}, 30000);
});

View File

@@ -1,6 +1,5 @@
import { describe, expect, it, Mock, vi, afterEach, beforeEach } from "vitest";
import { ClaudeAcpAgent } from "../acp-agent.js";
import { AgentSideConnection } from "@agentclientprotocol/sdk";
import { AcpClient, ClaudeAcpAgent } from "../acp-agent.js";
const mockQuery = vi.hoisted(() =>
vi.fn(() => ({
@@ -39,7 +38,7 @@ describe("authorization", () => {
async function createAgentMock(): Promise<[ClaudeAcpAgent, Mock]> {
const connectionMock = {
sessionUpdate: async (_: any) => {},
} as AgentSideConnection;
} as AcpClient;
const agent = new ClaudeAcpAgent(connectionMock);

View File

@@ -1,7 +1,7 @@
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
import { AgentSideConnection, RequestError, SessionNotification } from "@agentclientprotocol/sdk";
import { RequestError, SessionNotification } from "@agentclientprotocol/sdk";
import type { Options } from "@anthropic-ai/claude-agent-sdk";
import type { ClaudeAcpAgent as ClaudeAcpAgentType } from "../acp-agent.js";
import type { AcpClient, ClaudeAcpAgent as ClaudeAcpAgentType } from "../acp-agent.js";
import * as fs from "node:fs";
import * as os from "node:os";
import * as path from "node:path";
@@ -47,13 +47,13 @@ describe("createSession options merging", () => {
let agent: ClaudeAcpAgentType;
let ClaudeAcpAgent: typeof ClaudeAcpAgentType;
function createMockClient(): AgentSideConnection {
function createMockClient(): AcpClient {
return {
sessionUpdate: async (_notification: SessionNotification) => {},
requestPermission: async () => ({ outcome: { outcome: "cancelled" } }),
readTextFile: async () => ({ content: "" }),
writeTextFile: async () => ({}),
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
}
beforeEach(async () => {
@@ -550,14 +550,15 @@ describe("createSession options merging", () => {
});
it("rejects a cwd that points at a file with invalidParams", async () => {
const file = path.join(os.tmpdir(), "claude-acp-cwd-is-a-file.txt");
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "claude-acp-cwd-is-a-file-"));
const file = path.join(dir, "not-a-directory.txt");
fs.writeFileSync(file, "not a directory");
try {
await expect(agent.newSession({ cwd: file, mcpServers: [] })).rejects.toMatchObject({
code: RequestError.invalidParams().code,
});
} finally {
fs.rmSync(file, { force: true });
fs.rmSync(dir, { recursive: true, force: true });
}
});
@@ -612,4 +613,127 @@ describe("createSession options merging", () => {
expect(capturedOptions!.disallowedTools).not.toContain("AskUserQuestion");
});
});
describe("refusal fallback dialog", () => {
it("declares the dialog kind and callback when the client supports form elicitation", async () => {
await agent.initialize({
protocolVersion: 1,
clientCapabilities: { elicitation: { form: {} } },
});
await agent.newSession({ cwd: process.cwd(), mcpServers: [] });
expect(capturedOptions!.supportedDialogKinds).toEqual(["refusal_fallback_prompt"]);
expect(typeof capturedOptions!.onUserDialog).toBe("function");
});
it("omits the dialog wiring without form elicitation support (url-only included)", async () => {
await agent.initialize({
protocolVersion: 1,
clientCapabilities: { elicitation: { url: {} } },
});
await agent.newSession({ cwd: process.cwd(), mcpServers: [] });
// The CLI fails closed on the undeclared kind, so the flow degrades to
// the classic refusal error instead of parking a dialog we can't render.
expect(capturedOptions!.supportedDialogKinds).toBeUndefined();
expect(capturedOptions!.onUserDialog).toBeUndefined();
});
/** Wire the session up with form support and return the captured dialog
* callback plus a mock the test can point the elicitation response at. */
async function setupDialog() {
await agent.initialize({
protocolVersion: 1,
clientCapabilities: { elicitation: { form: {} } },
});
await agent.newSession({ cwd: process.cwd(), mcpServers: [] });
const createElicitation = vi.fn();
(
agent as unknown as { client: { unstable_createElicitation: unknown } }
).client.unstable_createElicitation = createElicitation;
return { onUserDialog: capturedOptions!.onUserDialog!, createElicitation };
}
const signal = () => ({ signal: new AbortController().signal });
it("renders the prompt as a form elicitation and maps the retry choice", async () => {
const { onUserDialog, createElicitation } = await setupDialog();
createElicitation.mockResolvedValue({
action: "accept",
content: { choice: "retry_fallback" },
});
const result = await onUserDialog(
{
dialogKind: "refusal_fallback_prompt",
payload: {
originalModel: "claude-fable-5",
fallbackModel: "claude-opus-4-8",
apiRefusalCategory: "cyber",
},
},
signal(),
);
expect(result).toEqual({ behavior: "completed", result: "retry_fallback" });
const request = createElicitation.mock.calls[0][0];
expect(request.mode).toBe("form");
expect(request.message).toContain("claude-fable-5");
expect(request.message).toContain("claude-opus-4-8");
});
it("completes with cancelled when the user keeps the refusal", async () => {
const { onUserDialog, createElicitation } = await setupDialog();
createElicitation.mockResolvedValue({ action: "cancel" });
const result = await onUserDialog(
{
dialogKind: "refusal_fallback_prompt",
payload: { originalModel: "a", fallbackModel: "b" },
},
signal(),
);
expect(result).toEqual({ behavior: "completed", result: "cancelled" });
});
it("cancels unrecognized dialog kinds without presenting anything", async () => {
const { onUserDialog, createElicitation } = await setupDialog();
const result = await onUserDialog(
{ dialogKind: "some_future_dialog", payload: {} },
signal(),
);
expect(result).toEqual({ behavior: "cancelled" });
expect(createElicitation).not.toHaveBeenCalled();
});
it("cancels on a malformed payload without presenting anything", async () => {
const { onUserDialog, createElicitation } = await setupDialog();
const result = await onUserDialog(
{ dialogKind: "refusal_fallback_prompt", payload: { fallbackModel: 42 } },
signal(),
);
expect(result).toEqual({ behavior: "cancelled" });
expect(createElicitation).not.toHaveBeenCalled();
});
it("cancels when the elicitation request fails", async () => {
const { onUserDialog, createElicitation } = await setupDialog();
createElicitation.mockRejectedValue(new Error("client exploded"));
const result = await onUserDialog(
{
dialogKind: "refusal_fallback_prompt",
payload: { originalModel: "a", fallbackModel: "b" },
},
signal(),
);
expect(result).toEqual({ behavior: "cancelled" });
});
});
});

View File

@@ -11,7 +11,10 @@ import {
AskUserQuestion,
createElicitationResponseToElicitResult,
extractAskUserQuestions,
extractRefusalFallbackPrompt,
mcpElicitationToCreateRequest,
refusalFallbackResultFromResponse,
refusalFallbackToCreateRequest,
} from "../elicitation.js";
const SESSION_ID = "session-1";
@@ -19,7 +22,7 @@ const SESSION_ID = "session-1";
/**
* Build a question matching the SDK's (strict) AskUserQuestion schema while
* keeping test sites terse. Option descriptions default to "" (the tool always
* provides one); pass a description to exercise the "label — description" title.
* provides one); pass a description to exercise the enum option's description.
*/
function mkQuestion(
question: string,
@@ -124,6 +127,14 @@ describe("createElicitationResponseToElicitResult", () => {
createElicitationResponseToElicitResult({ action: "cancel" } as CreateElicitationResponse),
).toEqual({ action: "cancel" });
});
it("maps a custom/future action to cancel", () => {
expect(
createElicitationResponseToElicitResult({
action: "_zed/snooze",
} as CreateElicitationResponse),
).toEqual({ action: "cancel" });
});
});
describe("extractAskUserQuestions", () => {
@@ -187,14 +198,10 @@ describe("askUserQuestionsToCreateRequest", () => {
title: "Library",
description: undefined,
oneOf: [
{
const: "date-fns",
title: "date-fns — Lightweight",
// Structured description forwarded under `_meta` so clients can render
// it as secondary text instead of parsing it out of the title.
_meta: { "_claude/askUserQuestionOption": { description: "Lightweight" } },
},
// No description → no `_meta` emitted.
// The description travels in the enum option's first-class field; the
// title stays the clean label (no "label — description" flattening).
{ const: "date-fns", title: "date-fns", description: "Lightweight" },
// No description → the field is omitted entirely.
{ const: "luxon", title: "luxon" },
],
});
@@ -202,7 +209,7 @@ describe("askUserQuestionsToCreateRequest", () => {
expect(schema.properties?.["Which library?"]).toBeUndefined();
});
it("forwards option description and preview under _meta for rich clients", () => {
it("carries descriptions structurally and forwards previews under _meta", () => {
const questions = [
mkQuestion("Which layout?", [
{
@@ -223,24 +230,22 @@ describe("askUserQuestionsToCreateRequest", () => {
).requestedSchema;
const oneOf = (schema.properties?.["question_0"] as { oneOf: EnumOption[] }).oneOf;
// Both description and preview travel structurally; the title still flattens
// the description for clients that only read const/title.
// The description uses the enum option's own field; only the preview —
// which still has no structural slot — rides under `_meta`.
expect(oneOf[0]).toEqual({
const: "Grid",
title: "Grid — Cards in a responsive grid",
title: "Grid",
description: "Cards in a responsive grid",
_meta: {
"_claude/askUserQuestionOption": {
description: "Cards in a responsive grid",
preview: "```\n[ ] [ ] [ ]\n[ ] [ ] [ ]\n```",
},
},
});
// Description only → preview omitted from _meta.
expect(oneOf[1]._meta).toEqual({
"_claude/askUserQuestionOption": { description: "Stacked rows" },
});
// Neither → no _meta at all.
expect(oneOf[2]._meta).toBeUndefined();
// Description only → no _meta needed.
expect(oneOf[1]).toEqual({ const: "List", title: "List", description: "Stacked rows" });
// Neither → just the label.
expect(oneOf[2]).toEqual({ const: "Plain", title: "Plain" });
});
it("includes a per-question optional free-text custom-answer field", () => {
@@ -376,6 +381,13 @@ describe("applyAskElicitationResponse", () => {
});
});
it("returns cancel for a custom/future action it does not understand", () => {
const response = { action: "_zed/snooze" } as CreateElicitationResponse;
expect(applyAskElicitationResponse(response, toolInput, questions)).toEqual({
action: "cancel",
});
});
it("omits answers for questions the user left unanswered", () => {
const response = {
action: "accept",
@@ -389,3 +401,104 @@ describe("applyAskElicitationResponse", () => {
);
});
});
describe("extractRefusalFallbackPrompt", () => {
it("extracts required and optional fields", () => {
expect(
extractRefusalFallbackPrompt({
originalModel: "claude-fable-5",
fallbackModel: "claude-opus-4-8",
apiRefusalCategory: "cyber",
guidanceText: "You can retry with the fallback model.",
retractedMessageUuids: ["u1"],
}),
).toEqual({
originalModel: "claude-fable-5",
fallbackModel: "claude-opus-4-8",
apiRefusalCategory: "cyber",
guidanceText: "You can retry with the fallback model.",
});
});
it("returns null when a required model field is missing or mistyped", () => {
expect(extractRefusalFallbackPrompt({ fallbackModel: "claude-opus-4-8" })).toBeNull();
expect(
extractRefusalFallbackPrompt({ originalModel: 5, fallbackModel: "claude-opus-4-8" }),
).toBeNull();
});
it("normalizes a non-string category to null and drops empty guidance", () => {
expect(
extractRefusalFallbackPrompt({
originalModel: "a",
fallbackModel: "b",
apiRefusalCategory: null,
guidanceText: "",
}),
).toEqual({ originalModel: "a", fallbackModel: "b", apiRefusalCategory: null });
});
});
describe("refusalFallbackToCreateRequest", () => {
const prompt = {
originalModel: "claude-fable-5",
fallbackModel: "claude-opus-4-8",
apiRefusalCategory: "cyber" as string | null,
};
it("builds a single-choice form whose enum consts are the dialog's wire results", () => {
const request = refusalFallbackToCreateRequest(prompt, SESSION_ID) as Extract<
CreateElicitationRequest,
{ mode: "form" }
>;
expect(request.mode).toBe("form");
expect(request).toMatchObject({ sessionId: SESSION_ID });
expect(request.message).toContain("claude-fable-5");
expect(request.message).toContain("(cyber)");
expect(request.message).toContain("claude-opus-4-8");
const choice = request.requestedSchema.properties?.choice as {
type: string;
oneOf: Array<{ const: string; title: string; description?: string }>;
};
expect(choice.type).toBe("string");
expect(choice.oneOf.map((o) => o.const)).toEqual(["retry_fallback", "cancelled"]);
expect(choice.oneOf[0].title).toContain("claude-opus-4-8");
// Each option explains its consequence in the description field.
expect(choice.oneOf[0].description).toContain("claude-opus-4-8");
expect(choice.oneOf[1].description).toBeTruthy();
});
it("omits the category marker and appends guidance when provided", () => {
const request = refusalFallbackToCreateRequest(
{ ...prompt, apiRefusalCategory: null, guidanceText: "Consider rephrasing." },
SESSION_ID,
);
expect(request.message).not.toContain("(");
expect(request.message).toContain("Consider rephrasing.");
});
});
describe("refusalFallbackResultFromResponse", () => {
it("maps an accepted retry choice to retry_fallback", () => {
const response = {
action: "accept",
content: { choice: "retry_fallback" },
} as CreateElicitationResponse;
expect(refusalFallbackResultFromResponse(response)).toBe("retry_fallback");
});
it("keeps the refusal for every other outcome", () => {
const cases = [
{ action: "accept", content: { choice: "cancelled" } },
{ action: "accept", content: {} },
{ action: "accept", content: { choice: "something-new" } },
{ action: "accept" },
{ action: "decline" },
{ action: "cancel" },
] as CreateElicitationResponse[];
for (const response of cases) {
expect(refusalFallbackResultFromResponse(response)).toBe("cancelled");
}
});
});

View File

@@ -0,0 +1,341 @@
import { describe, it, expect, vi } from "vitest";
import type { ClientCapabilities, SessionNotification } from "@agentclientprotocol/sdk";
import type { ModelInfo } from "@anthropic-ai/claude-agent-sdk";
import {
buildConfigOptions,
clientSupportsBooleanConfigOptions,
createFastModeConfigOption,
fastModeStateEnabled,
resolveFastModeEnabled,
FAST_MODE_CONFIG_ID,
FAST_MODE_ON,
FAST_MODE_OFF,
ClaudeAcpAgent,
type AcpClient,
} from "../acp-agent.js";
const MODES = {
currentModeId: "default",
availableModes: [{ id: "default", name: "Default", description: "Standard behavior" }],
};
const MODELS = {
currentModelId: "claude-opus-4-8",
availableModels: [
{ modelId: "claude-opus-4-8", name: "Claude Opus", description: "Most capable" },
],
};
const MODEL_INFOS: ModelInfo[] = [
{ value: "claude-opus-4-8", displayName: "Claude Opus", description: "Most capable" },
];
describe("createFastModeConfigOption", () => {
it("produces a native boolean toggle when the client opted in", () => {
expect(createFastModeConfigOption(true, true)).toEqual({
id: FAST_MODE_CONFIG_ID,
name: "Fast mode",
description: expect.any(String),
category: "model_config",
type: "boolean",
currentValue: true,
});
});
it("falls back to an on/off select when the client did not opt in", () => {
const option = createFastModeConfigOption(false, false);
expect(option).toMatchObject({
id: FAST_MODE_CONFIG_ID,
type: "select",
category: "model_config",
currentValue: FAST_MODE_OFF,
options: [
{ value: FAST_MODE_ON, name: "On" },
{ value: FAST_MODE_OFF, name: "Off" },
],
});
expect(option).not.toHaveProperty("currentValue", true);
});
});
describe("clientSupportsBooleanConfigOptions", () => {
it("is true only when session.configOptions.boolean is present", () => {
expect(
clientSupportsBooleanConfigOptions({ session: { configOptions: { boolean: {} } } }),
).toBe(true);
});
it("is false when the capability is omitted or null at any level", () => {
expect(clientSupportsBooleanConfigOptions(undefined)).toBe(false);
expect(clientSupportsBooleanConfigOptions(null)).toBe(false);
expect(clientSupportsBooleanConfigOptions({})).toBe(false);
expect(clientSupportsBooleanConfigOptions({ session: { configOptions: {} } })).toBe(false);
expect(
clientSupportsBooleanConfigOptions({ session: { configOptions: { boolean: null } } }),
).toBe(false);
});
});
describe("resolveFastModeEnabled", () => {
const base = { sessionId: "s", configId: FAST_MODE_CONFIG_ID };
it("accepts native boolean values", () => {
expect(resolveFastModeEnabled({ ...base, type: "boolean", value: true })).toBe(true);
expect(resolveFastModeEnabled({ ...base, type: "boolean", value: false })).toBe(false);
});
it("accepts the on/off select fallback", () => {
expect(resolveFastModeEnabled({ ...base, value: FAST_MODE_ON })).toBe(true);
expect(resolveFastModeEnabled({ ...base, value: FAST_MODE_OFF })).toBe(false);
});
it("rejects any other value", () => {
expect(() => resolveFastModeEnabled({ ...base, value: "maybe" })).toThrow(
/Invalid value for config option fast/,
);
});
});
describe("fastModeStateEnabled", () => {
it("treats cooldown as on (the user's intent persists through rate-limit cooldown)", () => {
expect(fastModeStateEnabled("on")).toBe(true);
expect(fastModeStateEnabled("cooldown")).toBe(true);
expect(fastModeStateEnabled("off")).toBe(false);
});
});
describe("buildConfigOptions Fast mode", () => {
it("omits the Fast mode option when the model does not support it", () => {
const options = buildConfigOptions(MODES, MODELS, MODEL_INFOS, undefined, [], "default", {
supported: false,
enabled: false,
useBooleanOption: true,
});
expect(options.find((o) => o.id === FAST_MODE_CONFIG_ID)).toBeUndefined();
});
it("omits the Fast mode option when no fast mode state is provided", () => {
const options = buildConfigOptions(MODES, MODELS, MODEL_INFOS, undefined, [], "default");
expect(options.find((o) => o.id === FAST_MODE_CONFIG_ID)).toBeUndefined();
});
it("surfaces a boolean toggle when supported and the client opted in", () => {
const options = buildConfigOptions(MODES, MODELS, MODEL_INFOS, undefined, [], "default", {
supported: true,
enabled: true,
useBooleanOption: true,
});
expect(options).toContainEqual(createFastModeConfigOption(true, true));
});
it("surfaces a select fallback when supported but the client did not opt in", () => {
const options = buildConfigOptions(MODES, MODELS, MODEL_INFOS, undefined, [], "default", {
supported: true,
enabled: false,
useBooleanOption: false,
});
expect(options).toContainEqual(createFastModeConfigOption(false, false));
});
});
describe("setSessionConfigOption Fast mode toggle", () => {
const SESSION_ID = "fast-session";
function setup(opts: { useBooleanOption: boolean }) {
const sessionUpdates: SessionNotification[] = [];
const client = {
sessionUpdate: async (n: SessionNotification) => {
sessionUpdates.push(n);
},
requestPermission: async () => ({ outcome: { outcome: "cancelled" } }),
readTextFile: async () => ({ content: "" }),
writeTextFile: async () => ({}),
} as unknown as AcpClient;
const agent = new ClaudeAcpAgent(client);
const clientCapabilities: ClientCapabilities = opts.useBooleanOption
? { session: { configOptions: { boolean: {} } } }
: {};
(agent as unknown as { clientCapabilities: ClientCapabilities }).clientCapabilities =
clientCapabilities;
const applyFlagSettings = vi.fn();
(agent as unknown as { sessions: Record<string, unknown> }).sessions[SESSION_ID] = {
query: { applyFlagSettings },
fastModeEnabled: false,
configOptions: [createFastModeConfigOption(false, opts.useBooleanOption)],
};
return { agent, applyFlagSettings, sessionUpdates };
}
it("toggles Fast mode on/off through a boolean value", async () => {
const { agent, applyFlagSettings } = setup({ useBooleanOption: true });
const onResponse = await agent.setSessionConfigOption({
sessionId: SESSION_ID,
configId: FAST_MODE_CONFIG_ID,
type: "boolean",
value: true,
});
expect(applyFlagSettings).toHaveBeenCalledWith({ fastMode: true });
expect(onResponse.configOptions).toContainEqual(createFastModeConfigOption(true, true));
expect(
(agent as unknown as { sessions: Record<string, { fastModeEnabled: boolean }> }).sessions[
SESSION_ID
].fastModeEnabled,
).toBe(true);
const offResponse = await agent.setSessionConfigOption({
sessionId: SESSION_ID,
configId: FAST_MODE_CONFIG_ID,
type: "boolean",
value: false,
});
expect(applyFlagSettings).toHaveBeenLastCalledWith({ fastMode: false });
expect(offResponse.configOptions).toContainEqual(createFastModeConfigOption(false, true));
});
it("toggles Fast mode through the on/off select fallback", async () => {
const { agent, applyFlagSettings } = setup({ useBooleanOption: false });
const response = await agent.setSessionConfigOption({
sessionId: SESSION_ID,
configId: FAST_MODE_CONFIG_ID,
value: FAST_MODE_ON,
});
expect(applyFlagSettings).toHaveBeenCalledWith({ fastMode: true });
expect(response.configOptions).toContainEqual(createFastModeConfigOption(true, false));
});
it("does not change session state when the SDK rejects the flag", async () => {
const { agent, applyFlagSettings } = setup({ useBooleanOption: true });
applyFlagSettings.mockRejectedValueOnce(new Error("nope"));
await expect(
agent.setSessionConfigOption({
sessionId: SESSION_ID,
configId: FAST_MODE_CONFIG_ID,
type: "boolean",
value: true,
}),
).rejects.toThrow("nope");
const session = (agent as unknown as { sessions: Record<string, { fastModeEnabled: boolean }> })
.sessions[SESSION_ID];
expect(session.fastModeEnabled).toBe(false);
});
});
describe("syncFastModeState (SDK-driven state changes)", () => {
const SESSION_ID = "fast-session";
function setup(opts: { fastModeEnabled: boolean; withOption: boolean }) {
const sessionUpdates: SessionNotification[] = [];
const client = {
sessionUpdate: async (n: SessionNotification) => {
sessionUpdates.push(n);
},
requestPermission: async () => ({ outcome: { outcome: "cancelled" } }),
readTextFile: async () => ({ content: "" }),
writeTextFile: async () => ({}),
} as unknown as AcpClient;
const agent = new ClaudeAcpAgent(client);
(agent as unknown as { clientCapabilities: ClientCapabilities }).clientCapabilities = {
session: { configOptions: { boolean: {} } },
};
const session = {
query: {},
fastModeEnabled: opts.fastModeEnabled,
configOptions: opts.withOption
? [createFastModeConfigOption(opts.fastModeEnabled, true)]
: [],
};
(agent as unknown as { sessions: Record<string, unknown> }).sessions[SESSION_ID] = session;
const sync = (
agent as unknown as {
syncFastModeState: (
sessionId: string,
session: unknown,
state: string | undefined,
) => Promise<void>;
}
).syncFastModeState.bind(agent);
return { sync, session, sessionUpdates };
}
it("emits a config_option_update when the SDK reports a new state", async () => {
const { sync, session, sessionUpdates } = setup({ fastModeEnabled: false, withOption: true });
await sync(SESSION_ID, session, "on");
expect(session.fastModeEnabled).toBe(true);
expect(session.configOptions).toContainEqual(createFastModeConfigOption(true, true));
expect(sessionUpdates).toHaveLength(1);
expect(sessionUpdates[0].update).toMatchObject({
sessionUpdate: "config_option_update",
});
const updated = (
sessionUpdates[0].update as { configOptions: ReturnType<typeof createFastModeConfigOption>[] }
).configOptions;
expect(updated).toContainEqual(createFastModeConfigOption(true, true));
});
it("leaves the toggle on and quiet during a rate-limit cooldown", async () => {
const { sync, session, sessionUpdates } = setup({ fastModeEnabled: true, withOption: true });
// cooldown is a transient suspension of an already-enabled fast mode.
await sync(SESSION_ID, session, "cooldown");
expect(session.fastModeEnabled).toBe(true);
expect(sessionUpdates).toHaveLength(0);
});
it("never lets a stray cooldown spuriously enable a toggle the user has off", async () => {
const { sync, session, sessionUpdates } = setup({ fastModeEnabled: false, withOption: true });
await sync(SESSION_ID, session, "cooldown");
expect(session.fastModeEnabled).toBe(false);
expect(sessionUpdates).toHaveLength(0);
});
it("clears the toggle when the SDK reports off", async () => {
const { sync, session, sessionUpdates } = setup({ fastModeEnabled: true, withOption: true });
await sync(SESSION_ID, session, "off");
expect(session.fastModeEnabled).toBe(false);
expect(session.configOptions).toContainEqual(createFastModeConfigOption(false, true));
expect(sessionUpdates).toHaveLength(1);
});
it("is a no-op when the reported state is undefined or unchanged", async () => {
const { sync, session, sessionUpdates } = setup({ fastModeEnabled: false, withOption: true });
await sync(SESSION_ID, session, undefined);
await sync(SESSION_ID, session, "off");
expect(sessionUpdates).toHaveLength(0);
});
it("preserves the retained setting (no clobber) when the model has no Fast mode option", async () => {
// Model without fast support: the SDK reports a capability-driven state, not
// the user's intent. We must leave session.fastModeEnabled untouched so it's
// correct when a supporting model is reselected — reconciling here was the
// original intent-clobber bug.
const enabledCase = setup({ fastModeEnabled: true, withOption: false });
await enabledCase.sync(SESSION_ID, enabledCase.session, "off");
expect(enabledCase.session.fastModeEnabled).toBe(true);
expect(enabledCase.sessionUpdates).toHaveLength(0);
const disabledCase = setup({ fastModeEnabled: false, withOption: false });
await disabledCase.sync(SESSION_ID, disabledCase.session, "on");
expect(disabledCase.session.fastModeEnabled).toBe(false);
expect(disabledCase.sessionUpdates).toHaveLength(0);
});
});

View File

@@ -0,0 +1,272 @@
import { describe, it, expect } from "vitest";
import { randomUUID } from "crypto";
import { query } from "@anthropic-ai/claude-agent-sdk";
import type { ModelInfo } from "@anthropic-ai/claude-agent-sdk";
import {
resolveModelPreference,
applyAvailableModelsAllowlist,
matchResumedModel,
} from "../acp-agent.js";
// Mirrors a real `supportedModels()` response: alias rows carry
// `resolvedModel`, and "Sonnet 5" has no `major.minor` dot unlike older
// "claude-opus-4-6"-style ids.
const LIVE_SHAPED_MODELS: ModelInfo[] = [
{
value: "default",
resolvedModel: "claude-opus-4-8[1m]",
displayName: "Default (recommended)",
description: "Use the default model (currently Opus 4.8 (1M context))",
},
{
value: "opus[1m]",
resolvedModel: "claude-opus-4-8[1m]",
displayName: "Opus",
description: "Opus 4.8 with 1M context · Best for everyday, complex tasks",
},
{
value: "sonnet",
resolvedModel: "claude-sonnet-5",
displayName: "Sonnet",
description: "Sonnet 5 · Efficient for routine tasks",
},
{
value: "haiku",
resolvedModel: "claude-haiku-4-5-20251001",
displayName: "Haiku",
description: "Haiku 4.5 · Fastest for quick answers",
},
];
describe("resolveModelPreference - resolvedModel matching", () => {
it("matches a preference that equals an alias's resolvedModel exactly", () => {
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "claude-sonnet-5")?.value).toBe("sonnet");
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "claude-opus-4-8[1m]")?.value).toBe(
"opus[1m]",
);
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "claude-haiku-4-5-20251001")?.value).toBe(
"haiku",
);
});
it("is case-insensitive", () => {
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "CLAUDE-SONNET-5")?.value).toBe("sonnet");
});
it("still resolves plain aliases via the direct-match tier", () => {
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "sonnet")?.value).toBe("sonnet");
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "opus[1m]")?.value).toBe("opus[1m]");
});
it("does not let a retired dated id drift onto a same-family alias of a different generation", () => {
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "claude-sonnet-4-6")).toBeNull();
});
// "opus[1m]"'s `value` has no dotted version, just the context-hint digit
// in "[1m]" — unstripped, that reads as version "1" and blocks the match
// before the matcher reaches the description's real "4.8".
it("does not mistake an alias's context-hint suffix for its version", () => {
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "claude-opus-4-8")?.value).toBe("opus[1m]");
});
it("returns null for a preference that matches nothing", () => {
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "claude-gpt-99")).toBeNull();
});
it("matches a '-1m' id-suffix preference against a '[1m]'-spelled resolvedModel", () => {
// Without hint canonicalization the exact tier misses and the substring
// tier lands on the bare 200k sibling, silently downgrading a 1M pin.
const models: ModelInfo[] = [
{
value: "sonnet",
resolvedModel: "claude-sonnet-5",
displayName: "Sonnet",
description: "Sonnet 5 · Efficient for routine tasks",
},
{
value: "sonnet[1m]",
resolvedModel: "claude-sonnet-5[1m]",
displayName: "Sonnet",
description: "Sonnet 5 with 1M context",
},
];
expect(resolveModelPreference(models, "claude-sonnet-5-1m")?.value).toBe("sonnet[1m]");
});
it("matches a '-1m'-suffix alias directly against a '[1m]'-spelled value", () => {
expect(resolveModelPreference(LIVE_SHAPED_MODELS, "opus-1m")?.value).toBe("opus[1m]");
});
// Rows without resolvedModel (older SDKs, allowlist-synthesized entries,
// option-derived lists) can't use the exact resolved tier, so the hinted
// preference must not be absorbed by the bare sibling in the substring
// tier — the tokenized tier scores the hinted row correctly instead.
it("does not let a bare sibling absorb a hinted preference when resolvedModel is absent", () => {
const models: ModelInfo[] = [
{ value: "sonnet", displayName: "Sonnet", description: "" },
{ value: "sonnet[1m]", displayName: "Sonnet", description: "" },
];
expect(resolveModelPreference(models, "claude-sonnet-5[1m]")?.value).toBe("sonnet[1m]");
expect(resolveModelPreference(models, "claude-sonnet-5-1m")?.value).toBe("sonnet[1m]");
// Bare preferences still land on the bare row via the substring tier.
expect(resolveModelPreference(models, "claude-sonnet-5")?.value).toBe("sonnet");
});
});
describe("matchResumedModel", () => {
// Environment shape from issue #845: the default resolves to Sonnet, the
// session was explicitly switched to Opus before the process restart.
const SONNET_DEFAULT_MODELS: ModelInfo[] = [
{
value: "default",
resolvedModel: "claude-sonnet-5",
displayName: "Default (recommended)",
description: "Use the default model (currently Sonnet 5)",
},
{
value: "opus",
resolvedModel: "claude-opus-4-6[1m]",
displayName: "Opus",
description: "Opus 4.6 · Most capable for complex work",
},
{
value: "sonnet",
resolvedModel: "claude-sonnet-5",
displayName: "Sonnet",
description: "Sonnet 5 · Efficient for routine tasks",
},
{
value: "sonnet[1m]",
resolvedModel: "claude-sonnet-5[1m]",
displayName: "Sonnet",
description: "Sonnet 5 with 1M context",
},
];
it("maps an explicitly-switched session's live model to its picker alias", () => {
expect(matchResumedModel(SONNET_DEFAULT_MODELS, "claude-opus-4-6").value).toBe("opus");
expect(matchResumedModel(SONNET_DEFAULT_MODELS, "claude-opus-4-6[1m]").value).toBe("opus");
});
it("keeps Default selected when the live model is what Default resolves to", () => {
expect(matchResumedModel(SONNET_DEFAULT_MODELS, "claude-sonnet-5").value).toBe("default");
});
it("prefers an exact named-row resolvedModel match over the hint-stripped Default tier", () => {
// "claude-sonnet-5[1m]" differs from Default's "claude-sonnet-5" only by
// the context hint; stripping both would misreport the explicit 1M row as
// Default (and infer the wrong context window downstream). Both hint
// spellings must land on the row regardless of which one it uses.
expect(matchResumedModel(SONNET_DEFAULT_MODELS, "claude-sonnet-5[1m]").value).toBe(
"sonnet[1m]",
);
expect(matchResumedModel(SONNET_DEFAULT_MODELS, "claude-sonnet-5-1m").value).toBe("sonnet[1m]");
});
it("normalizes the '-1m' id-suffix hint form and casing against Default's resolution", () => {
expect(matchResumedModel(LIVE_SHAPED_MODELS, "claude-opus-4-8-1m").value).toBe("default");
expect(matchResumedModel(LIVE_SHAPED_MODELS, "Claude-Opus-4-8[1M]").value).toBe("default");
});
it("prefers Default over a named row sharing the identical resolvedModel", () => {
// "opus[1m]" carries the same resolvedModel as Default; the live id can't
// tell the two apart, so a never-customized session stays on Default.
expect(matchResumedModel(LIVE_SHAPED_MODELS, "claude-opus-4-8[1m]").value).toBe("default");
});
it("ignores '[1m]' context hints when comparing against Default's resolution", () => {
// The transcript-restored model drops the "[1m]" context hint, so a
// session that never left the 1M-context default resumes as the bare id.
expect(matchResumedModel(LIVE_SHAPED_MODELS, "claude-opus-4-8").value).toBe("default");
});
it("still resolves non-default live models against the picker entries", () => {
expect(matchResumedModel(LIVE_SHAPED_MODELS, "claude-sonnet-5").value).toBe("sonnet");
expect(matchResumedModel(LIVE_SHAPED_MODELS, "claude-haiku-4-5-20251001").value).toBe("haiku");
});
it("tracks a live model with no picker counterpart verbatim", () => {
const result = matchResumedModel(LIVE_SHAPED_MODELS, "claude-gpt-99");
expect(result.value).toBe("claude-gpt-99");
expect(result.displayName).toBe("claude-gpt-99");
});
});
describe("applyAvailableModelsAllowlist - resolvedModel matching", () => {
it("resolves an allowlist entry pinned to a canonical resolvedModel id", () => {
const result = applyAvailableModelsAllowlist(LIVE_SHAPED_MODELS, ["claude-sonnet-5"]);
const entry = result.find((m) => m.value === "claude-sonnet-5");
expect(entry).toBeDefined();
expect(entry?.displayName).toBe("Sonnet");
});
});
describe("applyAvailableModelsAllowlist - modelOverrides", () => {
const SDK_MODELS: ModelInfo[] = [
{ value: "default", displayName: "Default", description: "Default model" },
{
value: "opus",
displayName: "Opus",
description: "Claude Opus 4.6",
supportsEffort: true,
supportedEffortLevels: ["low", "high"],
},
];
it("surfaces the override target as the value while keeping the alias's display metadata", () => {
// The override target is an opaque Bedrock ARN with no "opus" substring,
// so matching against it (instead of the "claude-opus-4-6" alias) would
// find nothing and silently drop displayName/description/supportsEffort.
const overrides = {
"claude-opus-4-6": "arn:aws:bedrock:us-west-2:111122223333:inference-profile/custom-7f3a",
};
const result = applyAvailableModelsAllowlist(SDK_MODELS, ["claude-opus-4-6"], overrides);
const entry = result.find((m) => m.value === overrides["claude-opus-4-6"]);
expect(entry).toEqual({
value: overrides["claude-opus-4-6"],
displayName: "Opus",
description: "Claude Opus 4.6",
supportsEffort: true,
supportedEffortLevels: ["low", "high"],
});
});
});
// Runs against the real SDK (no mocks) so the fixture above is flagged the
// moment the SDK's actual model list shape drifts from it. Requires a usable
// ANTHROPIC_API_KEY, hence opt-in via RUN_INTEGRATION_TESTS.
describe.skipIf(!process.env.RUN_INTEGRATION_TESTS)("model resolution (real SDK)", () => {
it("every model's resolvedModel (when present) resolves back to that same row", async () => {
const q = query({ prompt: "hi", options: { sessionId: randomUUID() } });
try {
const models = await q.supportedModels();
expect(models.length).toBeGreaterThan(0);
for (const model of models) {
// "default" shares a resolvedModel with the CLI's recommended named
// alias, and resolution intentionally prefers that alias on a tie.
if (!model.resolvedModel || model.value === "default") continue;
const resolved = resolveModelPreference(models, model.resolvedModel);
expect(resolved?.value).toBe(model.value);
}
} finally {
q.return(undefined);
}
}, 30000);
it("resolves the well-known 'sonnet' and 'opus' aliases to a model bearing their family name", async () => {
const q = query({ prompt: "hi", options: { sessionId: randomUUID() } });
try {
const models = await q.supportedModels();
const sonnet = resolveModelPreference(models, "sonnet");
expect(sonnet?.resolvedModel?.toLowerCase()).toContain("sonnet");
const opus = resolveModelPreference(models, "opus");
expect(opus?.resolvedModel?.toLowerCase()).toContain("opus");
} finally {
q.return(undefined);
}
}, 30000);
});

View File

@@ -29,6 +29,13 @@ describe("resolvePermissionMode", () => {
expect(resolvePermissionMode("bypass")).toBe("bypassPermissions");
});
it("resolves 'manual' as an alias for 'default'", () => {
const { logger, error } = mockLogger();
expect(resolvePermissionMode("manual", logger)).toBe("default");
expect(resolvePermissionMode("Manual", logger)).toBe("default");
expect(error).not.toHaveBeenCalled();
});
it("trims whitespace", () => {
expect(resolvePermissionMode(" dontAsk ")).toBe("dontAsk");
});

View File

@@ -1,7 +1,7 @@
import { describe, it, expect, beforeEach, vi } from "vitest";
import { AgentSideConnection, SessionNotification } from "@agentclientprotocol/sdk";
import { SessionNotification } from "@agentclientprotocol/sdk";
import type { ModelInfo } from "@anthropic-ai/claude-agent-sdk";
import type { ClaudeAcpAgent as ClaudeAcpAgentType } from "../acp-agent.js";
import type { AcpClient, ClaudeAcpAgent as ClaudeAcpAgentType } from "../acp-agent.js";
const { registerHookCallbackSpy } = vi.hoisted(() => ({
registerHookCallbackSpy: vi.fn(),
@@ -84,7 +84,7 @@ describe("session config options", () => {
let setModelSpy: ReturnType<typeof vi.fn>;
let applyFlagSettingsSpy: ReturnType<typeof vi.fn>;
function createMockClient(): AgentSideConnection {
function createMockClient(): AcpClient {
return {
sessionUpdate: async (notification: SessionNotification) => {
sessionUpdates.push(notification);
@@ -92,7 +92,7 @@ describe("session config options", () => {
requestPermission: async () => ({ outcome: { outcome: "cancelled" } }),
readTextFile: async () => ({ content: "" }),
writeTextFile: async () => ({}),
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
}
function populateSession() {
@@ -113,17 +113,17 @@ describe("session config options", () => {
settingsManager: {},
modes: structuredClone(MOCK_MODES),
models: structuredClone(MOCK_MODELS),
modelInfos: MOCK_MODELS.availableModels.map(
(m): ModelInfo => ({
value: m.modelId,
displayName: m.name,
description: m.description,
supportsEffort: true,
supportedEffortLevels: ["low", "medium", "high"],
}),
),
modelInfos: MOCK_MODELS.availableModels.map((m): ModelInfo => ({
value: m.modelId,
displayName: m.name,
description: m.description,
supportsEffort: true,
supportedEffortLevels: ["low", "medium", "high"],
})),
configOptions: structuredClone(MOCK_CONFIG_OPTIONS),
contextWindowSize: 200000,
toolUseCache: {},
emittedToolCalls: new Set(),
};
}
@@ -819,6 +819,85 @@ describe("session config options", () => {
expect(setModelSpy).toHaveBeenCalledWith("claude-sonnet-4-6");
});
// Option entries carry no resolvedModel, so alias resolution must consult
// session.modelInfos — otherwise a full model id in either hint spelling
// ("[1m]"/"-1m") falls to the substring tier and lands on the bare 200k
// sibling, silently downgrading the session's context lane.
it("resolves a full model id onto its hinted row via session.modelInfos", async () => {
const session = (agent as unknown as { sessions: Record<string, any> }).sessions[SESSION_ID];
session.models = {
currentModelId: "sonnet",
availableModels: [
{ modelId: "sonnet", name: "Sonnet", description: "" },
{ modelId: "sonnet[1m]", name: "Sonnet", description: "" },
],
};
session.modelInfos = [
{
value: "sonnet",
resolvedModel: "claude-sonnet-5",
displayName: "Sonnet",
description: "",
},
{
value: "sonnet[1m]",
resolvedModel: "claude-sonnet-5[1m]",
displayName: "Sonnet",
description: "",
},
];
session.configOptions = session.configOptions.map((o: { id: string }) =>
o.id === "model"
? {
...o,
currentValue: "sonnet",
options: [
{ value: "sonnet", name: "Sonnet" },
{ value: "sonnet[1m]", name: "Sonnet" },
],
}
: o,
);
await agent.setSessionConfigOption({
sessionId: SESSION_ID,
configId: "model",
value: "claude-sonnet-5[1m]",
});
expect(setModelSpy).toHaveBeenCalledWith("sonnet[1m]");
setModelSpy.mockClear();
await agent.setSessionConfigOption({
sessionId: SESSION_ID,
configId: "model",
value: "claude-sonnet-5-1m",
});
expect(setModelSpy).toHaveBeenCalledWith("sonnet[1m]");
});
// A session can be running a model with no picker entry (resumed onto a
// model excluded by the availableModels allowlist, or a refusal
// fallback); its verbatim id is then the option's currentValue. A client
// round-tripping that reported value must not get "Invalid value".
it("accepts the reported currentValue even when it has no options entry", async () => {
const session = (agent as unknown as { sessions: Record<string, any> }).sessions[SESSION_ID];
session.models = { ...session.models, currentModelId: "claude-offlist-9" };
session.configOptions = session.configOptions.map((o: { id: string }) =>
o.id === "model" ? { ...o, currentValue: "claude-offlist-9" } : o,
);
const response = await agent.setSessionConfigOption({
sessionId: SESSION_ID,
configId: "model",
value: "claude-offlist-9",
});
expect(setModelSpy).toHaveBeenCalledWith("claude-offlist-9");
expect(response.configOptions?.find((o) => o.id === "model")?.currentValue).toBe(
"claude-offlist-9",
);
});
it("setSessionMode also syncs configOptions", async () => {
await agent.setSessionMode({ sessionId: SESSION_ID, modeId: "plan" });
@@ -1113,6 +1192,10 @@ describe("session config options", () => {
],
};
// The tool_call was already surfaced (by the streamed tool_use chunk), so
// the permission request won't re-emit one — keep this focused on options.
session.emittedToolCalls.add("toolu_1");
const canUseTool = (agent as any).canUseTool(SESSION_ID);
const signal = new AbortController().signal;
try {
@@ -1144,6 +1227,10 @@ describe("session config options", () => {
],
};
permissionResponse = { outcome: { outcome: "selected", optionId: "auto" } };
// The tool_call was already surfaced (by the streamed tool_use chunk), so
// the permission request won't re-emit one — the deny path below should
// produce no session updates at all.
session.emittedToolCalls.add("toolu_2");
const canUseTool = (agent as any).canUseTool(SESSION_ID);
const result = await canUseTool(
@@ -1172,6 +1259,10 @@ describe("session config options", () => {
],
};
// The tool_call was already surfaced (by the streamed tool_use chunk), so
// the permission request won't re-emit one — keep this focused on options.
session.emittedToolCalls.add("toolu_3");
const canUseTool = (agent as any).canUseTool(SESSION_ID);
const signal = new AbortController().signal;
try {

View File

@@ -1,18 +1,20 @@
import { describe, it, expect } from "vitest";
import { randomUUID } from "crypto";
import { AgentSideConnection, RequestError, SessionNotification } from "@agentclientprotocol/sdk";
import { RequestError, SessionNotification } from "@agentclientprotocol/sdk";
import { query, getSessionMessages } from "@anthropic-ai/claude-agent-sdk";
import { ClaudeAcpAgent } from "../acp-agent.js";
import { AcpClient, ClaudeAcpAgent } from "../acp-agent.js";
import { Pushable } from "../utils.js";
import type { SDKUserMessage } from "@anthropic-ai/claude-agent-sdk";
function createMockClient(): AgentSideConnection {
function createMockClient(
sessionUpdate: (notification: SessionNotification) => Promise<void> = async () => {},
): AcpClient {
return {
sessionUpdate: async (_notification: SessionNotification) => {},
sessionUpdate,
requestPermission: async () => ({ outcome: { outcome: "cancelled" } }),
readTextFile: async () => ({ content: "" }),
writeTextFile: async () => ({}),
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
}
describe.skipIf(!process.env.RUN_INTEGRATION_TESTS)("session load/resume lifecycle", () => {
@@ -165,7 +167,7 @@ describe.skipIf(!process.env.RUN_INTEGRATION_TESTS)("session load/resume lifecyc
requestPermission: async () => ({ outcome: { outcome: "cancelled" } }),
readTextFile: async () => ({ content: "" }),
writeTextFile: async () => ({}),
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
const commandName =
"<command-name>/model</command-name>\n <command-message>model</command-message>\n <command-args>opus</command-args>";
@@ -274,7 +276,7 @@ describe.skipIf(!process.env.RUN_INTEGRATION_TESTS)("session load/resume lifecyc
requestPermission: async () => ({ outcome: { outcome: "cancelled" } }),
readTextFile: async () => ({ content: "" }),
writeTextFile: async () => ({}),
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
// Exact shape from https://github.com/zed-industries/claude-code-acp/issues/579.
const concatenated =
@@ -330,4 +332,52 @@ describe.skipIf(!process.env.RUN_INTEGRATION_TESTS)("session load/resume lifecyc
}
expect(recordedUserChunks.some((c) => c.includes("hi"))).toBe(true);
}, 60000);
// Regression test for https://github.com/agentclientprotocol/claude-agent-acp/issues/845
// On resume the CLI restores the model the session's transcript was running,
// so loadSession must report that live model instead of recomputing the
// env/settings/default choice from scratch. Haiku is used because no account
// resolves its default there, so the restored model provably differs from
// the freshly-computed default. Requires no ANTHROPIC_MODEL env var and no
// "model" key in settings.json (either would pin the model on resume and
// mask the reconciliation this test covers).
it("ACP: loadSession reports the model the resumed session is actually running", async () => {
const agentChunks: string[] = [];
const client = createMockClient(async (notification) => {
if (notification.update.sessionUpdate === "agent_message_chunk") {
const content = notification.update.content;
if (content.type === "text") agentChunks.push(content.text);
}
});
const modelOf = (opts: { id: string; currentValue?: unknown }[] | null | undefined) =>
opts?.find((o) => o.id === "model")?.currentValue;
const agent = new ClaudeAcpAgent(client);
try {
const cwd = process.cwd();
const { sessionId, configOptions } = await agent.newSession({ cwd, mcpServers: [] });
expect(modelOf(configOptions)).not.toBe("haiku");
await agent.setSessionConfigOption({ sessionId, configId: "model", value: "haiku" });
// A real turn on Haiku, so the transcript's last assistant message —
// which is what the CLI restores the model from — records it.
await agent.prompt({
sessionId,
prompt: [{ type: "text", text: "Reply with only the word OK" }],
});
await agent.closeSession({ sessionId });
const loadResp = await agent.loadSession({ sessionId, cwd, mcpServers: [] });
expect(modelOf(loadResp.configOptions)).toBe("haiku");
// And the reported option agrees with the live session (`/context`).
agentChunks.length = 0;
await agent.prompt({ sessionId, prompt: [{ type: "text", text: "/context" }] });
const liveModel = agentChunks.join("\n").match(/\*\*Model:\*\*\s*(\S+)/)?.[1];
expect(liveModel).toContain("haiku");
} finally {
await agent.dispose();
}
}, 120000);
});

View File

@@ -7,13 +7,26 @@ import * as os from "node:os";
describe("SettingsManager", () => {
let tempDir: string;
let settingsManager: SettingsManager;
let originalConfigDir: string | undefined;
beforeEach(async () => {
tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "settings-test-"));
// Isolate the user tier. resolveSettings reads the user settings.json from
// CLAUDE_CONFIG_DIR at call time; without this it falls back to the real
// ~/.claude and the developer's own settings (e.g. availableModels) leak
// into the merge, making union-based assertions fail on their machine.
originalConfigDir = process.env.CLAUDE_CONFIG_DIR;
process.env.CLAUDE_CONFIG_DIR = path.join(tempDir, "user-config");
await fs.promises.mkdir(process.env.CLAUDE_CONFIG_DIR, { recursive: true });
});
afterEach(async () => {
settingsManager?.dispose();
if (originalConfigDir === undefined) {
delete process.env.CLAUDE_CONFIG_DIR;
} else {
process.env.CLAUDE_CONFIG_DIR = originalConfigDir;
}
await fs.promises.rm(tempDir, { recursive: true, force: true });
});

View File

@@ -1,5 +1,5 @@
import { describe, it, expect, beforeEach } from "vitest";
import { AgentSideConnection, ClientCapabilities } from "@agentclientprotocol/sdk";
import { ClientCapabilities } from "@agentclientprotocol/sdk";
import { ImageBlockParam, ToolResultBlockParam } from "@anthropic-ai/sdk/resources";
import {
BetaMCPToolResultBlock,
@@ -10,7 +10,7 @@ import {
BetaBashCodeExecutionResultBlock,
BetaBashCodeExecutionToolResultBlockParam,
} from "@anthropic-ai/sdk/resources/beta.mjs";
import { toAcpNotifications, ToolUseCache, Logger } from "../acp-agent.js";
import { AcpClient, toAcpNotifications, ToolUseCache, Logger } from "../acp-agent.js";
import {
toolUpdateFromToolResult,
createPostToolUseHook,
@@ -25,7 +25,7 @@ import {
} from "../tools.js";
describe("rawOutput in tool call updates", () => {
const mockClient = {} as AgentSideConnection;
const mockClient = {} as AcpClient;
const mockLogger: Logger = { log: () => {}, error: () => {} };
it("should include rawOutput with string content for tool_result", () => {
@@ -425,7 +425,7 @@ describe("rawOutput in tool call updates", () => {
});
describe("Bash terminal output", () => {
const mockClient = {} as AgentSideConnection;
const mockClient = {} as AcpClient;
const mockLogger: Logger = { log: () => {}, error: () => {} };
const bashToolUse = {
@@ -702,6 +702,77 @@ describe("Bash terminal output", () => {
});
});
});
describe("with image array tool_result (local Bash image output path)", () => {
// The local Bash tool emits image content as
// `[{ type: "image", source: { type: "base64", ... } }]` when a
// command produces an image (e.g. piping a base64 data URI).
const makeImageBashResult = (
data: string,
media_type: "image/png" | "image/jpeg" | "image/gif" | "image/webp" = "image/png",
): ToolResultBlockParam => ({
type: "tool_result",
tool_use_id: "toolu_bash",
content: [
{
type: "image",
source: { type: "base64", media_type, data },
} as ImageBlockParam,
],
});
it("should surface image content as ACP image content (terminal disabled)", () => {
const toolResult = makeImageBashResult("iVBORw0KGgo=");
const update = toolUpdateFromToolResult(toolResult, bashToolUse, false);
expect(update.content).toEqual([
{
type: "content",
content: { type: "image", data: "iVBORw0KGgo=", mimeType: "image/png" },
},
]);
expect(update._meta).toBeUndefined();
});
it("should bypass terminal _meta even when supportsTerminalOutput is true", () => {
// Binary content cannot be streamed through the terminal-output
// _meta channel, so the fix returns ACP content directly and skips
// the terminal info/output/exit triple.
const toolResult = makeImageBashResult("iVBORw0KGgo=", "image/jpeg");
const update = toolUpdateFromToolResult(toolResult, bashToolUse, true);
expect(update.content).toEqual([
{
type: "content",
content: { type: "image", data: "iVBORw0KGgo=", mimeType: "image/jpeg" },
},
]);
expect(update._meta).toBeUndefined();
});
it("should still surface multi-block content with text + image mixed", () => {
const toolResult: ToolResultBlockParam = {
type: "tool_result",
tool_use_id: "toolu_bash",
content: [
{ type: "text", text: "generated:" },
{
type: "image",
source: { type: "base64", media_type: "image/png", data: "AAAA" },
} as ImageBlockParam,
],
};
const update = toolUpdateFromToolResult(toolResult, bashToolUse, false);
expect(update.content).toEqual([
{ type: "content", content: { type: "text", text: "generated:" } },
{
type: "content",
content: { type: "image", data: "AAAA", mimeType: "image/png" },
},
]);
});
});
});
describe("toAcpNotifications with clientCapabilities", () => {
@@ -929,7 +1000,7 @@ describe("Bash terminal output", () => {
sessionUpdate: async (notification: any) => {
hookUpdates.push(notification);
},
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
// Register hook callback by processing tool_use
toAcpNotifications(
@@ -1008,7 +1079,7 @@ describe("Bash terminal output", () => {
sessionUpdate: async (notification: any) => {
hookUpdates.push(notification);
},
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
toAcpNotifications(
[
@@ -1093,7 +1164,7 @@ describe("Bash terminal output", () => {
sessionUpdate: async (notification: any) => {
hookUpdates.push(notification);
},
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
toAcpNotifications(
[
@@ -1147,7 +1218,7 @@ describe("Bash terminal output", () => {
sessionUpdate: async (notification: any) => {
hookUpdates.push(notification);
},
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
toAcpNotifications(
[
@@ -1223,7 +1294,7 @@ describe("Bash terminal output", () => {
sessionUpdate: async (notification: any) => {
hookUpdates.push(notification);
},
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
toAcpNotifications(
[
@@ -1304,7 +1375,7 @@ describe("Bash terminal output", () => {
sessionUpdate: async (notification: any) => {
hookUpdates.push(notification);
},
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
// Step 1: Process tool_use chunk — registers the PostToolUse hook callback
const toolUseChunk = {
@@ -1404,7 +1475,7 @@ describe("Bash terminal output", () => {
sessionUpdate: async (notification: any) => {
hookUpdates.push(notification);
},
} as unknown as AgentSideConnection;
} as unknown as AcpClient;
// Process tool_use (registers hook)
toAcpNotifications(
@@ -1543,6 +1614,68 @@ describe("toolInfoFromToolUse - undefined input regression", () => {
const info = toolInfoFromToolUse(toolUse, false);
expect(info.title).toBe("Update TODOs");
});
it("ReportFindings with undefined input should not throw", () => {
const toolUse = { name: "ReportFindings", id: "toolu_findings_undef", input: undefined };
const info = toolInfoFromToolUse(toolUse, false);
expect(info.title).toBe("Report findings: none found");
expect(info.content).toEqual([]);
});
});
describe("toolInfoFromToolUse - ReportFindings", () => {
it("should summarize findings count and list each in content", () => {
const toolUse = {
name: "ReportFindings",
id: "toolu_findings_1",
input: {
findings: [
{
file: "src/foo.ts",
line: 42,
summary: "Off-by-one in loop bound",
failure_scenario: "Empty array → index out of bounds crash",
},
{
file: "src/bar.ts",
summary: "Unhandled promise rejection",
failure_scenario: "Network failure → unhandled rejection",
},
],
},
};
const info = toolInfoFromToolUse(toolUse, false);
expect(info.kind).toBe("think");
expect(info.title).toBe("Report 2 findings");
expect(info.content).toEqual([
{
type: "content",
content: { type: "text", text: "**src/foo.ts:42** — Off-by-one in loop bound" },
},
{
type: "content",
content: { type: "text", text: "**src/bar.ts** — Unhandled promise rejection" },
},
]);
});
it("should report a singular title and empty findings array", () => {
const oneFinding = {
name: "ReportFindings",
id: "toolu_findings_2",
input: { findings: [{ file: "src/baz.ts", summary: "Leak", failure_scenario: "..." }] },
};
expect(toolInfoFromToolUse(oneFinding, false).title).toBe("Report 1 finding");
const noFindings = {
name: "ReportFindings",
id: "toolu_findings_3",
input: { findings: [] },
};
expect(toolInfoFromToolUse(noFindings, false).title).toBe("Report findings: none found");
});
});
describe("planEntries - undefined input regression", () => {
@@ -1569,7 +1702,7 @@ describe("planEntries - undefined input regression", () => {
});
describe("toAcpNotifications - TodoWrite with undefined input regression", () => {
const mockClient = {} as AgentSideConnection;
const mockClient = {} as AcpClient;
const mockLogger: Logger = { log: () => {}, error: () => {} };
it("should not throw when TodoWrite tool_use has undefined input", () => {
@@ -1704,7 +1837,7 @@ describe("applyTaskCreate / applyTaskUpdate", () => {
});
describe("toAcpNotifications - Task* tools", () => {
const mockClient = {} as AgentSideConnection;
const mockClient = {} as AcpClient;
const mockLogger: Logger = { log: () => {}, error: () => {} };
it("suppresses tool_call for TaskCreate/TaskUpdate/TaskList/TaskGet on tool_use", () => {
@@ -2020,3 +2153,55 @@ describe("createTaskHook", () => {
expect(changes).toBe(0);
});
});
describe("empty message content is not emitted", () => {
const mockClient = {} as AcpClient;
const mockLogger: Logger = { log: () => {}, error: () => {} };
it("drops an empty string content instead of emitting an empty agent_message_chunk", () => {
const notifications = toAcpNotifications(
"",
"assistant",
"test-session",
{},
mockClient,
mockLogger,
);
expect(notifications).toHaveLength(0);
});
it("still emits non-empty string content", () => {
const notifications = toAcpNotifications(
"hello",
"assistant",
"test-session",
{},
mockClient,
mockLogger,
);
expect(notifications).toHaveLength(1);
expect(notifications[0].update).toMatchObject({
sessionUpdate: "agent_message_chunk",
content: { type: "text", text: "hello" },
});
});
it("drops an empty streamed text block but keeps a non-empty one", () => {
const notifications = toAcpNotifications(
[
{ type: "text", text: "" },
{ type: "text", text: "real" },
] as any,
"assistant",
"test-session",
{},
mockClient,
mockLogger,
);
expect(notifications).toHaveLength(1);
expect(notifications[0].update).toMatchObject({
sessionUpdate: "agent_message_chunk",
content: { type: "text", text: "real" },
});
});
});

View File

@@ -15,6 +15,7 @@ import {
FileWriteInput,
GlobInput,
GrepInput,
ReportFindingsInput,
TaskCreateInput,
TaskCreateOutput,
TaskUpdateInput,
@@ -371,6 +372,25 @@ export function toolInfoFromToolUse(
};
}
case "ReportFindings": {
const input = toolUse.input as ReportFindingsInput | undefined;
const findings = input?.findings ?? [];
return {
title:
findings.length === 0
? "Report findings: none found"
: `Report ${findings.length} finding${findings.length === 1 ? "" : "s"}`,
kind: "think",
content: findings.map((finding) => ({
type: "content" as const,
content: {
type: "text" as const,
text: `**${finding.file}${finding.line ? `:${finding.line}` : ""}** — ${finding.summary}`,
},
})),
};
}
case "TaskCreate": {
const input = toolUse.input as TaskCreateInput | undefined;
return {
@@ -530,7 +550,9 @@ export function toolUpdateFromToolResult(
// Extract output and exit code from either format:
// 1. BetaBashCodeExecutionResultBlock: { type: "bash_code_execution_result", stdout, stderr, return_code }
// 2. Plain string content from a regular tool_result
// 3. Array content (e.g. [{ type: "text", text: "..." }])
// 3. Array content (e.g. [{ type: "text", text: "..." }] for stdout,
// or [{ type: "image", source: {...} }] when the local Bash tool
// produces an image, e.g. piping a base64 data URI)
let output = "";
let exitCode = isError ? 1 : 0;
@@ -545,13 +567,20 @@ export function toolUpdateFromToolResult(
exitCode = bashResult.return_code;
} else if (typeof result === "string") {
output = result;
} else if (
Array.isArray(result) &&
result.length > 0 &&
"text" in result[0] &&
typeof result[0].text === "string"
) {
output = result.map((c: any) => c.text).join("\n");
} else if (Array.isArray(result) && result.length > 0) {
const textOnly = result.every(
(c: any) => c && typeof c === "object" && typeof c.text === "string",
);
if (textOnly) {
output = result.map((c: any) => c.text).join("\n");
} else {
// Image (or mixed non-text) content. Binary payloads can't be
// streamed through the terminal-output _meta channel, so bypass
// it and surface the blocks as ACP content. This handles the
// local Bash tool's image output, which previously failed the
// text-only guard and was silently dropped.
return toAcpContentUpdate(result, isError);
}
}
if (supportsTerminalOutput) {

View File

@@ -1,13 +1,7 @@
{
"extends": "@tsconfig/node22/tsconfig.json",
"compilerOptions": {
"target": "ES2021",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"lib": ["ES2021"],
"strict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"outDir": "dist",
"rootDir": "src",
"declaration": true,