Compare commits

...

16 Commits

Author SHA1 Message Date
acp-release-bot[bot]
36822c2b75 chore(main): release 0.37.0 (#690)
🤖 I have created a release *beep* *boop*
---


##
[0.37.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.36.1...v0.37.0)
(2026-05-21)


### Features

* add 'Default' option to effort level config
([#701](https://github.com/agentclientprotocol/claude-agent-acp/issues/701))
([9e259d1](9e259d128a))
* **deps:** bump the claude-agent-sdk to 0.3.146
([#700](https://github.com/agentclientprotocol/claude-agent-acp/issues/700))
([72875b2](72875b248c))
* **deps:** bump the minor group with 13 updates
([#689](https://github.com/agentclientprotocol/claude-agent-acp/issues/689))
([f66bc31](f66bc31ae4))
* Emit tool calls for memory recall events
([#703](https://github.com/agentclientprotocol/claude-agent-acp/issues/703))
([a0bfb98](a0bfb98ba7)),
closes
[#650](https://github.com/agentclientprotocol/claude-agent-acp/issues/650)


### Bug Fixes

* Avoid cross-version model alias matches
([#702](https://github.com/agentclientprotocol/claude-agent-acp/issues/702))
([e1e1c69](e1e1c69029))
* Avoid redundant initial model sync
([#704](https://github.com/agentclientprotocol/claude-agent-acp/issues/704))
([b275f6f](b275f6ff7f)),
closes
[#646](https://github.com/agentclientprotocol/claude-agent-acp/issues/646)
* Don't expose /clear in commands
([#705](https://github.com/agentclientprotocol/claude-agent-acp/issues/705))
([cfce130](cfce130707))
* emit "cancelled" instead of "end_turn" when the session was
interrupted.
([#694](https://github.com/agentclientprotocol/claude-agent-acp/issues/694))
([2414a6f](2414a6f98b))
* Recover prompt stream after a failed turn
([#706](https://github.com/agentclientprotocol/claude-agent-acp/issues/706))
([2711f50](2711f506d5)),
closes
[#654](https://github.com/agentclientprotocol/claude-agent-acp/issues/654)

---
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-05-22 00:15:02 +02:00
AceGain
9e259d128a feat: add 'Default' option to effort level config (#701)
Add a "Default" selection to the effort level config option, allowing
users to let the SDK decide the effort level instead of forcing a
specific level. When "default" is selected, applyFlagSettings is called
with effortLevel: undefined, clearing any previous override.

Replaces the previous fallback logic (xhigh -> high ->
supportedLevels[0]) with a simpler "default" fallback that lets the SDK
use its own default.

Please,agree it. The third-party model may not support the 'Effort', or
not support 'high' and 'xhigh'. We need it.

---------

Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
2026-05-21 22:11:14 +00:00
Ben Brandt
2711f506d5 fix: Recover prompt stream after a failed turn (#706)
When a prompt errors mid-turn (e.g. a 400/529 from the API), the SDK
leaves a trailing session_state_changed: idle in the query iterator.
The next prompt's first query.next() consumed that stale idle and
short-circuited to end_turn with zero usage, shifting every subsequent
response one slot late until the session was restarted.

In the catch block, call query.interrupt() and drain the iterator
until the trailing idle is consumed (bounded so a misbehaving SDK
can't hang the next prompt). In the finally block, on the error path,
resolve all queued pending prompts as cancelled — the previous code
only resolved one (with handoff semantics), leaking the rest forever.

Closes #654
Supersedes #659, #660, #691
2026-05-21 22:03:39 +00:00
Genhao Liu
2414a6f98b fix: emit "cancelled" instead of "end_turn" when the session was interrupted. (#694)
### Summary

Fix session_state_changed: idle handler to check session.cancelled,
ensuring the prompt response returns stopReason:
  "cancelled" instead of "end_turn" when the session was interrupted.

### Problem

When a client sends session/cancel, the cancel() method sets
session.cancelled = true and calls query.interrupt(). The
SDK then transitions to idle state and emits a session_state_changed
event with state: "idle". However, the handler
for this event returns the prompt response immediately without checking
session.cancelled:

```
  case "session_state_changed": {
    if (message.state === "idle") {
      return { stopReason, usage: sessionUsage(session) };  // stopReason defaults to "end_turn"
    }
    break;
  }
```
Since stopReason is initialized as "end_turn" and may not have been
updated to "cancelled" by a preceding result
message (the result handler at line 601 does check session.cancelled),
the prompt response can incorrectly report
  stopReason: "end_turn" when the turn was actually cancelled.

This causes clients (e.g. JetBrains AI Assistant) to treat the turn as
completed normally rather than cancelled,
  leaving the frontend UI stuck in a "running" state.

### Fix

Check session.cancelled in the session_state_changed: idle handler,
mirroring the checks already present in the done
  handler (line 464) and the result handler (line 601):

```
  case "session_state_changed": {
    if (message.state === "idle") {
      if (session.cancelled) {
        stopReason = "cancelled";
      }
      return { stopReason, usage: sessionUsage(session) };
    }
    break;
  }
```

Per the ACP spec, upon receiving session/cancel the agent must respond
to the original session/prompt request with
StopReason::Cancelled. This fix ensures that obligation is met
regardless of which message type triggers the prompt
  response.

### Test plan

- Start a session, send a prompt, then immediately cancel — verify the
prompt response returns stopReason: "cancelled"
   and the client UI transitions out of "running" state
- Start a session, send a prompt, let it complete normally — verify
stopReason remains "end_turn" (no false
  cancellation)
  - Existing test suite passes (npm run test:run)
2026-05-21 22:00:44 +00:00
Ben Brandt
cfce130707 fix: Don't expose /clear in commands (#705)
Closes #657

This probably isn't the desired fix, but as /clear creates a new
session, it breaks a lot of guarantees on ACP's usage of session ids we
want to uphold. Given you can do session/new to get the same effect, it
seems safer.
2026-05-21 21:31:53 +00:00
Ben Brandt
b275f6ff7f fix: Avoid redundant initial model sync (#704)
Addresses #646
2026-05-21 21:07:46 +00:00
Ben Brandt
a0bfb98ba7 feat: Emit tool calls for memory recall events (#703)
Closes #650
2026-05-21 21:05:45 +00:00
Ben Brandt
e1e1c69029 fix: Avoid cross-version model alias matches (#702)
Partially addresses #639

Deduping may reintroduce issues from #620 so going to hold off on that
for now.
2026-05-21 20:49:29 +00:00
dependabot[bot]
72875b248c feat(deps): bump the claude-agent-sdk to 0.3.146 (#700)
Bumps the minor group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
|
[@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript)
| `0.3.143` | `0.3.146` |
|
[@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript)
| `0.96.0` | `0.97.1` |
|
[@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)
| `25.9.0` | `25.9.1` |
|
[vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)
| `4.1.6` | `4.1.7` |
| [hono](https://github.com/honojs/hono) | `4.12.19` | `4.12.21` |


Updates `@anthropic-ai/claude-agent-sdk` from 0.3.143 to 0.3.146
<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.146</h2>
<h2>What's changed</h2>
<ul>
<li>Updated to parity with Claude Code v2.1.146</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.146
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.146
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.146
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.146
</code></pre>
<h2>v0.3.145</h2>
<h2>What's changed</h2>
<ul>
<li>Updated to parity with Claude Code v2.1.145</li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.145
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.145
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.145
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.145
</code></pre>
<h2>v0.3.144</h2>
<h2>What's changed</h2>
<ul>
<li>Assistant messages and <code>StopFailure</code> hooks now report
<code>error: 'model_not_found'</code> when the selected model doesn't
exist or isn't available, instead of the generic
<code>'invalid_request'</code>. The <code>api_error_status</code> field
on result messages is now documented.</li>
<li>Added <code>@anthropic-ai/claude-agent-sdk/extract</code> export for
<code>bun build --compile</code> consumers: import the platform native
binary with <code>with { type: 'file' }</code>, call
<code>extractFromBunfs(binPath)</code> to copy it out of the compiled
executable's virtual filesystem, and pass the result to
<code>options.pathToClaudeCodeExecutable</code></li>
</ul>
<h2>Update</h2>
<pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.144
# or
yarn add @anthropic-ai/claude-agent-sdk@0.3.144
# or
pnpm add @anthropic-ai/claude-agent-sdk@0.3.144
# or
bun add @anthropic-ai/claude-agent-sdk@0.3.144
&lt;/tr&gt;&lt;/table&gt; 
</code></pre>
</blockquote>
<p>... (truncated)</p>
</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.146</h2>
<ul>
<li>Updated to parity with Claude Code v2.1.146</li>
</ul>
<h2>0.3.145</h2>
<ul>
<li>Updated to parity with Claude Code v2.1.145</li>
</ul>
<h2>0.3.144</h2>
<ul>
<li>Assistant messages and <code>StopFailure</code> hooks now report
<code>error: 'model_not_found'</code> when the selected model doesn't
exist or isn't available, instead of the generic
<code>'invalid_request'</code>. The <code>api_error_status</code> field
on result messages is now documented.</li>
<li>Added <code>@anthropic-ai/claude-agent-sdk/extract</code> export for
<code>bun build --compile</code> consumers: import the platform native
binary with <code>with { type: 'file' }</code>, call
<code>extractFromBunfs(binPath)</code> to copy it out of the compiled
executable's virtual filesystem, and pass the result to
<code>options.pathToClaudeCodeExecutable</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c2f379d9cf"><code>c2f379d</code></a>
chore: Update CHANGELOG.md</li>
<li><a
href="a1500f03cf"><code>a1500f0</code></a>
chore: Update CHANGELOG.md</li>
<li><a
href="e62865e42f"><code>e62865e</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.143...v0.3.146">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/sdk` from 0.96.0 to 0.97.1
<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.97.1</h2>
<h2>0.97.1 (2026-05-19)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.97.0...sdk-v0.97.1">sdk-v0.97.0...sdk-v0.97.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>runner:</strong> skip tool calls SessionToolRunner does not
own (<a
href="9987379abe">9987379</a>)</li>
</ul>
<h2>sdk: v0.97.0</h2>
<h2>0.97.0 (2026-05-19)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.96.0...sdk-v0.97.0">sdk-v0.96.0...sdk-v0.97.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>client:</strong> Add support for self-hosted sandboxes in
CMA with sandbox helpers (<a
href="659a343c82">659a343</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>typescript:</strong> upgrade tsc-multi so that it works with
Node 26 (<a
href="623f71c848">623f71c</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>tests:</strong> remove redundant File import (<a
href="cf821fcc06">cf821fc</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.97.1 (2026-05-19)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.97.0...sdk-v0.97.1">sdk-v0.97.0...sdk-v0.97.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>runner:</strong> skip tool calls SessionToolRunner does not
own (<a
href="9987379abe">9987379</a>)</li>
</ul>
<h2>0.97.0 (2026-05-19)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.96.0...sdk-v0.97.0">sdk-v0.96.0...sdk-v0.97.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>client:</strong> Add support for self-hosted sandboxes in
CMA with sandbox helpers (<a
href="659a343c82">659a343</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>typescript:</strong> upgrade tsc-multi so that it works with
Node 26 (<a
href="623f71c848">623f71c</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>tests:</strong> remove redundant File import (<a
href="cf821fcc06">cf821fc</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ac9ece3c56"><code>ac9ece3</code></a>
chore: release main</li>
<li><a
href="1987147935"><code>1987147</code></a>
fix(runner): skip tool calls SessionToolRunner does not own</li>
<li><a
href="409ff0e502"><code>409ff0e</code></a>
chore: release main (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/1052">#1052</a>)</li>
<li>See full diff in <a
href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.96.0...sdk-v0.97.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@types/node` from 25.9.0 to 25.9.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 `vitest` from 4.1.6 to 4.1.7
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitest-dev/vitest/releases">vitest's
releases</a>.</em></p>
<blockquote>
<h2>v4.1.7</h2>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li><strong>runner</strong>: Limit concurrency per task branch in
addition to per leaf callbacks (backport)  -  by <a
href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a> in <a
href="https://redirect.github.com/vitest-dev/vitest/issues/10384">vitest-dev/vitest#10384</a>
<a href="https://github.com/vitest-dev/vitest/commit/4f0f2a1ee"><!-- raw
HTML omitted -->(4f0f2)<!-- raw HTML omitted --></a></li>
</ul>
<h5>    <a
href="https://github.com/vitest-dev/vitest/compare/v4.1.6...v4.1.7">View
changes on GitHub</a></h5>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a09d47236e"><code>a09d472</code></a>
chore: release v4.1.7</li>
<li>See full diff in <a
href="https://github.com/vitest-dev/vitest/commits/v4.1.7/packages/vitest">compare
view</a></li>
</ul>
</details>
<br />

Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.143 to
0.3.146

Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.143 to
0.3.146

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.143 to
0.3.146

Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.143
to 0.3.146

Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.143 to
0.3.146

Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.143 to
0.3.146

Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.143 to
0.3.146

Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.143 to
0.3.146

Updates `@oxc-project/types` from 0.130.0 to 0.132.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/oxc-project/oxc/releases">@​oxc-project/types's
releases</a>.</em></p>
<blockquote>
<h2>oxc crates_v0.132.0</h2>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>0f26de6 ecmascript: Resolve identifier value type via tracked
constants (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22234">#22234</a>)
(Alexander Lichter)</li>
<li>c27a8cf minifier: Normalize <code>{ x: x }</code> shorthand so
adjacent-if merge is idempotent (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22401">#22401</a>)
(Dunqing)</li>
<li>e431a0e parser: Break extends clause loop on fatal error (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22517">#22517</a>)
(Boshen)</li>
<li>e9ec7c6 minifier: Fold optional chains by base nullishness (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22236">#22236</a>)
(Alexander Lichter)</li>
<li>e6090e7 transformer: Keep enum IIFE when a non-inlinable value
reference remains (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22501">#22501</a>)
(Dunqing)</li>
<li>931b7d6 transformer: Inline const enum members through type-cast
wrappers (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22500">#22500</a>)
(Dunqing)</li>
<li>b9615b2 codegen: Preserve string quotes in require() calls during
minification (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22475">#22475</a>)
(zennnnnnn11)</li>
<li>c73c159 transformer/async-to-generator: Reparent parameter
initializer scopes (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22507">#22507</a>)
(camc314)</li>
<li>ecfd3ca transformer/async-to-generator: Move only parameter bindings
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22503">#22503</a>)
(camc314)</li>
<li>3ce3431 transformer/explicit-resource-managment: Preserve shadowed
for-head block (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22451">#22451</a>)
(camc314)</li>
</ul>
<h3>⚡ Performance</h3>
<ul>
<li>ce92c6c semantic: <code>#[inline]</code>
<code>Scoping::get_binding</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22414">#22414</a>)
(Dunqing)</li>
<li>98be95c regular_expression: Track regex flags via bitflags (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22427">#22427</a>)
(Boshen)</li>
<li>dbbc059 jsdoc: Skip should_attach_jsdoc when no remaining comments
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22409">#22409</a>)
(Boshen)</li>
<li>217d7d8 minifier: Index <code>SymbolValues</code> by
<code>SymbolId</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22441">#22441</a>)
(Dunqing)</li>
<li>d782b78 minifier: Use BitSet for LiveUsageCollector live references
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22425">#22425</a>)
(Boshen)</li>
</ul>
<h2>oxc crates_v0.131.0</h2>
<h3>🚀 Features</h3>
<ul>
<li>bc91a17 codegen: Expose <code>Codegen::with_source_type</code>
method (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22432">#22432</a>)
(camc314)</li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>703557c codegen: Keep <code>exports[STR] = …</code> key as plain
string in minify (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22402">#22402</a>)
(Dunqing)</li>
<li>5ac7e79 minifier: Drop unused-var-init pure IIFEs and preserve
annotation for downstream (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22349">#22349</a>)
(Dunqing)</li>
<li>4ab57eb allocator: Fixed-size allocators use
<code>VirtualAlloc</code> on Windows (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22124">#22124</a>)
(overlookmotel)</li>
<li>66d77eb allocator: Fix segfault on Linux MUSL with fixed-size
allocators (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22388">#22388</a>)
(overlookmotel)</li>
<li>b8fbc1f transformer/object-rest-spread: Correct scope id when moving
bindings (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22419">#22419</a>)
(camc314)</li>
<li>18edc2c codegen: Keep <code>Object.defineProperty</code> property
name as plain string in minify (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22400">#22400</a>)
(Dunqing)</li>
<li>dda33de transformer/explicit-resource-management: Align lexical
binding scopes (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22320">#22320</a>)
(camc314)</li>
<li>8e79de8 transformer: Preserve for-await statement bodies (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22361">#22361</a>)
(camc314)</li>
<li>0cba210 transformer/class: Replace <code>new.target</code> in static
blocks (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22360">#22360</a>)
(camc314)</li>
<li>67ab1c9 transformer/es2018/for-await: Hoist for-await generated
bindings (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22355">#22355</a>)
(camc314)</li>
<li>c3ceb4a transformer/object-rest-spread: Use hoisted scope for
<code>for-of</code> temp refs (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22347">#22347</a>)
(camc314)</li>
</ul>
<h3>⚡ Performance</h3>
<ul>
<li>73a9043 allocator/bitset: Avoid temp heap <code>String</code>
allocation (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22403">#22403</a>)
(camc314)</li>
<li>8b2f4f9 transformer/object-rest-spread: Collect
<code>Vec&lt;SymbolId</code> over
<code>Vec&lt;BindingIdentifier&gt;</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22418">#22418</a>)
(camc314)</li>
<li>83679ea parser: Split TriviaBuilder::handle_token hot/cold paths (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22415">#22415</a>)
(Boshen)</li>
<li>2c7d781 codegen: Inline identifier-name accessors (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22411">#22411</a>)
(Boshen)</li>
<li>618bc76 diagnostics: Inline <code>OxcDiagnosticInner</code> to avoid
heap allocation (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22406">#22406</a>)
(Boshen)</li>
<li>0b4e158 parser: Reserve cap <code>2</code> for sequence expressions
vec (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22374">#22374</a>)
(camc314)</li>
<li>5f3bdd0 codegen: Add <code>#[inline]</code> to <code>code</code>,
<code>code_len</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22373">#22373</a>)
(camc314)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="63b129182d"><code>63b1291</code></a>
release(crates): oxc v0.132.0 (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22527">#22527</a>)</li>
<li><a
href="564ebbf46f"><code>564ebbf</code></a>
release(crates): oxc v0.131.0 (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/22459">#22459</a>)</li>
<li>See full diff in <a
href="https://github.com/oxc-project/oxc/commits/crates_v0.132.0/npm/oxc-types">compare
view</a></li>
</ul>
</details>
<br />

Updates `@rolldown/binding-android-arm64` from 1.0.1 to 1.0.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rolldown/rolldown/releases">@​rolldown/binding-android-arm64's
releases</a>.</em></p>
<blockquote>
<h2>v1.0.2</h2>
<h2>[1.0.2] - 2026-05-20</h2>
<h3>🚀 Features</h3>
<ul>
<li>devtools: emit package size in PackageGraphReady (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9434">#9434</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: classify package dependency types (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9427">#9427</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: map packages to modules and chunks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9426">#9426</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: mark used packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9423">#9423</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: make duplicate packages discoverable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9422">#9422</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: emit package metadata (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9421">#9421</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>update oxc to 0.132.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9449">#9449</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>update oxc to 0.131.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9424">#9424</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>allow checks.* to escalate emissions to hard errors (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9388">#9388</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>dev: support watcher options <code>include</code> and
<code>exclude</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9395">#9395</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>emit warnings for invalid pure annotations (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9381">#9381</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>hash: keep chunk file names stable when an unrelated entry is added
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9444">#9444</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>call <code>codeSplitting.groups[].name</code> in deterministic order
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9457">#9457</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>dev/lazy: make <code>resolve_id</code> idempotent when the resolved
id is already a lazy entry (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9439">#9439</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>chunk-optimization: publish absorbed dynamic-entry namespace
cross-chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9448">#9448</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>treeshake: propagate pure annotation through compound exprs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9431">#9431</a>)
by <a href="https://github.com/Dunqing"><code>@​Dunqing</code></a></li>
<li>finalizer: skip redundant init call when barrel executes in same
chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9354">#9354</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>linking: initialize wrapped ESM re-export owners (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9353">#9353</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>do not inherit __toESM across chunks for named-only external imports
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9333">#9333</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9415">#9415</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>watcher: don't write output or emit events after close() (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9328">#9328</a>)
by <a
href="https://github.com/situ2001"><code>@​situ2001</code></a></li>
<li>chunk-optimization: avoid unsafe dynamic-only merges (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9398">#9398</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>cjs: rename CJS-wrapped locals that would shadow chunk-scope names
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9392">#9392</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>dev/lazy: watch lazy modules added in rebuilds (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9391">#9391</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>rolldown_dev: move dev example to break publish cycle (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9465">#9465</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>binding: drop unsafe napi string helper, hoist transform ArcStr (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9456">#9456</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>ecmascript_utils: split rewrite_ident_reference off JsxExt trait (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9417">#9417</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>use <code>ThreadsafeFunction::call_async_catch</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9390">#9390</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>devtools: document <code>@​rolldown/debug</code> usage and package
graph consumption (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9435">#9435</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>replace <code>Inter</code> with system font stack in OG template SVG
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9240">#9240</a>)
by <a
href="https://github.com/yvbopeng"><code>@​yvbopeng</code></a></li>
<li>remove <code>output.comments</code> warning as all issues have been
resolved (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9393">#9393</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>in-depth: clarify @<strong>PURE</strong> scope and document
positions (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9389">#9389</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
<li>readme: remove release candidate notice (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9387">#9387</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>⚡ Performance</h3>
<ul>
<li>vite-resolve: cache importer existence checks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9443">#9443</a>)
by <a
href="https://github.com/Brooooooklyn"><code>@​Brooooooklyn</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/binding-android-arm64's
changelog</a>.</em></p>
<blockquote>
<h2>[1.0.2] - 2026-05-20</h2>
<h3>🚀 Features</h3>
<ul>
<li>devtools: emit package size in PackageGraphReady (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9434">#9434</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: classify package dependency types (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9427">#9427</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: map packages to modules and chunks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9426">#9426</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: mark used packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9423">#9423</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: make duplicate packages discoverable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9422">#9422</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: emit package metadata (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9421">#9421</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>update oxc to 0.132.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9449">#9449</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>update oxc to 0.131.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9424">#9424</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>allow checks.* to escalate emissions to hard errors (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9388">#9388</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>dev: support watcher options <code>include</code> and
<code>exclude</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9395">#9395</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>emit warnings for invalid pure annotations (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9381">#9381</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>hash: keep chunk file names stable when an unrelated entry is added
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9444">#9444</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>call <code>codeSplitting.groups[].name</code> in deterministic order
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9457">#9457</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>dev/lazy: make <code>resolve_id</code> idempotent when the resolved
id is already a lazy entry (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9439">#9439</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>chunk-optimization: publish absorbed dynamic-entry namespace
cross-chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9448">#9448</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>treeshake: propagate pure annotation through compound exprs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9431">#9431</a>)
by <a href="https://github.com/Dunqing"><code>@​Dunqing</code></a></li>
<li>finalizer: skip redundant init call when barrel executes in same
chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9354">#9354</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>linking: initialize wrapped ESM re-export owners (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9353">#9353</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>do not inherit __toESM across chunks for named-only external imports
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9333">#9333</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9415">#9415</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>watcher: don't write output or emit events after close() (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9328">#9328</a>)
by <a
href="https://github.com/situ2001"><code>@​situ2001</code></a></li>
<li>chunk-optimization: avoid unsafe dynamic-only merges (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9398">#9398</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>cjs: rename CJS-wrapped locals that would shadow chunk-scope names
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9392">#9392</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>dev/lazy: watch lazy modules added in rebuilds (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9391">#9391</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>rolldown_dev: move dev example to break publish cycle (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9465">#9465</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>binding: drop unsafe napi string helper, hoist transform ArcStr (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9456">#9456</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>ecmascript_utils: split rewrite_ident_reference off JsxExt trait (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9417">#9417</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>use <code>ThreadsafeFunction::call_async_catch</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9390">#9390</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>devtools: document <code>@​rolldown/debug</code> usage and package
graph consumption (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9435">#9435</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>replace <code>Inter</code> with system font stack in OG template SVG
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9240">#9240</a>)
by <a
href="https://github.com/yvbopeng"><code>@​yvbopeng</code></a></li>
<li>remove <code>output.comments</code> warning as all issues have been
resolved (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9393">#9393</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>in-depth: clarify @<strong>PURE</strong> scope and document
positions (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9389">#9389</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
<li>readme: remove release candidate notice (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9387">#9387</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>⚡ Performance</h3>
<ul>
<li>vite-resolve: cache importer existence checks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9443">#9443</a>)
by <a
href="https://github.com/Brooooooklyn"><code>@​Brooooooklyn</code></a></li>
<li>binding: reduce plugin string clones (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9436">#9436</a>)
by <a
href="https://github.com/Brooooooklyn"><code>@​Brooooooklyn</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f2757ed768"><code>f2757ed</code></a>
release: v1.0.2 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9478">#9478</a>)</li>
<li><a
href="b88de34520"><code>b88de34</code></a>
docs(devtools): document <code>@​rolldown/debug</code> usage and package
graph consumption ...</li>
<li><a
href="0f811f4d79"><code>0f811f4</code></a>
fix(hash): keep chunk file names stable when an unrelated entry is added
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9444">#9444</a>)</li>
<li><a
href="ed010fad05"><code>ed010fa</code></a>
feat(devtools): emit package size in PackageGraphReady (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9434">#9434</a>)</li>
<li><a
href="2b0bb7ffe7"><code>2b0bb7f</code></a>
feat(devtools): classify package dependency types (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9427">#9427</a>)</li>
<li><a
href="ff6fff24da"><code>ff6fff2</code></a>
fix: call <code>codeSplitting.groups[].name</code> in deterministic
order (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9457">#9457</a>)</li>
<li><a
href="81fcc89b78"><code>81fcc89</code></a>
feat(devtools): map packages to modules and chunks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9426">#9426</a>)</li>
<li><a
href="98619ddbf8"><code>98619dd</code></a>
feat(devtools): mark used packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9423">#9423</a>)</li>
<li><a
href="0c7ac80de7"><code>0c7ac80</code></a>
feat(devtools): make duplicate packages discoverable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9422">#9422</a>)</li>
<li><a
href="98e0620775"><code>98e0620</code></a>
feat(devtools): emit package metadata (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9421">#9421</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/rolldown/rolldown/commits/v1.0.2/packages/rolldown">compare
view</a></li>
</ul>
</details>
<br />

Updates `@rolldown/binding-darwin-arm64` from 1.0.1 to 1.0.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rolldown/rolldown/releases">@​rolldown/binding-darwin-arm64's
releases</a>.</em></p>
<blockquote>
<h2>v1.0.2</h2>
<h2>[1.0.2] - 2026-05-20</h2>
<h3>🚀 Features</h3>
<ul>
<li>devtools: emit package size in PackageGraphReady (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9434">#9434</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: classify package dependency types (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9427">#9427</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: map packages to modules and chunks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9426">#9426</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: mark used packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9423">#9423</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: make duplicate packages discoverable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9422">#9422</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: emit package metadata (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9421">#9421</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>update oxc to 0.132.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9449">#9449</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>update oxc to 0.131.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9424">#9424</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>allow checks.* to escalate emissions to hard errors (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9388">#9388</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>dev: support watcher options <code>include</code> and
<code>exclude</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9395">#9395</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>emit warnings for invalid pure annotations (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9381">#9381</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>hash: keep chunk file names stable when an unrelated entry is added
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9444">#9444</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>call <code>codeSplitting.groups[].name</code> in deterministic order
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9457">#9457</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>dev/lazy: make <code>resolve_id</code> idempotent when the resolved
id is already a lazy entry (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9439">#9439</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>chunk-optimization: publish absorbed dynamic-entry namespace
cross-chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9448">#9448</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>treeshake: propagate pure annotation through compound exprs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9431">#9431</a>)
by <a href="https://github.com/Dunqing"><code>@​Dunqing</code></a></li>
<li>finalizer: skip redundant init call when barrel executes in same
chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9354">#9354</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>linking: initialize wrapped ESM re-export owners (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9353">#9353</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>do not inherit __toESM across chunks for named-only external imports
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9333">#9333</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9415">#9415</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>watcher: don't write output or emit events after close() (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9328">#9328</a>)
by <a
href="https://github.com/situ2001"><code>@​situ2001</code></a></li>
<li>chunk-optimization: avoid unsafe dynamic-only merges (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9398">#9398</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>cjs: rename CJS-wrapped locals that would shadow chunk-scope names
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9392">#9392</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>dev/lazy: watch lazy modules added in rebuilds (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9391">#9391</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>rolldown_dev: move dev example to break publish cycle (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9465">#9465</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>binding: drop unsafe napi string helper, hoist transform ArcStr (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9456">#9456</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>ecmascript_utils: split rewrite_ident_reference off JsxExt trait (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9417">#9417</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>use <code>ThreadsafeFunction::call_async_catch</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9390">#9390</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>devtools: document <code>@​rolldown/debug</code> usage and package
graph consumption (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9435">#9435</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>replace <code>Inter</code> with system font stack in OG template SVG
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9240">#9240</a>)
by <a
href="https://github.com/yvbopeng"><code>@​yvbopeng</code></a></li>
<li>remove <code>output.comments</code> warning as all issues have been
resolved (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9393">#9393</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>in-depth: clarify @<strong>PURE</strong> scope and document
positions (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9389">#9389</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
<li>readme: remove release candidate notice (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9387">#9387</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>⚡ Performance</h3>
<ul>
<li>vite-resolve: cache importer existence checks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9443">#9443</a>)
by <a
href="https://github.com/Brooooooklyn"><code>@​Brooooooklyn</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/binding-darwin-arm64's
changelog</a>.</em></p>
<blockquote>
<h2>[1.0.2] - 2026-05-20</h2>
<h3>🚀 Features</h3>
<ul>
<li>devtools: emit package size in PackageGraphReady (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9434">#9434</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: classify package dependency types (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9427">#9427</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: map packages to modules and chunks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9426">#9426</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: mark used packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9423">#9423</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: make duplicate packages discoverable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9422">#9422</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: emit package metadata (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9421">#9421</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>update oxc to 0.132.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9449">#9449</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>update oxc to 0.131.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9424">#9424</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>allow checks.* to escalate emissions to hard errors (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9388">#9388</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>dev: support watcher options <code>include</code> and
<code>exclude</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9395">#9395</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>emit warnings for invalid pure annotations (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9381">#9381</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>hash: keep chunk file names stable when an unrelated entry is added
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9444">#9444</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>call <code>codeSplitting.groups[].name</code> in deterministic order
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9457">#9457</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>dev/lazy: make <code>resolve_id</code> idempotent when the resolved
id is already a lazy entry (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9439">#9439</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>chunk-optimization: publish absorbed dynamic-entry namespace
cross-chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9448">#9448</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>treeshake: propagate pure annotation through compound exprs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9431">#9431</a>)
by <a href="https://github.com/Dunqing"><code>@​Dunqing</code></a></li>
<li>finalizer: skip redundant init call when barrel executes in same
chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9354">#9354</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>linking: initialize wrapped ESM re-export owners (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9353">#9353</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>do not inherit __toESM across chunks for named-only external imports
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9333">#9333</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9415">#9415</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>watcher: don't write output or emit events after close() (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9328">#9328</a>)
by <a
href="https://github.com/situ2001"><code>@​situ2001</code></a></li>
<li>chunk-optimization: avoid unsafe dynamic-only merges (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9398">#9398</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>cjs: rename CJS-wrapped locals that would shadow chunk-scope names
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9392">#9392</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>dev/lazy: watch lazy modules added in rebuilds (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9391">#9391</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>rolldown_dev: move dev example to break publish cycle (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9465">#9465</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>binding: drop unsafe napi string helper, hoist transform ArcStr (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9456">#9456</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>ecmascript_utils: split rewrite_ident_reference off JsxExt trait (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9417">#9417</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>use <code>ThreadsafeFunction::call_async_catch</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9390">#9390</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>devtools: document <code>@​rolldown/debug</code> usage and package
graph consumption (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9435">#9435</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>replace <code>Inter</code> with system font stack in OG template SVG
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9240">#9240</a>)
by <a
href="https://github.com/yvbopeng"><code>@​yvbopeng</code></a></li>
<li>remove <code>output.comments</code> warning as all issues have been
resolved (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9393">#9393</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>in-depth: clarify @<strong>PURE</strong> scope and document
positions (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9389">#9389</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
<li>readme: remove release candidate notice (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9387">#9387</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
</ul>
<h3>⚡ Performance</h3>
<ul>
<li>vite-resolve: cache importer existence checks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9443">#9443</a>)
by <a
href="https://github.com/Brooooooklyn"><code>@​Brooooooklyn</code></a></li>
<li>binding: reduce plugin string clones (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9436">#9436</a>)
by <a
href="https://github.com/Brooooooklyn"><code>@​Brooooooklyn</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f2757ed768"><code>f2757ed</code></a>
release: v1.0.2 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9478">#9478</a>)</li>
<li><a
href="b88de34520"><code>b88de34</code></a>
docs(devtools): document <code>@​rolldown/debug</code> usage and package
graph consumption ...</li>
<li><a
href="0f811f4d79"><code>0f811f4</code></a>
fix(hash): keep chunk file names stable when an unrelated entry is added
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9444">#9444</a>)</li>
<li><a
href="ed010fad05"><code>ed010fa</code></a>
feat(devtools): emit package size in PackageGraphReady (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9434">#9434</a>)</li>
<li><a
href="2b0bb7ffe7"><code>2b0bb7f</code></a>
feat(devtools): classify package dependency types (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9427">#9427</a>)</li>
<li><a
href="ff6fff24da"><code>ff6fff2</code></a>
fix: call <code>codeSplitting.groups[].name</code> in deterministic
order (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9457">#9457</a>)</li>
<li><a
href="81fcc89b78"><code>81fcc89</code></a>
feat(devtools): map packages to modules and chunks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9426">#9426</a>)</li>
<li><a
href="98619ddbf8"><code>98619dd</code></a>
feat(devtools): mark used packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9423">#9423</a>)</li>
<li><a
href="0c7ac80de7"><code>0c7ac80</code></a>
feat(devtools): make duplicate packages discoverable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9422">#9422</a>)</li>
<li><a
href="98e0620775"><code>98e0620</code></a>
feat(devtools): emit package metadata (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9421">#9421</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/rolldown/rolldown/commits/v1.0.2/packages/rolldown">compare
view</a></li>
</ul>
</details>
<br />

Updates `@rolldown/binding-darwin-x64` from 1.0.1 to 1.0.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rolldown/rolldown/releases">@​rolldown/binding-darwin-x64's
releases</a>.</em></p>
<blockquote>
<h2>v1.0.2</h2>
<h2>[1.0.2] - 2026-05-20</h2>
<h3>🚀 Features</h3>
<ul>
<li>devtools: emit package size in PackageGraphReady (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9434">#9434</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: classify package dependency types (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9427">#9427</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: map packages to modules and chunks (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9426">#9426</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: mark used packages (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9423">#9423</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: make duplicate packages discoverable (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9422">#9422</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>devtools: emit package metadata (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9421">#9421</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>update oxc to 0.132.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9449">#9449</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>update oxc to 0.131.0 (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9424">#9424</a>)
by <a
href="https://github.com/shulaoda"><code>@​shulaoda</code></a></li>
<li>allow checks.* to escalate emissions to hard errors (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9388">#9388</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>dev: support watcher options <code>include</code> and
<code>exclude</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9395">#9395</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>emit warnings for invalid pure annotations (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9381">#9381</a>)
by <a
href="https://github.com/Kyujenius"><code>@​Kyujenius</code></a></li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>hash: keep chunk file names stable when an unrelated entry is added
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9444">#9444</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>call <code>codeSplitting.groups[].name</code> in deterministic order
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9457">#9457</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
<li>dev/lazy: make <code>resolve_id</code> idempotent when the resolved
id is already a lazy entry (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9439">#9439</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
<li>chunk-optimization: publish absorbed dynamic-entry namespace
cross-chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9448">#9448</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>treeshake: propagate pure annotation through compound exprs (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9431">#9431</a>)
by <a href="https://github.com/Dunqing"><code>@​Dunqing</code></a></li>
<li>finalizer: skip redundant init call when barrel executes in same
chunk (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9354">#9354</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>linking: initialize wrapped ESM re-export owners (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9353">#9353</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>do not inherit __toESM across chunks for named-only external imports
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9333">#9333</a>)
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9415">#9415</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>watcher: don't write output or emit events after close() (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9328">#9328</a>)
by <a
href="https://github.com/situ2001"><code>@​situ2001</code></a></li>
<li>chunk-optimization: avoid unsafe dynamic-only merges (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9398">#9398</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>cjs: rename CJS-wrapped locals that would shadow chunk-scope names
(<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9392">#9392</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>dev/lazy: watch lazy modules added in rebuilds (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9391">#9391</a>)
by <a href="https://github.com/h-a-n-a"><code>@​h-a-n-a</code></a></li>
</ul>
<h3>🚜 Refactor</h3>
<ul>
<li>rolldown_dev: move dev example to break publish cycle (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9465">#9465</a>)
by <a href="https://github.com/Boshen"><code>@​Boshen</code></a></li>
<li>binding: drop unsafe napi string helper, hoist transform ArcStr (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9456">#9456</a>)
by <a href="https://github.com/hyf0"><code>@​hyf0</code></a></li>
<li>ecmascript_utils: split rewrite_ident_reference off JsxExt trait (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9417">#9417</a>)
by <a
href="https://github.com/IWANABETHATGUY"><code>@​IWANABETHATGUY</code></a></li>
<li>use <code>ThreadsafeFunction::call_async_catch</code> (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9390">#9390</a>)
by <a
href="https://github.com/sapphi-red"><code>@​sapphi-red</code></a></li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>devtools: document <code>@​rolldown/debug</code> usage and package
graph consumption (<a
href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9435">#9435</a>)
by <a href="https://github.com/IWANABETHATGUY"><cod...

_Description has been truncated_

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-21 22:35:33 +02:00
dependabot[bot]
f66bc31ae4 feat(deps): bump the minor group with 13 updates (#689)
Bumps the minor group with 13 updates:

| Package | From | To |
| --- | --- | --- |
|
[@agentclientprotocol/sdk](https://github.com/agentclientprotocol/typescript-sdk)
| `0.22.0` | `0.22.1` |
|
[@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)
| `25.8.0` | `25.9.0` |
|
[@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin)
| `8.59.3` | `8.59.4` |
|
[@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)
| `8.59.3` | `8.59.4` |
|
[@typescript-eslint/project-service](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/project-service)
| `8.59.3` | `8.59.4` |
|
[@typescript-eslint/scope-manager](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/scope-manager)
| `8.59.3` | `8.59.4` |
|
[@typescript-eslint/tsconfig-utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/tsconfig-utils)
| `8.59.3` | `8.59.4` |
|
[@typescript-eslint/type-utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/type-utils)
| `8.59.3` | `8.59.4` |
|
[@typescript-eslint/types](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/types)
| `8.59.3` | `8.59.4` |
|
[@typescript-eslint/typescript-estree](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-estree)
| `8.59.3` | `8.59.4` |
|
[@typescript-eslint/utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils)
| `8.59.3` | `8.59.4` |
|
[@typescript-eslint/visitor-keys](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys)
| `8.59.3` | `8.59.4` |
| [qs](https://github.com/ljharb/qs) | `6.15.1` | `6.15.2` |

Updates `@agentclientprotocol/sdk` from 0.22.0 to 0.22.1
<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.22.1</h2>
<h2><a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v0.22.0...v0.22.1">0.22.1</a>
(2026-05-18)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Event ordering (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/153">#153</a>)
(<a
href="7b632266f0">7b63226</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.22.0...v0.22.1">0.22.1</a>
(2026-05-18)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Event ordering (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/153">#153</a>)
(<a
href="7b632266f0">7b63226</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="47da5c6657"><code>47da5c6</code></a>
chore(main): release 0.22.1 (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/154">#154</a>)</li>
<li><a
href="7b632266f0"><code>7b63226</code></a>
fix: Event ordering (<a
href="https://redirect.github.com/agentclientprotocol/typescript-sdk/issues/153">#153</a>)</li>
<li>See full diff in <a
href="https://github.com/agentclientprotocol/typescript-sdk/compare/v0.22.0...v0.22.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@types/node` from 25.8.0 to 25.9.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 `@typescript-eslint/eslint-plugin` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li><a
href="4302433ae6"><code>4302433</code></a>
fix(eslint-plugin): [no-floating-promises] stack overflow when using
recursiv...</li>
<li><a
href="10b79f1ba8"><code>10b79f1</code></a>
chore(deps): update dependency eslint to v10.4.0 (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/12339">#12339</a>)</li>
<li><a
href="2a6765d962"><code>2a6765d</code></a>
chore: clenaup <code>getAwaitedType</code> from
<code>typescript.d.ts</code> (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/12302">#12302</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/eslint-plugin">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/parser` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</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.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/parser">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/project-service` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li><a
href="a98fa1fd0e"><code>a98fa1f</code></a>
fix(project-service): throw error cause in
<code>getParsedConfigFileFromTSServer</code> ...</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/project-service">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/scope-manager` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</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.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/scope-manager">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/tsconfig-utils` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</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.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/tsconfig-utils">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/type-utils` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</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.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li><a
href="2a6765d962"><code>2a6765d</code></a>
chore: clenaup <code>getAwaitedType</code> from
<code>typescript.d.ts</code> (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/type-utils/issues/12302">#12302</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/type-utils">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/types` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</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.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/types">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/typescript-estree` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</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.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/typescript-estree">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/utils` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</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.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/utils">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/visitor-keys` from 8.59.3 to 8.59.4
<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.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>lumir</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">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.59.4 (2026-05-18)</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.59.4">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="ca6ca1431b"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/visitor-keys">compare
view</a></li>
</ul>
</details>
<br />

Updates `qs` from 6.15.1 to 6.15.2
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ljharb/qs/blob/main/CHANGELOG.md">qs's
changelog</a>.</em></p>
<blockquote>
<h2><strong>6.15.2</strong></h2>
<ul>
<li>[Fix] <code>stringify</code>: skip null/undefined entries in
<code>arrayFormat: 'comma'</code> + <code>encodeValuesOnly</code>
instead of crashing in <code>encoder</code></li>
<li>[Fix] <code>stringify</code>: use configured <code>delimiter</code>
after <code>charsetSentinel</code> (<a
href="https://redirect.github.com/ljharb/qs/issues/555">#555</a>)</li>
<li>[Fix] <code>stringify</code>: apply <code>formatter</code> to
encoded key under <code>strictNullHandling</code> (<a
href="https://redirect.github.com/ljharb/qs/issues/554">#554</a>)</li>
<li>[Fix] <code>stringify</code>: skip null/undefined filter-array
entries instead of crashing in <code>encoder</code> (<a
href="https://redirect.github.com/ljharb/qs/issues/551">#551</a>)</li>
<li>[Fix] <code>parse</code>: handle nested bracket groups and add
regression tests (<a
href="https://redirect.github.com/ljharb/qs/issues/530">#530</a>)</li>
<li>[readme] fix grammar (<a
href="https://redirect.github.com/ljharb/qs/issues/550">#550</a>)</li>
<li>[Dev Deps] update <code>@ljharb/eslint-config</code></li>
<li>[Tests] add regression tests for keys containing percent-encoded
bracket text</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9aca4076fe"><code>9aca407</code></a>
v6.15.2</li>
<li><a
href="5e33d33447"><code>5e33d33</code></a>
[Dev Deps] update <code>@ljharb/eslint-config</code></li>
<li><a
href="21f80b33e5"><code>21f80b3</code></a>
[Fix] <code>stringify</code>: skip null/undefined entries in
<code>arrayFormat: 'comma'</code> + `e...</li>
<li><a
href="a0a81ea207"><code>a0a81ea</code></a>
[Fix] <code>stringify</code>: use configured <code>delimiter</code>
after <code>charsetSentinel</code></li>
<li><a
href="e3062f78f5"><code>e3062f7</code></a>
[Fix] <code>stringify</code>: apply <code>formatter</code> to encoded
key under <code>strictNullHandling</code></li>
<li><a
href="0c180a40ad"><code>0c180a4</code></a>
[Fix] <code>stringify</code>: skip null/undefined filter-array entries
instead of crashi...</li>
<li><a
href="3a8b94aec1"><code>3a8b94a</code></a>
[Tests] add regression tests for keys containing percent-encoded bracket
text</li>
<li><a
href="96755abd35"><code>96755ab</code></a>
[readme] fix grammar</li>
<li><a
href="a419ce5bbf"><code>a419ce5</code></a>
[Fix] <code>parse</code>: handle nested bracket groups and add
regression tests</li>
<li>See full diff in <a
href="https://github.com/ljharb/qs/compare/v6.15.1...v6.15.2">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-05-19 06:31:55 +02:00
acp-release-bot[bot]
5b2e147b5d chore(main): release 0.36.1 (#687)
🤖 I have created a release *beep* *boop*
---


##
[0.36.1](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.36.0...v0.36.1)
(2026-05-18)


### Bug Fixes

* flaky authentication bypass for gateway
([#686](https://github.com/agentclientprotocol/claude-agent-acp/issues/686))
([db852dc](db852dcf7c))

---
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-05-18 15:33:45 +02:00
Aleksandr Suhinin
db852dcf7c fix: flaky authentication bypass for gateway (#686)
Sometimes leads to auth required error.
2026-05-18 15:31:51 +02:00
acp-release-bot[bot]
505f9c13c0 chore(main): release 0.36.0 (#683)
🤖 I have created a release *beep* *boop*
---


##
[0.36.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.35.0...v0.36.0)
(2026-05-18)


### Features

* Add experimental session delete support
([#682](https://github.com/agentclientprotocol/claude-agent-acp/issues/682))
([2162d5a](2162d5af62))
* Support experimental additionalDirectories field
([#684](https://github.com/agentclientprotocol/claude-agent-acp/issues/684))
([f37e9a0](f37e9a0d47))

---
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-05-18 13:02:28 +02:00
Ben Brandt
f37e9a0d47 feat: Support experimental additionalDirectories field (#684) 2026-05-18 10:51:45 +00:00
Ben Brandt
2162d5af62 feat: Add experimental session delete support (#682)
- **Update Agent Client Protocol SDK to 0.22.0**
- **feat: Add session delete support**
2026-05-18 10:43:07 +00:00
Ben Brandt
798844726f chore: tighten local-command-stdout handler comment and pass full options (#678)
## Summary

Follow-up cleanup to #649. Two small changes:

- **Tighten the comment block** above the marker-strip branch in
`acp-agent.ts:1119`. The original 15-line block restated history that
already lives in the PR description; replaced with a 5-line "what this
does, and why the no-op case is preserved" comment that points at the
replay path for parallel context.
- **Forward `clientCapabilities`, `parentToolUseId`, `cwd`, and
`taskState`** to `toAcpNotifications` so the new strip-and-render call
matches the sibling call below it at `acp-agent.ts:1192`. Without these
the rendered output loses threading under a wrapping tool use and skips
terminal-output detection.
- **Only log the raw payload when nothing renders** — previously every
marker-containing message was logged AND rendered. Now we render the
stripped prose if anything remains, and fall back to logging only the
pure-marker case (e.g. `/compact`).

## Test plan

- [x] `npm run check` (lint + format) — passes
- [x] `npm run build` (tsc) — passes
- [x] `stripLocalCommandMetadata` unit tests — 8 passed

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 00:45:33 +02:00
10 changed files with 1160 additions and 305 deletions

View File

@@ -1,3 +1,3 @@
{
".": "0.35.0"
".": "0.37.0"
}

View File

@@ -1,5 +1,39 @@
# Changelog
## [0.37.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.36.1...v0.37.0) (2026-05-21)
### Features
* add 'Default' option to effort level config ([#701](https://github.com/agentclientprotocol/claude-agent-acp/issues/701)) ([9e259d1](https://github.com/agentclientprotocol/claude-agent-acp/commit/9e259d128aa58dbb8107e53362781ca4e8ee071e))
* **deps:** bump the claude-agent-sdk to 0.3.146 ([#700](https://github.com/agentclientprotocol/claude-agent-acp/issues/700)) ([72875b2](https://github.com/agentclientprotocol/claude-agent-acp/commit/72875b248c7b90a89638de2f1709eec9e2153e7e))
* **deps:** bump the minor group with 13 updates ([#689](https://github.com/agentclientprotocol/claude-agent-acp/issues/689)) ([f66bc31](https://github.com/agentclientprotocol/claude-agent-acp/commit/f66bc31ae4bea73b48eeeb7f1db90c7d69cc0dac))
* Emit tool calls for memory recall events ([#703](https://github.com/agentclientprotocol/claude-agent-acp/issues/703)) ([a0bfb98](https://github.com/agentclientprotocol/claude-agent-acp/commit/a0bfb98ba73eaf37e9c071e886c054f90a5d5629)), closes [#650](https://github.com/agentclientprotocol/claude-agent-acp/issues/650)
### Bug Fixes
* Avoid cross-version model alias matches ([#702](https://github.com/agentclientprotocol/claude-agent-acp/issues/702)) ([e1e1c69](https://github.com/agentclientprotocol/claude-agent-acp/commit/e1e1c69029ef08579c841e6fbdffb32a5b94df06))
* Avoid redundant initial model sync ([#704](https://github.com/agentclientprotocol/claude-agent-acp/issues/704)) ([b275f6f](https://github.com/agentclientprotocol/claude-agent-acp/commit/b275f6ff7f0f2e21adedbd8e63a6fc3d63cbbb8d)), closes [#646](https://github.com/agentclientprotocol/claude-agent-acp/issues/646)
* Don't expose /clear in commands ([#705](https://github.com/agentclientprotocol/claude-agent-acp/issues/705)) ([cfce130](https://github.com/agentclientprotocol/claude-agent-acp/commit/cfce1307076e93f43a3ed8cc0134f9bb14a0f2d6))
* emit "cancelled" instead of "end_turn" when the session was interrupted. ([#694](https://github.com/agentclientprotocol/claude-agent-acp/issues/694)) ([2414a6f](https://github.com/agentclientprotocol/claude-agent-acp/commit/2414a6f98bec5bf50f3a13af528aa38d5a0fc974))
* Recover prompt stream after a failed turn ([#706](https://github.com/agentclientprotocol/claude-agent-acp/issues/706)) ([2711f50](https://github.com/agentclientprotocol/claude-agent-acp/commit/2711f506d5799f0ae25160de311a4459ffb46c49)), closes [#654](https://github.com/agentclientprotocol/claude-agent-acp/issues/654)
## [0.36.1](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.36.0...v0.36.1) (2026-05-18)
### Bug Fixes
* flaky authentication bypass for gateway ([#686](https://github.com/agentclientprotocol/claude-agent-acp/issues/686)) ([db852dc](https://github.com/agentclientprotocol/claude-agent-acp/commit/db852dcf7c8e3b461fabb1bdcf0c80a27d1da77d))
## [0.36.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.35.0...v0.36.0) (2026-05-18)
### Features
* Add experimental session delete support ([#682](https://github.com/agentclientprotocol/claude-agent-acp/issues/682)) ([2162d5a](https://github.com/agentclientprotocol/claude-agent-acp/commit/2162d5af62d493a82381bd88bc8fc67d376e358b))
* Support experimental additionalDirectories field ([#684](https://github.com/agentclientprotocol/claude-agent-acp/issues/684)) ([f37e9a0](https://github.com/agentclientprotocol/claude-agent-acp/commit/f37e9a0d47d8d201d98b2177083664a6781895cc))
## [0.35.0](https://github.com/agentclientprotocol/claude-agent-acp/compare/v0.34.1...v0.35.0) (2026-05-16)

466
package-lock.json generated
View File

@@ -1,62 +1,62 @@
{
"name": "@agentclientprotocol/claude-agent-acp",
"version": "0.35.0",
"version": "0.37.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@agentclientprotocol/claude-agent-acp",
"version": "0.35.0",
"version": "0.37.0",
"license": "Apache-2.0",
"dependencies": {
"@agentclientprotocol/sdk": "0.21.1",
"@anthropic-ai/claude-agent-sdk": "0.3.143",
"@agentclientprotocol/sdk": "0.22.1",
"@anthropic-ai/claude-agent-sdk": "0.3.146",
"zod": "^3.25.0 || ^4.0.0"
},
"bin": {
"claude-agent-acp": "dist/index.js"
},
"devDependencies": {
"@anthropic-ai/sdk": "0.96.0",
"@anthropic-ai/sdk": "0.97.1",
"@eslint/js": "10.0.1",
"@types/node": "25.8.0",
"@typescript-eslint/eslint-plugin": "8.59.3",
"@typescript-eslint/parser": "8.59.3",
"@types/node": "25.9.1",
"@typescript-eslint/eslint-plugin": "8.59.4",
"@typescript-eslint/parser": "8.59.4",
"eslint": "10.4.0",
"eslint-config-prettier": "10.1.8",
"globals": "17.6.0",
"prettier": "3.8.3",
"ts-node": "10.9.2",
"typescript": "6.0.3",
"vitest": "4.1.6"
"vitest": "4.1.7"
}
},
"node_modules/@agentclientprotocol/sdk": {
"version": "0.21.1",
"resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-0.21.1.tgz",
"integrity": "sha512-ZTLH+o9QxcZDLX/9ww+W7C2iExnXFM+vD/uGFVSlR61Kzj9FaxUqBC6Rv/kwgA7qVWYUEI9c5ZNqCuO9PM4rKg==",
"version": "0.22.1",
"resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-0.22.1.tgz",
"integrity": "sha512-DfqXtl/8gO9NImq094MTaCXEU2vkhh6v7q/kT+9UjZxUqj8hYaya2OjLVIqn16MzNHcXEpShTR2RIauLSYeDQQ==",
"license": "Apache-2.0",
"peerDependencies": {
"zod": "^3.25.0 || ^4.0.0"
}
},
"node_modules/@anthropic-ai/claude-agent-sdk": {
"version": "0.3.143",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/-/claude-agent-sdk-0.3.143.tgz",
"integrity": "sha512-JnxOTRpSBpFqKFMfV5cW4QjpeDOHUNr31rRislmOVWEPsRmCjsy9jYwKxDf7kxcwxyZ6h/YHz1ACvMaUWy6o6A==",
"version": "0.3.146",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/-/claude-agent-sdk-0.3.146.tgz",
"integrity": "sha512-hK9/Ng+hOyexUemTxdIUsSWJ9o2LFi2YNWzHwz8/YMCohUYOnFMZkBiENvUAb0WIc5hieOyBZrOIlg5OewuJMg==",
"license": "SEE LICENSE IN README.md",
"engines": {
"node": ">=18.0.0"
},
"optionalDependencies": {
"@anthropic-ai/claude-agent-sdk-darwin-arm64": "0.3.143",
"@anthropic-ai/claude-agent-sdk-darwin-x64": "0.3.143",
"@anthropic-ai/claude-agent-sdk-linux-arm64": "0.3.143",
"@anthropic-ai/claude-agent-sdk-linux-arm64-musl": "0.3.143",
"@anthropic-ai/claude-agent-sdk-linux-x64": "0.3.143",
"@anthropic-ai/claude-agent-sdk-linux-x64-musl": "0.3.143",
"@anthropic-ai/claude-agent-sdk-win32-arm64": "0.3.143",
"@anthropic-ai/claude-agent-sdk-win32-x64": "0.3.143"
"@anthropic-ai/claude-agent-sdk-darwin-arm64": "0.3.146",
"@anthropic-ai/claude-agent-sdk-darwin-x64": "0.3.146",
"@anthropic-ai/claude-agent-sdk-linux-arm64": "0.3.146",
"@anthropic-ai/claude-agent-sdk-linux-arm64-musl": "0.3.146",
"@anthropic-ai/claude-agent-sdk-linux-x64": "0.3.146",
"@anthropic-ai/claude-agent-sdk-linux-x64-musl": "0.3.146",
"@anthropic-ai/claude-agent-sdk-win32-arm64": "0.3.146",
"@anthropic-ai/claude-agent-sdk-win32-x64": "0.3.146"
},
"peerDependencies": {
"@anthropic-ai/sdk": ">=0.93.0",
@@ -65,9 +65,9 @@
}
},
"node_modules/@anthropic-ai/claude-agent-sdk-darwin-arm64": {
"version": "0.3.143",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-darwin-arm64/-/claude-agent-sdk-darwin-arm64-0.3.143.tgz",
"integrity": "sha512-41WuTuP+bk4NxrjpG9IJGffsjh1ivyiiAmqgb5QoxPltDAA0p3gs+iZ3lTgDmY4Ga68wDoN05Lt18oCE+DQb7g==",
"version": "0.3.146",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-darwin-arm64/-/claude-agent-sdk-darwin-arm64-0.3.146.tgz",
"integrity": "sha512-0IIvlEaenq2CRSVx5Bo5BaCtHQXS87GancM35WKEYveGVLn6DI+5G7ikYuTE4AKRPkMnogFtY4BJt6LulWGj+A==",
"cpu": [
"arm64"
],
@@ -78,9 +78,9 @@
]
},
"node_modules/@anthropic-ai/claude-agent-sdk-darwin-x64": {
"version": "0.3.143",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-darwin-x64/-/claude-agent-sdk-darwin-x64-0.3.143.tgz",
"integrity": "sha512-3WrJ6MjjwQKvPnPbzUOm08qftlHYobkp/tmM1P/Vk/ldSjoPfFIgLFfzSzUmCKJiKEh2ZlHLJr8ORNrTxXhgQg==",
"version": "0.3.146",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-darwin-x64/-/claude-agent-sdk-darwin-x64-0.3.146.tgz",
"integrity": "sha512-Dk5xJ03Ff1JXbMRP1t2wc/TyfY6xF/2Ysp31wMhFPjoNiKSPHMWaIg242+T3CHdxLWmJ8plWHL1HL5cyZ/LCkw==",
"cpu": [
"x64"
],
@@ -91,9 +91,9 @@
]
},
"node_modules/@anthropic-ai/claude-agent-sdk-linux-arm64": {
"version": "0.3.143",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-arm64/-/claude-agent-sdk-linux-arm64-0.3.143.tgz",
"integrity": "sha512-/9oP/FCewrPnwVN+QUS5rlO3kMa07w+hOrpWrz24aEpBYhcHzr0zoNMBriPDAkTr3ao/z1k40UZ2dHmgsSODzA==",
"version": "0.3.146",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-arm64/-/claude-agent-sdk-linux-arm64-0.3.146.tgz",
"integrity": "sha512-mzBXDDWWBAC/vDtAYpO1G/dq5QvJtYSPXsqcb+sNdcDhiuf4IYnYp7ytRncYlsUNDkLmX6Gk2jkWAHUUA2Lozg==",
"cpu": [
"arm64"
],
@@ -104,9 +104,9 @@
]
},
"node_modules/@anthropic-ai/claude-agent-sdk-linux-arm64-musl": {
"version": "0.3.143",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-arm64-musl/-/claude-agent-sdk-linux-arm64-musl-0.3.143.tgz",
"integrity": "sha512-9UeV1W2vjOVwJSJrq9aw3UeMo82Ir59FfJ5mchh7OXZEaevkANvHYn25bTCnIpqfqOx7qFEosJW2ELIoV1nprg==",
"version": "0.3.146",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-arm64-musl/-/claude-agent-sdk-linux-arm64-musl-0.3.146.tgz",
"integrity": "sha512-QlCid0ucdrmhUAOewfQjaofN2wlokWcfFTxSFePTSj1umk35JO7TDFP700F7jU49r1fPWIdvJpPwWGyB0DeFPA==",
"cpu": [
"arm64"
],
@@ -117,9 +117,9 @@
]
},
"node_modules/@anthropic-ai/claude-agent-sdk-linux-x64": {
"version": "0.3.143",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-x64/-/claude-agent-sdk-linux-x64-0.3.143.tgz",
"integrity": "sha512-kwqnbHo4Zj6TzO1V/83uLhsTt0xBp/BN5V/aHIX+khM4UuNO6NOKNaZvr8Int3sF0ARF95Hjr4l/hMKxry6DhQ==",
"version": "0.3.146",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-x64/-/claude-agent-sdk-linux-x64-0.3.146.tgz",
"integrity": "sha512-B2baXU1tCBT5CVlD7jJMKjpC4xdO45NUIWpqImmwuOfKvlM/PITjyTXyTY662mGZf1dBmdqBBsqirwFH/jhi8Q==",
"cpu": [
"x64"
],
@@ -130,9 +130,9 @@
]
},
"node_modules/@anthropic-ai/claude-agent-sdk-linux-x64-musl": {
"version": "0.3.143",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-x64-musl/-/claude-agent-sdk-linux-x64-musl-0.3.143.tgz",
"integrity": "sha512-rr4334GOLl9caYDeyWsbwMaVJCiNvKHE9nLdey8opIkq7/FHHu712U6tDk0tcoCdsGU/S3/BBaZParOgF+s5qw==",
"version": "0.3.146",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-x64-musl/-/claude-agent-sdk-linux-x64-musl-0.3.146.tgz",
"integrity": "sha512-E3coK1ThQT08KIX80RLcsq7DWXFllCKOzoOe32it/bdtY56TBgPY9xemwXhIJ+cVBHTI9/MpBSIlKBcFCt+yQA==",
"cpu": [
"x64"
],
@@ -143,9 +143,9 @@
]
},
"node_modules/@anthropic-ai/claude-agent-sdk-win32-arm64": {
"version": "0.3.143",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-win32-arm64/-/claude-agent-sdk-win32-arm64-0.3.143.tgz",
"integrity": "sha512-q5UaLZ9ABbqQN8UXpqHUqjW6akI1zMrV5Jvtq0yueKP4nIRbBBZBQ80M4bpdrc0+SiRmjVRV3p8lsCCAd8azgg==",
"version": "0.3.146",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-win32-arm64/-/claude-agent-sdk-win32-arm64-0.3.146.tgz",
"integrity": "sha512-CIwQxGX2r/yWpjCJ6ahB3smKXhghWgGTxL98+LGW52TUwqTiBnlNrH9DPqqgv1/+Hyquw6xfLrKU+StyfMgiLw==",
"cpu": [
"arm64"
],
@@ -156,9 +156,9 @@
]
},
"node_modules/@anthropic-ai/claude-agent-sdk-win32-x64": {
"version": "0.3.143",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-win32-x64/-/claude-agent-sdk-win32-x64-0.3.143.tgz",
"integrity": "sha512-46L2mkskvIRfwzHP3p0uUE5u9Oc7Eb/DRVmXuGNk5Z8jiahlDSv0SHP1vnWSWw5nWIu4DWOKyXZelRmYc9LxCg==",
"version": "0.3.146",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-win32-x64/-/claude-agent-sdk-win32-x64-0.3.146.tgz",
"integrity": "sha512-qmxrsyaqA8s4HShqJls7ZCRjdoqN66Jo/hbjQNB3uHepD8tEO1iD19aPV4+osdLT7feMkhDBfLT07Q30R2NB5w==",
"cpu": [
"x64"
],
@@ -169,9 +169,9 @@
]
},
"node_modules/@anthropic-ai/sdk": {
"version": "0.96.0",
"resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.96.0.tgz",
"integrity": "sha512-KlCsODtTyb17bLUVCSDC2HtSvAbJf60sEiPEax9dInF+aDF92vS4TZJ5XD7YCQXNb1/5icYaw8Y7wMjPlIV9Zg==",
"version": "0.97.1",
"resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.97.1.tgz",
"integrity": "sha512-wOf7AUeJPitcVpvKO4UMu63mWH5SaVipkGd7OOQJt/G6VYGlV8D2Gp9dLxOrttDJh/9gqPqdaBwDGcBevumeAg==",
"license": "MIT",
"dependencies": {
"json-schema-to-ts": "^3.1.1",
@@ -528,9 +528,9 @@
}
},
"node_modules/@oxc-project/types": {
"version": "0.130.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.130.0.tgz",
"integrity": "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==",
"version": "0.132.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz",
"integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==",
"dev": true,
"license": "MIT",
"funding": {
@@ -538,9 +538,9 @@
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.1.tgz",
"integrity": "sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz",
"integrity": "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==",
"cpu": [
"arm64"
],
@@ -555,9 +555,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.1.tgz",
"integrity": "sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz",
"integrity": "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==",
"cpu": [
"arm64"
],
@@ -572,9 +572,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.1.tgz",
"integrity": "sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz",
"integrity": "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==",
"cpu": [
"x64"
],
@@ -589,9 +589,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.1.tgz",
"integrity": "sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz",
"integrity": "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==",
"cpu": [
"x64"
],
@@ -606,9 +606,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.1.tgz",
"integrity": "sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz",
"integrity": "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==",
"cpu": [
"arm"
],
@@ -623,9 +623,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.1.tgz",
"integrity": "sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz",
"integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==",
"cpu": [
"arm64"
],
@@ -640,9 +640,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.1.tgz",
"integrity": "sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz",
"integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==",
"cpu": [
"arm64"
],
@@ -657,9 +657,9 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.1.tgz",
"integrity": "sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz",
"integrity": "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==",
"cpu": [
"ppc64"
],
@@ -674,9 +674,9 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.1.tgz",
"integrity": "sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz",
"integrity": "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==",
"cpu": [
"s390x"
],
@@ -691,9 +691,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.1.tgz",
"integrity": "sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz",
"integrity": "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==",
"cpu": [
"x64"
],
@@ -708,9 +708,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.1.tgz",
"integrity": "sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz",
"integrity": "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==",
"cpu": [
"x64"
],
@@ -725,9 +725,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.1.tgz",
"integrity": "sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz",
"integrity": "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==",
"cpu": [
"arm64"
],
@@ -742,9 +742,9 @@
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.1.tgz",
"integrity": "sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz",
"integrity": "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==",
"cpu": [
"wasm32"
],
@@ -761,9 +761,9 @@
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.1.tgz",
"integrity": "sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz",
"integrity": "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==",
"cpu": [
"arm64"
],
@@ -778,9 +778,9 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.1.tgz",
"integrity": "sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz",
"integrity": "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==",
"cpu": [
"x64"
],
@@ -893,9 +893,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "25.8.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.8.0.tgz",
"integrity": "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==",
"version": "25.9.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz",
"integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -903,17 +903,17 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz",
"integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz",
"integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.12.2",
"@typescript-eslint/scope-manager": "8.59.3",
"@typescript-eslint/type-utils": "8.59.3",
"@typescript-eslint/utils": "8.59.3",
"@typescript-eslint/visitor-keys": "8.59.3",
"@typescript-eslint/scope-manager": "8.59.4",
"@typescript-eslint/type-utils": "8.59.4",
"@typescript-eslint/utils": "8.59.4",
"@typescript-eslint/visitor-keys": "8.59.4",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
"ts-api-utils": "^2.5.0"
@@ -926,22 +926,22 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"@typescript-eslint/parser": "^8.59.3",
"@typescript-eslint/parser": "8.59.4",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/parser": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz",
"integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz",
"integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/scope-manager": "8.59.3",
"@typescript-eslint/types": "8.59.3",
"@typescript-eslint/typescript-estree": "8.59.3",
"@typescript-eslint/visitor-keys": "8.59.3",
"@typescript-eslint/scope-manager": "8.59.4",
"@typescript-eslint/types": "8.59.4",
"@typescript-eslint/typescript-estree": "8.59.4",
"@typescript-eslint/visitor-keys": "8.59.4",
"debug": "^4.4.3"
},
"engines": {
@@ -957,14 +957,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz",
"integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz",
"integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.59.3",
"@typescript-eslint/types": "^8.59.3",
"@typescript-eslint/tsconfig-utils": "^8.59.4",
"@typescript-eslint/types": "^8.59.4",
"debug": "^4.4.3"
},
"engines": {
@@ -979,14 +979,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz",
"integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz",
"integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.59.3",
"@typescript-eslint/visitor-keys": "8.59.3"
"@typescript-eslint/types": "8.59.4",
"@typescript-eslint/visitor-keys": "8.59.4"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -997,9 +997,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz",
"integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz",
"integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1014,15 +1014,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz",
"integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz",
"integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.59.3",
"@typescript-eslint/typescript-estree": "8.59.3",
"@typescript-eslint/utils": "8.59.3",
"@typescript-eslint/types": "8.59.4",
"@typescript-eslint/typescript-estree": "8.59.4",
"@typescript-eslint/utils": "8.59.4",
"debug": "^4.4.3",
"ts-api-utils": "^2.5.0"
},
@@ -1039,9 +1039,9 @@
}
},
"node_modules/@typescript-eslint/types": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz",
"integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz",
"integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1053,16 +1053,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz",
"integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz",
"integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/project-service": "8.59.3",
"@typescript-eslint/tsconfig-utils": "8.59.3",
"@typescript-eslint/types": "8.59.3",
"@typescript-eslint/visitor-keys": "8.59.3",
"@typescript-eslint/project-service": "8.59.4",
"@typescript-eslint/tsconfig-utils": "8.59.4",
"@typescript-eslint/types": "8.59.4",
"@typescript-eslint/visitor-keys": "8.59.4",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
@@ -1081,16 +1081,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz",
"integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz",
"integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.1",
"@typescript-eslint/scope-manager": "8.59.3",
"@typescript-eslint/types": "8.59.3",
"@typescript-eslint/typescript-estree": "8.59.3"
"@typescript-eslint/scope-manager": "8.59.4",
"@typescript-eslint/types": "8.59.4",
"@typescript-eslint/typescript-estree": "8.59.4"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1105,13 +1105,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz",
"integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==",
"version": "8.59.4",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz",
"integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.59.3",
"@typescript-eslint/types": "8.59.4",
"eslint-visitor-keys": "^5.0.0"
},
"engines": {
@@ -1136,16 +1136,16 @@
}
},
"node_modules/@vitest/expect": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz",
"integrity": "sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==",
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.7.tgz",
"integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.1.0",
"@types/chai": "^5.2.2",
"@vitest/spy": "4.1.6",
"@vitest/utils": "4.1.6",
"@vitest/spy": "4.1.7",
"@vitest/utils": "4.1.7",
"chai": "^6.2.2",
"tinyrainbow": "^3.1.0"
},
@@ -1154,13 +1154,13 @@
}
},
"node_modules/@vitest/mocker": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz",
"integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==",
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.7.tgz",
"integrity": "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/spy": "4.1.6",
"@vitest/spy": "4.1.7",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.21"
},
@@ -1181,9 +1181,9 @@
}
},
"node_modules/@vitest/pretty-format": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz",
"integrity": "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==",
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.7.tgz",
"integrity": "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1194,13 +1194,13 @@
}
},
"node_modules/@vitest/runner": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz",
"integrity": "sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==",
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.7.tgz",
"integrity": "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/utils": "4.1.6",
"@vitest/utils": "4.1.7",
"pathe": "^2.0.3"
},
"funding": {
@@ -1208,14 +1208,14 @@
}
},
"node_modules/@vitest/snapshot": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz",
"integrity": "sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==",
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.7.tgz",
"integrity": "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/pretty-format": "4.1.6",
"@vitest/utils": "4.1.6",
"@vitest/pretty-format": "4.1.7",
"@vitest/utils": "4.1.7",
"magic-string": "^0.30.21",
"pathe": "^2.0.3"
},
@@ -1224,9 +1224,9 @@
}
},
"node_modules/@vitest/spy": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz",
"integrity": "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==",
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.7.tgz",
"integrity": "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==",
"dev": true,
"license": "MIT",
"funding": {
@@ -1234,13 +1234,13 @@
}
},
"node_modules/@vitest/utils": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz",
"integrity": "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==",
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.7.tgz",
"integrity": "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/pretty-format": "4.1.6",
"@vitest/pretty-format": "4.1.7",
"convert-source-map": "^2.0.0",
"tinyrainbow": "^3.1.0"
},
@@ -2313,9 +2313,9 @@
}
},
"node_modules/hono": {
"version": "4.12.19",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.19.tgz",
"integrity": "sha512-xa3eYXYXx68XTT4hZ7dRzsXBhaq85ToSrlUJNoR0gwz/1Ap/CNwX47wfvV7pc/xWhjKVVkLT7zBJy8chhNguqQ==",
"version": "4.12.21",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.21.tgz",
"integrity": "sha512-uV63apnb0kyPtAUwoWgaGh9HyIFcv8lgmzPZSiTBQAFOFGIzka5EZ1dZocmGnn0XdX0+XTqJ6Tqv7selMuGLRQ==",
"license": "MIT",
"peer": true,
"engines": {
@@ -3115,9 +3115,9 @@
}
},
"node_modules/postcss": {
"version": "8.5.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
"integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
"version": "8.5.15",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
"integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
"dev": true,
"funding": [
{
@@ -3135,7 +3135,7 @@
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.11",
"nanoid": "^3.3.12",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -3194,9 +3194,9 @@
}
},
"node_modules/qs": {
"version": "6.15.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz",
"integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==",
"version": "6.15.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
"integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
"license": "BSD-3-Clause",
"peer": true,
"dependencies": {
@@ -3246,13 +3246,13 @@
}
},
"node_modules/rolldown": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.1.tgz",
"integrity": "sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz",
"integrity": "sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.130.0",
"@oxc-project/types": "=0.132.0",
"@rolldown/pluginutils": "^1.0.0"
},
"bin": {
@@ -3262,21 +3262,21 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.0.1",
"@rolldown/binding-darwin-arm64": "1.0.1",
"@rolldown/binding-darwin-x64": "1.0.1",
"@rolldown/binding-freebsd-x64": "1.0.1",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.1",
"@rolldown/binding-linux-arm64-gnu": "1.0.1",
"@rolldown/binding-linux-arm64-musl": "1.0.1",
"@rolldown/binding-linux-ppc64-gnu": "1.0.1",
"@rolldown/binding-linux-s390x-gnu": "1.0.1",
"@rolldown/binding-linux-x64-gnu": "1.0.1",
"@rolldown/binding-linux-x64-musl": "1.0.1",
"@rolldown/binding-openharmony-arm64": "1.0.1",
"@rolldown/binding-wasm32-wasi": "1.0.1",
"@rolldown/binding-win32-arm64-msvc": "1.0.1",
"@rolldown/binding-win32-x64-msvc": "1.0.1"
"@rolldown/binding-android-arm64": "1.0.2",
"@rolldown/binding-darwin-arm64": "1.0.2",
"@rolldown/binding-darwin-x64": "1.0.2",
"@rolldown/binding-freebsd-x64": "1.0.2",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.2",
"@rolldown/binding-linux-arm64-gnu": "1.0.2",
"@rolldown/binding-linux-arm64-musl": "1.0.2",
"@rolldown/binding-linux-ppc64-gnu": "1.0.2",
"@rolldown/binding-linux-s390x-gnu": "1.0.2",
"@rolldown/binding-linux-x64-gnu": "1.0.2",
"@rolldown/binding-linux-x64-musl": "1.0.2",
"@rolldown/binding-openharmony-arm64": "1.0.2",
"@rolldown/binding-wasm32-wasi": "1.0.2",
"@rolldown/binding-win32-arm64-msvc": "1.0.2",
"@rolldown/binding-win32-x64-msvc": "1.0.2"
}
},
"node_modules/router": {
@@ -3748,16 +3748,16 @@
}
},
"node_modules/vite": {
"version": "8.0.13",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.13.tgz",
"integrity": "sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==",
"version": "8.0.14",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.14.tgz",
"integrity": "sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==",
"dev": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.4",
"postcss": "^8.5.14",
"rolldown": "1.0.1",
"postcss": "^8.5.15",
"rolldown": "1.0.2",
"tinyglobby": "^0.2.16"
},
"bin": {
@@ -3826,19 +3826,19 @@
}
},
"node_modules/vitest": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.6.tgz",
"integrity": "sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==",
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.7.tgz",
"integrity": "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/expect": "4.1.6",
"@vitest/mocker": "4.1.6",
"@vitest/pretty-format": "4.1.6",
"@vitest/runner": "4.1.6",
"@vitest/snapshot": "4.1.6",
"@vitest/spy": "4.1.6",
"@vitest/utils": "4.1.6",
"@vitest/expect": "4.1.7",
"@vitest/mocker": "4.1.7",
"@vitest/pretty-format": "4.1.7",
"@vitest/runner": "4.1.7",
"@vitest/snapshot": "4.1.7",
"@vitest/spy": "4.1.7",
"@vitest/utils": "4.1.7",
"es-module-lexer": "^2.0.0",
"expect-type": "^1.3.0",
"magic-string": "^0.30.21",
@@ -3866,12 +3866,12 @@
"@edge-runtime/vm": "*",
"@opentelemetry/api": "^1.9.0",
"@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
"@vitest/browser-playwright": "4.1.6",
"@vitest/browser-preview": "4.1.6",
"@vitest/browser-webdriverio": "4.1.6",
"@vitest/coverage-istanbul": "4.1.6",
"@vitest/coverage-v8": "4.1.6",
"@vitest/ui": "4.1.6",
"@vitest/browser-playwright": "4.1.7",
"@vitest/browser-preview": "4.1.7",
"@vitest/browser-webdriverio": "4.1.7",
"@vitest/coverage-istanbul": "4.1.7",
"@vitest/coverage-v8": "4.1.7",
"@vitest/ui": "4.1.7",
"happy-dom": "*",
"jsdom": "*",
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0"

View File

@@ -3,7 +3,7 @@
"publishConfig": {
"access": "public"
},
"version": "0.35.0",
"version": "0.37.0",
"description": "An ACP-compatible coding agent powered by the Claude Agent SDK (TypeScript)",
"main": "dist/lib.js",
"types": "dist/lib.d.ts",
@@ -60,22 +60,22 @@
"author": "Zed Industries",
"license": "Apache-2.0",
"dependencies": {
"@agentclientprotocol/sdk": "0.21.1",
"@anthropic-ai/claude-agent-sdk": "0.3.143",
"@agentclientprotocol/sdk": "0.22.1",
"@anthropic-ai/claude-agent-sdk": "0.3.146",
"zod": "^3.25.0 || ^4.0.0"
},
"devDependencies": {
"@anthropic-ai/sdk": "0.96.0",
"@anthropic-ai/sdk": "0.97.1",
"@eslint/js": "10.0.1",
"@types/node": "25.8.0",
"@typescript-eslint/eslint-plugin": "8.59.3",
"@typescript-eslint/parser": "8.59.3",
"@types/node": "25.9.1",
"@typescript-eslint/eslint-plugin": "8.59.4",
"@typescript-eslint/parser": "8.59.4",
"eslint": "10.4.0",
"eslint-config-prettier": "10.1.8",
"globals": "17.6.0",
"prettier": "3.8.3",
"ts-node": "10.9.2",
"typescript": "6.0.3",
"vitest": "4.1.6"
"vitest": "4.1.7"
}
}

View File

@@ -37,6 +37,8 @@ import {
SetSessionModeResponse,
CloseSessionRequest,
CloseSessionResponse,
DeleteSessionRequest,
DeleteSessionResponse,
TerminalHandle,
TerminalOutputResponse,
WriteTextFileRequest,
@@ -45,6 +47,7 @@ import {
} from "@agentclientprotocol/sdk";
import {
CanUseTool,
deleteSession,
getSessionMessages,
listSessions,
McpServerConfig,
@@ -625,10 +628,12 @@ export class ClaudeAcpAgent implements Agent {
},
loadSession: true,
sessionCapabilities: {
additionalDirectories: {},
close: {},
delete: {},
fork: {},
list: {},
resume: {},
close: {},
},
},
agentInfo: {
@@ -660,6 +665,7 @@ export class ClaudeAcpAgent implements Agent {
{
cwd: params.cwd,
mcpServers: params.mcpServers ?? [],
additionalDirectories: params.additionalDirectories,
_meta: params._meta,
},
{
@@ -775,6 +781,7 @@ export class ClaudeAcpAgent implements Agent {
session.promptRunning = true;
let handedOff = false;
let errored = false;
let stopReason: StopReason = "end_turn";
try {
@@ -858,10 +865,53 @@ export class ClaudeAcpAgent implements Agent {
}
case "session_state_changed": {
if (message.state === "idle") {
if (session.cancelled) {
stopReason = "cancelled";
}
return { stopReason, usage: sessionUsage(session) };
}
break;
}
case "memory_recall": {
const isSynthesis = message.mode === "synthesize";
const locations = isSynthesis
? []
: message.memories.map((m) => ({ path: m.path }));
const content = isSynthesis
? message.memories
.filter(
(m): m is (typeof message.memories)[number] & { content: string } =>
typeof m.content === "string",
)
.map((m) => ({
type: "content" as const,
content: { type: "text" as const, text: m.content },
}))
: [];
const count = message.memories.length;
const title = isSynthesis
? "Recalled synthesized memory"
: `Recalled ${count} ${count === 1 ? "memory" : "memories"}`;
await this.client.sessionUpdate({
sessionId: message.session_id,
update: {
sessionUpdate: "tool_call",
toolCallId: message.uuid,
title,
kind: "read",
status: "completed",
...(locations.length > 0 && { locations }),
...(content.length > 0 && { content }),
_meta: {
claudeCode: {
toolName: "memory_recall",
toolResponse: { mode: message.mode },
},
} satisfies ToolUpdateMeta,
},
});
break;
}
case "hook_started":
case "hook_progress":
case "hook_response":
@@ -872,7 +922,6 @@ export class ClaudeAcpAgent implements Agent {
case "task_updated":
case "elicitation_complete":
case "plugin_install":
case "memory_recall":
case "notification":
case "api_retry":
case "mirror_error":
@@ -1116,26 +1165,15 @@ export class ClaudeAcpAgent implements Agent {
}
}
// Slash commands like /compact can generate invalid output... doesn't match
// their own docs: https://docs.anthropic.com/en/docs/claude-code/sdk/sdk-slash-commands#%2Fcompact-compact-conversation-history
//
// Strip local-command marker tags from the content and render whatever
// real prose remains, so that custom slash commands / user-defined
// skills (whose bodies arrive wrapped in <command-*> / <local-command-stdout>
// markers) and built-in commands that emit textual output reach the UI.
// Previously this branch dropped every message containing a stdout
// marker, which silently swallowed every successful skill invocation
// and any built-in command that emits output through these tags.
// strip-and-render is safe because stripLocalCommandMetadata returns
// null when nothing renderable remains (e.g. pure-marker /compact
// payloads), so the no-render no-op path is preserved for those cases.
//
// Refs zed-industries/claude-code-acp#624, #642.
// Strip <command-*>/<local-command-stdout> markers and render any
// remaining prose. Skill bodies and built-in slash commands (e.g.
// /usage, /status, /model) arrive wrapped in these tags; pure-marker
// payloads (e.g. /compact's malformed output) strip to null and are
// skipped. Mirrors the replay path at replaySessionHistory.
if (
typeof message.message.content === "string" &&
message.message.content.includes("<local-command-stdout>")
) {
this.logger.log(message.message.content);
const stripped = stripLocalCommandMetadata(message.message.content);
if (typeof stripped === "string") {
for (const notification of toAcpNotifications(
@@ -1145,9 +1183,17 @@ export class ClaudeAcpAgent implements Agent {
this.toolUseCache,
this.client,
this.logger,
{
clientCapabilities: this.clientCapabilities,
parentToolUseId: message.parent_tool_use_id,
cwd: session.cwd,
taskState: session.taskState,
},
)) {
await this.client.sessionUpdate(notification);
}
} else {
this.logger.log(message.message.content);
}
break;
}
@@ -1220,6 +1266,34 @@ export class ClaudeAcpAgent implements Agent {
}
throw new Error("Session did not end in result");
} catch (error) {
errored = true;
// A failed turn typically leaves a trailing `session_state_changed: idle`
// (and possibly more) in the query iterator. If we don't drain it here,
// the next prompt's first `query.next()` consumes that stale idle and
// short-circuits to end_turn with zero usage
// Bounded so a misbehaving SDK can't hang the next prompt indefinitely.
try {
await session.query.interrupt();
const MAX_DRAIN = 100;
for (let i = 0; i < MAX_DRAIN; i++) {
const { value: m, done } = await session.query.next();
if (done || !m) break;
if (m.type === "system" && m.subtype === "session_state_changed" && m.state === "idle") {
break;
}
if (i === MAX_DRAIN - 1) {
this.logger.error(
`Session ${params.sessionId}: drained ${MAX_DRAIN} messages after error without observing idle`,
);
}
}
} catch (drainErr) {
this.logger.error(
`Session ${params.sessionId}: failed to drain query after prompt error:`,
drainErr,
);
}
if (error instanceof RequestError || !(error instanceof Error)) {
throw error;
}
@@ -1244,10 +1318,19 @@ export class ClaudeAcpAgent implements Agent {
} finally {
if (!handedOff) {
session.promptRunning = false;
// This usually should not happen, but in case the loop finishes
// without claude sending all message replays, we resolve the
// next pending prompt call to ensure no prompts get stuck.
if (session.pendingMessages.size > 0) {
if (errored) {
// The query stream was just drained — handing pending prompts off
// onto it would let them race with the recovery. Cancel them so
// each waiting prompt() returns stopReason: "cancelled" and the
// client can decide whether to retry.
for (const pending of session.pendingMessages.values()) {
pending.resolve(true);
}
session.pendingMessages.clear();
} else if (session.pendingMessages.size > 0) {
// This usually should not happen, but in case the loop finishes
// without claude sending all message replays, we resolve the
// next pending prompt call to ensure no prompts get stuck.
const next = [...session.pendingMessages.entries()].sort(
(a, b) => a[1].order - b[1].order,
)[0];
@@ -1300,6 +1383,16 @@ export class ClaudeAcpAgent implements Agent {
return {};
}
async unstable_deleteSession(params: DeleteSessionRequest): Promise<DeleteSessionResponse> {
// Tear down any active in-memory state first so the on-disk file isn't
// recreated by an outstanding query writing to it.
if (this.sessions[params.sessionId]) {
await this.teardownSession(params.sessionId);
}
await deleteSession(params.sessionId);
return {};
}
async unstable_setSessionModel(
params: SetSessionModelRequest,
): Promise<SetSessionModelResponse | void> {
@@ -1729,7 +1822,7 @@ export class ClaudeAcpAgent implements Agent {
typeof newEffortOpt?.currentValue === "string" ? newEffortOpt.currentValue : undefined;
if (newEffort !== currentEffort) {
await session.query.applyFlagSettings({
effortLevel: newEffort as Settings["effortLevel"],
effortLevel: toSdkEffortLevel(newEffort),
});
}
@@ -1754,7 +1847,7 @@ export class ClaudeAcpAgent implements Agent {
);
if (configId === "effort") {
await session.query.applyFlagSettings({
effortLevel: value as Settings["effortLevel"],
effortLevel: toSdkEffortLevel(value),
});
}
}
@@ -1764,6 +1857,7 @@ export class ClaudeAcpAgent implements Agent {
sessionId: string;
cwd: string;
mcpServers?: NewSessionRequest["mcpServers"];
additionalDirectories?: NewSessionRequest["additionalDirectories"];
_meta?: NewSessionRequest["_meta"];
}): Promise<NewSessionResponse> {
const existingSession = this.sessions[params.sessionId];
@@ -1788,6 +1882,7 @@ export class ClaudeAcpAgent implements Agent {
{
cwd: params.cwd,
mcpServers: params.mcpServers ?? [],
additionalDirectories: params.additionalDirectories,
_meta: params._meta,
},
{
@@ -1837,7 +1932,7 @@ export class ClaudeAcpAgent implements Agent {
? Object.fromEntries(server.headers.map((e) => [e.name, e.value]))
: undefined,
};
} else {
} else if (!("type" in server)) {
// Stdio type MCP server (with or without explicit type field)
mcpServers[server.name] = {
type: "stdio",
@@ -2009,9 +2104,15 @@ export class ClaudeAcpAgent implements Agent {
abortController,
};
// Prefer the official ACP `additionalDirectories` field. Fall back to the
// legacy `_meta.additionalRoots` extension for clients that haven't been
// updated yet. Either source is merged with directories supplied via
// `_meta.claudeCode.options.additionalDirectories` (SDK pass-through).
const acpAdditionalDirectories =
params.additionalDirectories ?? sessionMeta?.additionalRoots ?? [];
options.additionalDirectories = [
...(userProvidedOptions?.additionalDirectories ?? []),
...(sessionMeta?.additionalRoots ?? []),
...acpAdditionalDirectories,
];
if (creationOpts?.resume === undefined || creationOpts?.forkSession) {
@@ -2065,7 +2166,13 @@ export class ClaudeAcpAgent implements Agent {
? applyAvailableModelsAllowlist(initializationResult.models, settingsAvailableModels)
: initializationResult.models;
const models = await getAvailableModels(q, allowedModels, settingsManager, this.logger);
const models = await getAvailableModels(
q,
allowedModels,
initializationResult.models,
settingsManager,
this.logger,
);
// Gate `auto` (and future model-specific modes) on the resolved model's
// `ModelInfo`. See `buildAvailableModes` for the canonical SDK signal.
@@ -2116,7 +2223,11 @@ export class ClaudeAcpAgent implements Agent {
// Apply the initial effort level to the SDK so it matches the UI default
const initialEffort = configOptions.find((o) => o.id === "effort");
if (initialEffort && typeof initialEffort.currentValue === "string") {
if (
initialEffort &&
typeof initialEffort.currentValue === "string" &&
initialEffort.currentValue !== "default"
) {
await q.applyFlagSettings({
effortLevel: initialEffort.currentValue as Settings["effortLevel"],
});
@@ -2256,7 +2367,7 @@ function createEnvForGateway(request?: GatewayAuthRequest) {
return {
ANTHROPIC_BASE_URL: request._meta.gateway.baseUrl,
ANTHROPIC_CUSTOM_HEADERS: customHeaders,
ANTHROPIC_AUTH_TOKEN: "", // Must be specified to bypass claude login requirement
ANTHROPIC_AUTH_TOKEN: " ", // Must be specified to bypass claude login requirement
};
}
@@ -2312,6 +2423,16 @@ function buildAvailableModes(modelInfo: ModelInfo | undefined): SessionModeState
return modes;
}
// Translate a UI effort value into the flag-layer payload. The SDK
// shallow-merges `applyFlagSettings`, drops `undefined` during JSON transport,
// and only clears a key when an explicit `null` is sent — see
// `applyFlagSettings` in @anthropic-ai/claude-agent-sdk. Mapping both the
// `"default"` sentinel and `undefined` (effort option absent for the model) to
// `null` ensures any previously-applied flag is actually cleared.
function toSdkEffortLevel(value: string | undefined): Settings["effortLevel"] | null {
return value === undefined || value === "default" ? null : (value as Settings["effortLevel"]);
}
function buildConfigOptions(
modes: SessionModeState,
models: SessionModelState,
@@ -2354,25 +2475,20 @@ function buildConfigOptions(
: [];
if (supportedLevels.length > 0) {
const effortOptions = supportedLevels.map((level) => ({
value: level,
name: level
.split(/[_-]/)
.map((part) => (part ? part.charAt(0).toUpperCase() + part.slice(1) : part))
.join(" "),
}));
const effortOptions = [
{ value: "default", name: "Default" },
...supportedLevels.map((level) => ({
value: level,
name: level
.split(/[_-]/)
.map((part) => (part ? part.charAt(0).toUpperCase() + part.slice(1) : part))
.join(" "),
})),
];
// Keep the current level if valid, otherwise prefer xhigh (Claude Code's
// recommended default for capable models), then high (the API default).
const includes = (l: string) => (supportedLevels as string[]).includes(l);
const includes = (l: string) => l === "default" || (supportedLevels as string[]).includes(l);
const validEffort =
currentEffortLevel && includes(currentEffortLevel)
? currentEffortLevel
: includes("xhigh")
? "xhigh"
: includes("high")
? "high"
: supportedLevels[0];
currentEffortLevel && includes(currentEffortLevel) ? currentEffortLevel : "default";
options.push({
id: "effort",
@@ -2392,6 +2508,27 @@ function buildConfigOptions(
// but the SDK model list uses IDs like "claude-opus-4-6-1m".
const MODEL_CONTEXT_HINT_PATTERN = /\[(\d+m)\]$/i;
// Captures a model family version such as `4-6` or `4.7` so we can keep
// `claude-opus-4-6` from being copied onto the SDK's `opus` alias when that
// alias currently resolves to a different family version (e.g. Opus 4.7).
const MODEL_FAMILY_VERSION_PATTERN = /\b(\d+)[-.](\d+)\b/;
function extractModelFamilyVersion(s: string): string | null {
const match = s.match(MODEL_FAMILY_VERSION_PATTERN);
return match ? `${match[1]}.${match[2]}` : null;
}
function modelVersionsCompatible(preference: string, candidate: ModelInfo): boolean {
const preferred = extractModelFamilyVersion(preference);
if (!preferred) return true;
const candidateVersion =
extractModelFamilyVersion(candidate.value) ??
extractModelFamilyVersion(candidate.displayName) ??
extractModelFamilyVersion(candidate.description);
if (!candidateVersion) return true;
return preferred === candidateVersion;
}
function tokenizeModelPreference(model: string): { tokens: string[]; contextHint?: string } {
const lower = model.trim().toLowerCase();
const contextHint = lower.match(MODEL_CONTEXT_HINT_PATTERN)?.[1]?.toLowerCase();
@@ -2438,6 +2575,7 @@ function resolveModelPreference(models: ModelInfo[], preference: string): ModelI
// Substring match
const includesMatch = models.find((model) => {
if (!modelVersionsCompatible(trimmed, model)) return false;
const value = model.value.toLowerCase();
const display = model.displayName.toLowerCase();
return value.includes(lower) || display.includes(lower) || lower.includes(value);
@@ -2451,6 +2589,7 @@ function resolveModelPreference(models: ModelInfo[], preference: string): ModelI
let bestMatch: ModelInfo | null = null;
let bestScore = 0;
for (const model of models) {
if (!modelVersionsCompatible(trimmed, model)) continue;
const score = scoreModelMatch(model, tokens, contextHint);
if (0 < score && (!bestMatch || bestScore < score)) {
bestMatch = model;
@@ -2526,12 +2665,14 @@ function applyAvailableModelsAllowlist(sdkModels: ModelInfo[], allowlist: string
async function getAvailableModels(
query: Query,
models: ModelInfo[],
sdkModels: ModelInfo[],
settingsManager: SettingsManager,
logger: Logger,
): Promise<SessionModelState> {
const settings = settingsManager.getSettings();
let currentModel = models[0];
let resolvedFromInput: string | undefined;
// Model priority (highest to lowest):
// 1. ANTHROPIC_MODEL environment variable
@@ -2541,15 +2682,33 @@ async function getAvailableModels(
const match = resolveModelPreference(models, process.env.ANTHROPIC_MODEL);
if (match) {
currentModel = match;
resolvedFromInput = process.env.ANTHROPIC_MODEL;
}
} else {
} else if (typeof settings.model === "string") {
const match = resolveSettingsModel(models, settings.model, logger);
if (match) {
currentModel = match;
resolvedFromInput = settings.model;
}
}
await query.setModel(currentModel.value);
// Skip the setModel round-trip when we can prove the SDK has already landed
// on the same model. Two cases qualify:
// (a) No override applied — currentModel stayed at models[0]; the SDK is on
// its own default and we have nothing to sync.
// (b) The resolver returned the user's input verbatim AND that value exists
// in the SDK's original model list — meaning no fuzzy match or
// allowlist rewrite was involved, and the SDK (which reads the same
// ANTHROPIC_MODEL / settings.json) will have arrived at the same entry.
// Anything else (fuzzy match, allowlist-synthesized value, alias) gets a
// setModel call so we don't drift from the user's intended pin.
const sdkSawSameValue = sdkModels.some((m) => m.value === currentModel.value);
const skipSetModel =
resolvedFromInput === undefined ||
(currentModel.value === resolvedFromInput && sdkSawSameValue);
if (!skipSetModel) {
await query.setModel(currentModel.value);
}
return {
availableModels: models.map((model) => ({
@@ -2563,6 +2722,7 @@ async function getAvailableModels(
function getAvailableSlashCommands(commands: SlashCommand[]): AvailableCommand[] {
const UNSUPPORTED_COMMANDS = [
"clear",
"cost",
"keybindings-help",
"login",

View File

@@ -222,7 +222,9 @@ describe("ClaudeAcpAgent settings", () => {
});
// Bad model is ignored at the usage site; falls back to the first SDK model.
expect(setModelSpy).toHaveBeenCalledWith("claude-sonnet-4-6");
// No setModel call is needed because no override was applied — the SDK is
// already on its own default.
expect(setModelSpy).not.toHaveBeenCalled();
expect(response.models.currentModelId).toBe("claude-sonnet-4-6");
});
@@ -578,6 +580,68 @@ describe("ClaudeAcpAgent settings", () => {
expect(setModelSpy).toHaveBeenCalledWith("claude-haiku-4-5");
expect(response.models.currentModelId).toBe("claude-haiku-4-5");
});
it("does not inherit display info across mismatched model family versions", async () => {
// https://github.com/agentclientprotocol/claude-agent-acp/issues/639:
// when the SDK's `opus` alias resolves to Opus 4.7, an allowlist entry
// of `claude-opus-4-6` (or `claude-opus-4-6[1m]`) used to substring-match
// `opus` and inherit the "Opus 4.7" display info. With version-aware
// matching, these entries fall back to showing their literal ID rather
// than a misleading newer name.
await fs.promises.writeFile(
path.join(tempDir, "settings.json"),
JSON.stringify({
availableModels: [
"claude-opus-4-6",
"claude-opus-4-6[1m]",
"claude-opus-4-7",
"claude-opus-4-7[1m]",
],
}),
);
const projectDir = path.join(tempDir, "project");
await fs.promises.mkdir(projectDir, { recursive: true });
mockQueryWithModels([
{ value: "default", displayName: "Default", description: "Default model" },
{
value: "opus",
displayName: "Opus 4.7",
description: "Claude Opus 4.7 — complex tasks, higher cost",
},
{
value: "opus[1m]",
displayName: "Opus 4.7 (1M context)",
description: "Opus 4.7 with 1M context",
},
]);
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");
const byValue: Record<string, { name: string; description?: string }> = {};
for (const opt of modelOption.options) {
byValue[opt.value] = { name: opt.name, description: opt.description };
}
// 4-6 entries must NOT inherit the 4.7 SDK alias display info.
expect(byValue["claude-opus-4-6"].name).toBe("claude-opus-4-6");
expect(byValue["claude-opus-4-6"].description).toBe("");
expect(byValue["claude-opus-4-6[1m]"].name).toBe("claude-opus-4-6[1m]");
expect(byValue["claude-opus-4-6[1m]"].description).toBe("");
// 4-7 entries continue to inherit display info from a 4.7 SDK alias.
expect(byValue["claude-opus-4-7"].name).toBe("Opus 4.7");
expect(byValue["claude-opus-4-7[1m]"].name).toMatch(/Opus 4\.7/);
});
});
it("resolves model aliases like opus[1m] to the correct model", async () => {
@@ -625,4 +689,94 @@ describe("ClaudeAcpAgent settings", () => {
expect(setModelSpy).toHaveBeenCalledWith("claude-opus-4-6-1m");
expect(response.models.currentModelId).toBe("claude-opus-4-6-1m");
});
it("skips the initial setModel when the resolved value matches the SDK's model list verbatim", async () => {
// Covers the launcher case from PR #646: the launcher bakes the model into
// ANTHROPIC_MODEL, the SDK already starts on that model, and a second
// setModel call would be a redundant round-trip (and on some launcher
// setups, more fragile than launch-time selection).
const originalEnv = process.env.ANTHROPIC_MODEL;
process.env.ANTHROPIC_MODEL = "claude-opus-4-6";
const projectDir = path.join(tempDir, "project");
await fs.promises.mkdir(projectDir, { recursive: true });
const setModelSpy = vi.fn();
querySpy.mockImplementation(() => {
return {
initializationResult: async () => ({
models: [
{ value: "default", displayName: "Default", description: "" },
{ value: "claude-sonnet-4-6", displayName: "Claude Sonnet 4.6", description: "" },
{ value: "claude-opus-4-6", displayName: "Claude Opus 4.6", description: "" },
],
}),
setModel: setModelSpy,
supportedCommands: async () => [],
} as any;
});
try {
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 },
});
expect(setModelSpy).not.toHaveBeenCalled();
expect(response.models.currentModelId).toBe("claude-opus-4-6");
} finally {
if (originalEnv === undefined) {
delete process.env.ANTHROPIC_MODEL;
} else {
process.env.ANTHROPIC_MODEL = originalEnv;
}
}
});
it("still calls setModel when the allowlist synthesizes a value the SDK has not surfaced", async () => {
// The allowlist may rewrite a model's `value` to the user's literal ID
// (e.g., `claude-haiku-4-5`) even when the SDK only exposed an alias
// (`haiku`). In that case the SDK has not independently arrived at the
// user's preferred ID, so we must sync via setModel.
await fs.promises.writeFile(
path.join(tempDir, "settings.json"),
JSON.stringify({
availableModels: ["claude-haiku-4-5"],
model: "claude-haiku-4-5",
}),
);
const projectDir = path.join(tempDir, "project");
await fs.promises.mkdir(projectDir, { recursive: true });
const setModelSpy = vi.fn();
querySpy.mockImplementation(() => {
return {
initializationResult: async () => ({
models: [
{ value: "default", displayName: "Default", description: "" },
{ value: "haiku", displayName: "Haiku", description: "Fast" },
],
}),
setModel: setModelSpy,
supportedCommands: async () => [],
} as any;
});
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 },
});
expect(setModelSpy).toHaveBeenCalledWith("claude-haiku-4-5");
expect(response.models.currentModelId).toBe("claude-haiku-4-5");
});
});

View File

@@ -1,4 +1,4 @@
import { describe, it, expect, beforeAll, afterAll, vi } from "vitest";
import { describe, it, expect, beforeAll, beforeEach, afterAll, vi } from "vitest";
import { spawn, spawnSync } from "child_process";
import {
Agent,
@@ -35,8 +35,16 @@ import {
type SDKMessageFilter,
} from "../acp-agent.js";
import { Pushable } from "../utils.js";
import { query, SDKAssistantMessage } from "@anthropic-ai/claude-agent-sdk";
import { deleteSession, query, SDKAssistantMessage } from "@anthropic-ai/claude-agent-sdk";
import { randomUUID } from "crypto";
vi.mock("@anthropic-ai/claude-agent-sdk", async (importOriginal) => {
const actual = await importOriginal<typeof import("@anthropic-ai/claude-agent-sdk")>();
return {
...actual,
deleteSession: vi.fn(),
};
});
import type {
BetaToolResultBlockParam,
BetaToolSearchToolResultBlockParam,
@@ -1888,6 +1896,94 @@ describe("session/close", () => {
});
});
describe("session/delete", () => {
function createMockAgent() {
const mockClient = {
sessionUpdate: async () => {},
} as unknown as AgentSideConnection;
return new ClaudeAcpAgent(mockClient, { log: () => {}, error: () => {} });
}
function injectSession(agent: ClaudeAcpAgent, sessionId: string) {
function* empty() {}
const gen = Object.assign(empty(), { interrupt: vi.fn(), close: vi.fn() });
agent.sessions[sessionId] = {
query: gen as any,
input: new Pushable(),
cancelled: false,
cwd: "/test",
sessionFingerprint: JSON.stringify({ cwd: "/test", mcpServers: [] }),
modes: { currentModeId: "default", availableModes: [] },
models: { currentModelId: "default", availableModels: [] },
modelInfos: [],
settingsManager: { dispose: vi.fn() } as any,
accumulatedUsage: {
inputTokens: 0,
outputTokens: 0,
cachedReadTokens: 0,
cachedWriteTokens: 0,
},
configOptions: [],
promptRunning: false,
pendingMessages: new Map(),
nextPendingOrder: 0,
abortController: new AbortController(),
emitRawSDKMessages: false,
contextWindowSize: 200000,
taskState: new Map(),
};
return agent.sessions[sessionId]!;
}
beforeEach(() => {
vi.mocked(deleteSession).mockReset();
vi.mocked(deleteSession).mockResolvedValue(undefined);
});
it("tears down the active session and deletes it from disk", async () => {
const agent = createMockAgent();
const session = injectSession(agent, "session-1");
const result = await agent.unstable_deleteSession({ sessionId: "session-1" });
expect(result).toEqual({});
expect(agent.sessions["session-1"]).toBeUndefined();
expect(session.query.interrupt).toHaveBeenCalled();
expect(session.settingsManager.dispose).toHaveBeenCalled();
expect(session.abortController.signal.aborted).toBe(true);
expect(deleteSession).toHaveBeenCalledWith("session-1");
});
it("deletes a session from disk that is not currently active", async () => {
const agent = createMockAgent();
const result = await agent.unstable_deleteSession({ sessionId: "not-active" });
expect(result).toEqual({});
expect(deleteSession).toHaveBeenCalledWith("not-active");
});
it("propagates errors from the SDK delete call", async () => {
const agent = createMockAgent();
vi.mocked(deleteSession).mockRejectedValueOnce(new Error("Session not found on disk"));
await expect(agent.unstable_deleteSession({ sessionId: "missing" })).rejects.toThrow(
"Session not found on disk",
);
});
it("does not affect other sessions when deleting one", async () => {
const agent = createMockAgent();
injectSession(agent, "session-a");
injectSession(agent, "session-b");
await agent.unstable_deleteSession({ sessionId: "session-a" });
expect(agent.sessions["session-a"]).toBeUndefined();
expect(agent.sessions["session-b"]).toBeDefined();
});
});
describe("getOrCreateSession param change detection", () => {
function createMockAgent() {
const mockClient = {
@@ -3420,3 +3516,359 @@ describe("result origin handling", () => {
expect(response.stopReason).toBe("max_tokens");
});
});
describe("memory_recall handling", () => {
function createMockAgentWithCapture() {
const updates: any[] = [];
const mockClient = {
sessionUpdate: async (notification: any) => {
updates.push(notification);
},
} as unknown as AgentSideConnection;
const agent = new ClaudeAcpAgent(mockClient, { log: () => {}, error: () => {} });
return { agent, updates };
}
function injectSession(agent: ClaudeAcpAgent, messages: any[]) {
const input = new Pushable<any>();
async function* messageGenerator() {
const iter = input[Symbol.asyncIterator]();
const { value: userMessage, done } = await iter.next();
if (!done && userMessage) {
yield {
type: "user",
message: userMessage.message,
parent_tool_use_id: null,
uuid: userMessage.uuid,
session_id: "test-session",
isReplay: true,
};
}
yield* messages;
}
agent.sessions["test-session"] = {
query: messageGenerator() as any,
input,
cancelled: false,
cwd: "/test",
sessionFingerprint: JSON.stringify({ cwd: "/test", mcpServers: [] }),
modes: { currentModeId: "default", availableModes: [] },
models: { currentModelId: "default", availableModels: [] },
modelInfos: [],
settingsManager: { dispose: vi.fn() } as any,
accumulatedUsage: {
inputTokens: 0,
outputTokens: 0,
cachedReadTokens: 0,
cachedWriteTokens: 0,
},
configOptions: [],
promptRunning: false,
pendingMessages: new Map(),
nextPendingOrder: 0,
abortController: new AbortController(),
emitRawSDKMessages: false,
contextWindowSize: 200000,
taskState: new Map(),
};
}
function createResult() {
return {
type: "result" as const,
subtype: "success" as const,
stop_reason: "end_turn",
is_error: false,
result: "",
errors: [],
duration_ms: 0,
duration_api_ms: 0,
num_turns: 1,
total_cost_usd: 0,
usage: {
input_tokens: 10,
output_tokens: 5,
cache_read_input_tokens: 0,
cache_creation_input_tokens: 0,
},
modelUsage: {},
permission_denials: [],
uuid: randomUUID(),
session_id: "test-session",
};
}
it("emits a synthetic tool_call for select mode with one location per memory", async () => {
const { agent, updates } = createMockAgentWithCapture();
const recallUuid = randomUUID();
injectSession(agent, [
{
type: "system",
subtype: "memory_recall",
mode: "select",
memories: [
{ path: "/Users/test/.claude/memory/user_role.md", scope: "personal" },
{ path: "/Users/test/.claude/memory/feedback_testing.md", scope: "personal" },
{ path: "/Users/test/.claude/team/conventions.md", scope: "team" },
],
uuid: recallUuid,
session_id: "test-session",
},
createResult(),
{ type: "system", subtype: "session_state_changed", state: "idle" },
]);
await agent.prompt({ sessionId: "test-session", prompt: [{ type: "text", text: "hi" }] });
const toolCall = updates.find((u: any) => u.update?.sessionUpdate === "tool_call");
expect(toolCall).toBeDefined();
expect(toolCall.update).toMatchObject({
sessionUpdate: "tool_call",
toolCallId: recallUuid,
title: "Recalled 3 memories",
kind: "read",
status: "completed",
locations: [
{ path: "/Users/test/.claude/memory/user_role.md" },
{ path: "/Users/test/.claude/memory/feedback_testing.md" },
{ path: "/Users/test/.claude/team/conventions.md" },
],
_meta: {
claudeCode: { toolName: "memory_recall", toolResponse: { mode: "select" } },
},
});
expect(toolCall.update.content).toBeUndefined();
});
it("uses singular 'memory' in title when exactly one entry", async () => {
const { agent, updates } = createMockAgentWithCapture();
injectSession(agent, [
{
type: "system",
subtype: "memory_recall",
mode: "select",
memories: [{ path: "/Users/test/.claude/memory/user_role.md", scope: "personal" }],
uuid: randomUUID(),
session_id: "test-session",
},
createResult(),
{ type: "system", subtype: "session_state_changed", state: "idle" },
]);
await agent.prompt({ sessionId: "test-session", prompt: [{ type: "text", text: "hi" }] });
const toolCall = updates.find((u: any) => u.update?.sessionUpdate === "tool_call");
expect(toolCall.update.title).toBe("Recalled 1 memory");
});
it("emits synthesis content and no locations for synthesize mode", async () => {
const { agent, updates } = createMockAgentWithCapture();
injectSession(agent, [
{
type: "system",
subtype: "memory_recall",
mode: "synthesize",
memories: [
{
path: "<synthesis:/Users/test/.claude/memory>",
scope: "personal",
content: "The user prefers terse responses and writes Go.",
},
],
uuid: randomUUID(),
session_id: "test-session",
},
createResult(),
{ type: "system", subtype: "session_state_changed", state: "idle" },
]);
await agent.prompt({ sessionId: "test-session", prompt: [{ type: "text", text: "hi" }] });
const toolCall = updates.find((u: any) => u.update?.sessionUpdate === "tool_call");
expect(toolCall).toBeDefined();
expect(toolCall.update.title).toBe("Recalled synthesized memory");
expect(toolCall.update.locations).toBeUndefined();
expect(toolCall.update.content).toEqual([
{
type: "content",
content: { type: "text", text: "The user prefers terse responses and writes Go." },
},
]);
expect(toolCall.update._meta.claudeCode.toolResponse).toEqual({ mode: "synthesize" });
});
});
describe("post-error recovery", () => {
function createMockAgent() {
const mockClient = {
sessionUpdate: async () => {},
} as unknown as AgentSideConnection;
return new ClaudeAcpAgent(mockClient, { log: () => {}, error: () => {} });
}
function createResultMessage(overrides: {
subtype: "success" | "error_during_execution";
stop_reason: string | null;
is_error: boolean;
result?: string;
errors?: string[];
}) {
return {
type: "result" as const,
subtype: overrides.subtype,
stop_reason: overrides.stop_reason,
is_error: overrides.is_error,
result: overrides.result ?? "",
errors: overrides.errors ?? [],
duration_ms: 0,
duration_api_ms: 0,
num_turns: 1,
total_cost_usd: 0,
usage: {
input_tokens: 10,
output_tokens: 5,
cache_read_input_tokens: 0,
cache_creation_input_tokens: 0,
},
modelUsage: {},
permission_denials: [],
uuid: randomUUID(),
session_id: "test-session",
};
}
// Two-turn generator: turn 1 yields the caller-supplied `firstTurn`
// messages (including a trailing idle that the drain must consume).
// Turn 2 yields a clean success + idle, used to verify the next prompt
// sees real messages rather than the stale idle.
function injectTwoTurnSession(agent: ClaudeAcpAgent, firstTurn: unknown[]) {
const input = new Pushable<any>();
const interrupt = vi.fn(async () => {});
const close = vi.fn();
async function* messageGenerator() {
const iter = input[Symbol.asyncIterator]();
const first = await iter.next();
if (!first.done && first.value) {
yield {
type: "user",
message: first.value.message,
parent_tool_use_id: null,
uuid: first.value.uuid,
session_id: "test-session",
isReplay: true,
};
}
yield* firstTurn;
const second = await iter.next();
if (!second.done && second.value) {
yield {
type: "user",
message: second.value.message,
parent_tool_use_id: null,
uuid: second.value.uuid,
session_id: "test-session",
isReplay: true,
};
}
yield createResultMessage({ subtype: "success", stop_reason: null, is_error: false });
yield { type: "system", subtype: "session_state_changed", state: "idle" };
}
const gen = Object.assign(messageGenerator(), { interrupt, close });
agent.sessions["test-session"] = {
query: gen as any,
input,
cancelled: false,
cwd: "/test",
sessionFingerprint: JSON.stringify({ cwd: "/test", mcpServers: [] }),
modes: { currentModeId: "default", availableModes: [] },
models: { currentModelId: "default", availableModels: [] },
modelInfos: [],
settingsManager: { dispose: vi.fn() } as any,
accumulatedUsage: {
inputTokens: 0,
outputTokens: 0,
cachedReadTokens: 0,
cachedWriteTokens: 0,
},
configOptions: [],
promptRunning: false,
pendingMessages: new Map(),
nextPendingOrder: 0,
abortController: new AbortController(),
emitRawSDKMessages: false,
contextWindowSize: 200000,
taskState: new Map(),
};
return { interrupt };
}
it("drains a failed turn's trailing idle so the next prompt is not short-circuited", async () => {
const agent = createMockAgent();
const { interrupt } = injectTwoTurnSession(agent, [
createResultMessage({
subtype: "success",
stop_reason: "end_turn",
is_error: true,
result: "boom",
}),
// Trailing idle from the failed turn. Without draining, the next
// prompt's first query.next() would consume this and short-circuit
// to end_turn with zero usage (issue #654).
{ type: "system", subtype: "session_state_changed", state: "idle" },
]);
await expect(
agent.prompt({
sessionId: "test-session",
prompt: [{ type: "text", text: "first" }],
}),
).rejects.toThrow();
expect(interrupt).toHaveBeenCalled();
const second = await agent.prompt({
sessionId: "test-session",
prompt: [{ type: "text", text: "second" }],
});
expect(second.stopReason).toBe("end_turn");
expect(second.usage?.inputTokens).toBe(10);
expect(second.usage?.outputTokens).toBe(5);
});
it("cancels all queued pending prompts when a turn errors", async () => {
const agent = createMockAgent();
injectTwoTurnSession(agent, [
createResultMessage({
subtype: "success",
stop_reason: "end_turn",
is_error: true,
result: "boom",
}),
{ type: "system", subtype: "session_state_changed", state: "idle" },
]);
// Simulate two prompts already queued behind the running turn. Both
// resolvers should fire with `true` (cancelled) when the running
// prompt errors, and the map should be cleared.
const session = agent.sessions["test-session"];
let resolveA!: (cancelled: boolean) => void;
let resolveB!: (cancelled: boolean) => void;
const pendingA = new Promise<boolean>((r) => (resolveA = r));
const pendingB = new Promise<boolean>((r) => (resolveB = r));
session.pendingMessages.set("uuid-a", { resolve: resolveA, order: 0 });
session.pendingMessages.set("uuid-b", { resolve: resolveB, order: 1 });
await expect(
agent.prompt({
sessionId: "test-session",
prompt: [{ type: "text", text: "first" }],
}),
).rejects.toThrow();
await expect(pendingA).resolves.toBe(true);
await expect(pendingB).resolves.toBe(true);
expect(session.pendingMessages.size).toBe(0);
});
});

View File

@@ -76,4 +76,33 @@ describe("additionalRoots", () => {
});
expect(capturedOptions!.additionalDirectories).toEqual(["/workspace/shared", "", root]);
});
it("prefers the official ACP additionalDirectories field over _meta.additionalRoots", async () => {
await agent.newSession({
cwd: "/test",
mcpServers: [],
additionalDirectories: ["/from/official"],
_meta: { additionalRoots: ["/from/meta"] },
});
expect(capturedOptions!.additionalDirectories).toEqual(["/from/official"]);
});
it("merges official ACP additionalDirectories with claudeCode SDK additionalDirectories", async () => {
await agent.newSession({
cwd: "/test",
mcpServers: [],
additionalDirectories: ["/from/official"],
_meta: { claudeCode: { options: { additionalDirectories: ["/from/sdk"] } } },
});
expect(capturedOptions!.additionalDirectories).toEqual(["/from/sdk", "/from/official"]);
});
it("falls back to _meta.additionalRoots when the official field is omitted", async () => {
await agent.newSession({
cwd: "/test",
mcpServers: [],
_meta: { additionalRoots: ["/from/meta"] },
});
expect(capturedOptions!.additionalDirectories).toEqual(["/from/meta"]);
});
});

View File

@@ -117,7 +117,7 @@ describe("authorization", () => {
expect.objectContaining({
options: expect.objectContaining({
env: expect.objectContaining({
ANTHROPIC_AUTH_TOKEN: "",
ANTHROPIC_AUTH_TOKEN: " ",
ANTHROPIC_BASE_URL: "https://gateway.example",
ANTHROPIC_CUSTOM_HEADERS: "x-api-key: test",
userEnv: "userEnv",

View File

@@ -65,8 +65,9 @@ const MOCK_CONFIG_OPTIONS = [
description: "Available effort levels for this model",
type: "select",
category: "effort",
currentValue: "high",
currentValue: "default",
options: [
{ value: "default", name: "Default" },
{ value: "low", name: "Low" },
{ value: "medium", name: "Medium" },
{ value: "high", name: "High" },
@@ -445,7 +446,7 @@ describe("session config options", () => {
(o: any) => o.id === "effort",
);
expect(effortOption).toBeUndefined();
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: undefined });
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: null });
});
it("clamps effort in config_option_update when new model has different supported levels", async () => {
@@ -483,8 +484,8 @@ describe("session config options", () => {
(o: any) => o.id === "effort",
);
expect(effortOption).toBeDefined();
expect(effortOption.currentValue).toBe("high");
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: "high" });
expect(effortOption.currentValue).toBe("default");
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: null });
});
it("preserves effort in config_option_update when new model supports same level", async () => {
@@ -557,6 +558,31 @@ describe("session config options", () => {
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: "low" });
});
it("calls applyFlagSettings with null effortLevel for 'default'", async () => {
// Set effort to a non-default value first
const session = (agent as unknown as { sessions: Record<string, any> }).sessions[SESSION_ID];
const effortOpt = session.configOptions.find((o: any) => o.id === "effort");
if (effortOpt) effortOpt.currentValue = "high";
await agent.setSessionConfigOption({
sessionId: SESSION_ID,
configId: "effort",
value: "default",
});
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: null });
// The SDK's applyFlagSettings travels over a JSON pipe and only clears a
// flag-layer key when an explicit `null` is sent — `undefined` is
// dropped during JSON.stringify, which would leave the previous effort
// override in place. Round-trip the call args through JSON to make sure
// the key actually reaches the SDK.
const calls = applyFlagSettingsSpy.mock.calls;
const lastCallArgs = calls[calls.length - 1]?.[0];
const serialized = JSON.parse(JSON.stringify(lastCallArgs));
expect(serialized).toHaveProperty("effortLevel", null);
});
it("updates effort currentValue in returned configOptions", async () => {
const response = await agent.setSessionConfigOption({
sessionId: SESSION_ID,
@@ -663,7 +689,7 @@ describe("session config options", () => {
value: "claude-sonnet-4-6",
});
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: undefined });
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: null });
});
it("adds effort option when switching to a model that supports effort", async () => {
@@ -696,8 +722,8 @@ describe("session config options", () => {
const effortOption = response.configOptions.find((o) => o.id === "effort");
expect(effortOption).toBeDefined();
// No previous effort, so defaults to "high" (the API default)
expect(effortOption?.currentValue).toBe("high");
// No previous effort, so defaults to "default" (no effort override)
expect(effortOption?.currentValue).toBe("default");
});
it("clamps effort to valid value when new model has different supported levels", async () => {
@@ -731,10 +757,10 @@ describe("session config options", () => {
const effortOption = response.configOptions.find((o) => o.id === "effort");
expect(effortOption).toBeDefined();
// "max" is not in sonnet's levels, so should fall back to "high" (the API default)
expect(effortOption?.currentValue).toBe("high");
// SDK should be told about the clamped value
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: "high" });
// "max" is not in sonnet's levels, so should fall back to "default" (no effort override)
expect(effortOption?.currentValue).toBe("default");
// SDK should be told to clear the effort override
expect(applyFlagSettingsSpy).toHaveBeenCalledWith({ effortLevel: null });
});
it("preserves effort value when new model supports the same level", async () => {