mirror of
https://github.com/agentclientprotocol/claude-agent-acp.git
synced 2026-10-27 04:30:59 +00:00
feat(deps): Bump @anthropic-ai/claude-agent-sdk to 0.3.283 (#1186)
Bumps the minor group with 38 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript) | `0.3.280` | `0.3.282` | | [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript) | `0.127.0` | `0.128.0` | | [prettier](https://github.com/prettier/prettier) | `3.9.8` | `3.9.9` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `5.0.1` | `5.0.2` | | @anthropic-ai/claude-agent-sdk-darwin-arm64 | `0.3.280` | `0.3.282` | | @anthropic-ai/claude-agent-sdk-darwin-x64 | `0.3.280` | `0.3.282` | | @anthropic-ai/claude-agent-sdk-linux-arm64 | `0.3.280` | `0.3.282` | | @anthropic-ai/claude-agent-sdk-linux-arm64-musl | `0.3.280` | `0.3.282` | | @anthropic-ai/claude-agent-sdk-linux-x64 | `0.3.280` | `0.3.282` | | @anthropic-ai/claude-agent-sdk-linux-x64-musl | `0.3.280` | `0.3.282` | | @anthropic-ai/claude-agent-sdk-win32-arm64 | `0.3.280` | `0.3.282` | | @anthropic-ai/claude-agent-sdk-win32-x64 | `0.3.280` | `0.3.282` | | [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) | `1.30.0` | `1.30.1` | | [@oxc-project/types](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types) | `0.150.0` | `0.151.0` | | [@rolldown/binding-android-arm-eabi](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-android-arm64](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-darwin-arm64](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-darwin-x64](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-freebsd-x64](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-linux-arm-gnueabihf](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-linux-arm64-gnu](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-linux-arm64-musl](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-linux-ppc64-gnu](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-linux-s390x-gnu](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-linux-x64-gnu](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-linux-x64-musl](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-openharmony-arm64](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-win32-arm64-msvc](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@rolldown/binding-win32-x64-msvc](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [@vitest/mocker](https://github.com/vitest-dev/vitest/tree/HEAD/packages/mocker) | `5.0.1` | `5.0.2` | | [@vitest/spy](https://github.com/vitest-dev/vitest/tree/HEAD/packages/spy) | `5.0.1` | `5.0.2` | | [hono](https://github.com/honojs/hono) | `4.13.8` | `4.13.10` | | [magic-string](https://github.com/Rich-Harris/magic-string) | `1.4.1` | `1.4.2` | | [rolldown](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) | `1.2.9` | `1.2.11` | | [tinybench](https://github.com/tinylibs/tinybench) | `6.1.4` | `6.2.0` | | [tinyexec](https://github.com/tinylibs/tinyexec) | `1.3.0` | `1.3.1` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.3.0` | `8.3.1` | | [why-is-node-running](https://github.com/mafintosh/why-is-node-running) | `2.3.0` | `3.2.2` | Updates `@anthropic-ai/claude-agent-sdk` from 0.3.280 to 0.3.282 <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.282</h2> <h2>What's changed</h2> <ul> <li>Added support for <code>strictKnownMarketplaces</code> and <code>blockedMarketplaces</code> in host-supplied <code>managedSettings</code>: the allowlist applies only where admin policy sets none; the blocklist adds to the admin's</li> <li>Added <code>@anthropic-ai/claude-agent-sdk/core</code>, a smaller entry point for apps that bundle the SDK (query, MCP tool helpers, session mutations, <code>resolveSettings</code>); it uses your installed zod and MCP SDK</li> <li>Added <code>prewarm()</code> and <code>SpareProcess.claim()</code> (alpha): start a Claude Code process before its session is known and bind it to a folder and its per-session options later</li> <li>Fixed <code>readMcpResource()</code> relaying content <code>_meta</code> keys under the CLI-reserved <code>com.anthropic/</code> prefix; they are now dropped, as for tool results</li> <li>Updated to parity with Claude Code v2.1.282</li> </ul> <h2>Update</h2> <pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.282 # or yarn add @anthropic-ai/claude-agent-sdk@0.3.282 # or pnpm add @anthropic-ai/claude-agent-sdk@0.3.282 # or bun add @anthropic-ai/claude-agent-sdk@0.3.282 </code></pre> <h2>v0.3.281</h2> <h2>What's changed</h2> <ul> <li>Added optional <code>trigger</code>, <code>user_message_uuid</code> and <code>timestamp</code> fields to the <code>conversation_reset</code> message so clients can tell what reset the conversation, match a /clear to its message, and show when the reset happened</li> <li>Fixed permission and dialog callbacks still being invoked for requests that arrived after <code>close()</code></li> <li>Fixed control requests issued after a query closed hanging or leaking, and permission prompts that could not be cancelled after a cancelled request was redelivered</li> <li>Fixed <code>session_state_changed</code> staying at <code>requires_action</code> after an overlapping permission prompt and sandbox network-access prompt were both answered</li> <li>Improved SDK package size and load time: <code>sdk.mjs</code> no longer bundles unused dependencies (1.47 MB → 0.97 MB)</li> <li>Improved startup time for <code>query()</code> sessions with in-process MCP servers (<code>createSdkMcpServer</code>) by running their handshake inside the SDK; <code>initialize</code> may now wait up to 250 ms for them</li> <li>Improved SDK session start-up: the CLI now answers the host's initialize request before starting its background start-up work</li> <li>Changed the <code>Settings</code> type's <code>attribution</code> field to <code>boolean | {...}</code>; TypeScript code that reads <code>attribution.commit</code> from returned settings needs a type narrow</li> <li>Updated to parity with Claude Code v2.1.281</li> </ul> <h2>Update</h2> <pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.281 # or yarn add @anthropic-ai/claude-agent-sdk@0.3.281 # or pnpm add @anthropic-ai/claude-agent-sdk@0.3.281 # or bun add @anthropic-ai/claude-agent-sdk@0.3.281 </code></pre> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md">@anthropic-ai/claude-agent-sdk's changelog</a>.</em></p> <blockquote> <h2>0.3.282</h2> <ul> <li>Added support for <code>strictKnownMarketplaces</code> and <code>blockedMarketplaces</code> in host-supplied <code>managedSettings</code>: the allowlist applies only where admin policy sets none; the blocklist adds to the admin's</li> <li>Added <code>@anthropic-ai/claude-agent-sdk/core</code>, a smaller entry point for apps that bundle the SDK (query, MCP tool helpers, session mutations, <code>resolveSettings</code>); it uses your installed zod and MCP SDK</li> <li>Added <code>prewarm()</code> and <code>SpareProcess.claim()</code> (alpha): start a Claude Code process before its session is known and bind it to a folder and its per-session options later</li> <li>Fixed <code>readMcpResource()</code> relaying content <code>_meta</code> keys under the CLI-reserved <code>com.anthropic/</code> prefix; they are now dropped, as for tool results</li> <li>Updated to parity with Claude Code v2.1.282</li> </ul> <h2>0.3.281</h2> <ul> <li>Added optional <code>trigger</code>, <code>user_message_uuid</code> and <code>timestamp</code> fields to the <code>conversation_reset</code> message so clients can tell what reset the conversation, match a /clear to its message, and show when the reset happened</li> <li>Fixed permission and dialog callbacks still being invoked for requests that arrived after <code>close()</code></li> <li>Fixed control requests issued after a query closed hanging or leaking, and permission prompts that could not be cancelled after a cancelled request was redelivered</li> <li>Fixed <code>session_state_changed</code> staying at <code>requires_action</code> after an overlapping permission prompt and sandbox network-access prompt were both answered</li> <li>Improved SDK package size and load time: <code>sdk.mjs</code> no longer bundles unused dependencies (1.47 MB → 0.97 MB)</li> <li>Improved startup time for <code>query()</code> sessions with in-process MCP servers (<code>createSdkMcpServer</code>) by running their handshake inside the SDK; <code>initialize</code> may now wait up to 250 ms for them</li> <li>Improved SDK session start-up: the CLI now answers the host's initialize request before starting its background start-up work</li> <li>Changed the <code>Settings</code> type's <code>attribution</code> field to <code>boolean | {...}</code>; TypeScript code that reads <code>attribution.commit</code> from returned settings needs a type narrow</li> <li>Updated to parity with Claude Code v2.1.281</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="9e477a178c"><code>9e477a1</code></a> chore: Update CHANGELOG.md</li> <li><a href="fb04f66354"><code>fb04f66</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.280...v0.3.282">compare view</a></li> </ul> </details> <br /> Updates `@anthropic-ai/sdk` from 0.127.0 to 0.128.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/anthropics/anthropic-sdk-typescript/releases">@anthropic-ai/sdk's releases</a>.</em></p> <blockquote> <h2>sdk: v0.128.0</h2> <h2>0.128.0 (2026-09-22)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.127.0...sdk-v0.128.0">sdk-v0.127.0...sdk-v0.128.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add support for claude-opus-5-5, inline tool definitions and MCP tool-list pinning (beta) (<a href="eff27483d2">eff2748</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>api:</strong> share one evaluated_permission enum across Managed Agents events (<a href="0c1cc0fdf8">0c1cc0f</a>)</li> <li><strong>tools:</strong> addTools() takes effect straight away (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/773">#773</a>) (<a href="1ccdad0d1b">1ccdad0</a>)</li> <li><strong>tools:</strong> leave reply-only params off the tool runner's compaction request (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/769">#769</a>) (<a href="8afc3364dc">8afc336</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>docs:</strong> add descriptions to the Dreams API reference (<a href="ea4ddd1ee3">ea4ddd1</a>)</li> <li><strong>docs:</strong> add descriptions to the User Profiles API reference (<a href="ea4ddd1ee3">ea4ddd1</a>)</li> <li><strong>docs:</strong> add memory store descriptions to the Managed Agents API reference (<a href="ea4ddd1ee3">ea4ddd1</a>)</li> <li><strong>docs:</strong> improve descriptions in the Dreams API reference (<a href="971c54a5dd">971c54a</a>)</li> <li><strong>docs:</strong> simplify the session thread agent type description (<a href="ccf71a27bd">ccf71a2</a>)</li> <li><strong>docs:</strong> update diagnostics field descriptions on beta messages (<a href="c0b8746679">c0b8746</a>)</li> <li><strong>internal:</strong> add property-based tests for partial JSON parsing (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/776">#776</a>) (<a href="3ffac0927f">3ffac09</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.128.0 (2026-09-22)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.127.0...sdk-v0.128.0">sdk-v0.127.0...sdk-v0.128.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add support for claude-opus-5-5, inline tool definitions and MCP tool-list pinning (beta) (<a href="eff27483d2">eff2748</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>api:</strong> share one evaluated_permission enum across Managed Agents events (<a href="0c1cc0fdf8">0c1cc0f</a>)</li> <li><strong>tools:</strong> addTools() takes effect straight away (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/773">#773</a>) (<a href="1ccdad0d1b">1ccdad0</a>)</li> <li><strong>tools:</strong> leave reply-only params off the tool runner's compaction request (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/769">#769</a>) (<a href="8afc3364dc">8afc336</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>docs:</strong> add descriptions to the Dreams API reference (<a href="ea4ddd1ee3">ea4ddd1</a>)</li> <li><strong>docs:</strong> add descriptions to the User Profiles API reference (<a href="ea4ddd1ee3">ea4ddd1</a>)</li> <li><strong>docs:</strong> add memory store descriptions to the Managed Agents API reference (<a href="ea4ddd1ee3">ea4ddd1</a>)</li> <li><strong>docs:</strong> improve descriptions in the Dreams API reference (<a href="971c54a5dd">971c54a</a>)</li> <li><strong>docs:</strong> simplify the session thread agent type description (<a href="ccf71a27bd">ccf71a2</a>)</li> <li><strong>docs:</strong> update diagnostics field descriptions on beta messages (<a href="c0b8746679">c0b8746</a>)</li> <li><strong>internal:</strong> add property-based tests for partial JSON parsing (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/776">#776</a>) (<a href="3ffac0927f">3ffac09</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="1926adb4d2"><code>1926adb</code></a> Merge pull request <a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/1208">#1208</a> from anthropics/release-please--branches--main--chan...</li> <li><a href="162c8b125d"><code>162c8b1</code></a> chore: release main</li> <li><a href="3ffac0927f"><code>3ffac09</code></a> chore(internal): add property-based tests for partial JSON parsing (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/776">#776</a>)</li> <li><a href="e40ce277c2"><code>e40ce27</code></a> test(ecosystem): check that unused imports tree-shake to nothing</li> <li><a href="1ccdad0d1b"><code>1ccdad0</code></a> fix(tools): addTools() takes effect straight away (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/773">#773</a>)</li> <li><a href="8afc3364dc"><code>8afc336</code></a> fix(tools): leave reply-only params off the tool runner's compaction request ...</li> <li><a href="eff27483d2"><code>eff2748</code></a> feat(api): add support for claude-opus-5-5, inline tool definitions and MCP t...</li> <li><a href="06e5f9b5d1"><code>06e5f9b</code></a> codegen metadata</li> <li><a href="0c1cc0fdf8"><code>0c1cc0f</code></a> fix(api): share one evaluated_permission enum across Managed Agents events</li> <li><a href="c0b8746679"><code>c0b8746</code></a> chore(docs): update diagnostics field descriptions on beta messages</li> <li>Additional commits viewable in <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.127.0...sdk-v0.128.0">compare view</a></li> </ul> </details> <br /> Updates `prettier` from 3.9.8 to 3.9.9 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/releases">prettier's releases</a>.</em></p> <blockquote> <h2>3.9.9</h2> <ul> <li>Markdown: Fix text with <code>$</code> been incorrectly parsed as math syntax (<a href="https://redirect.github.com/prettier/prettier/pull/20140">#20140</a> by <a href="https://github.com/fisker"><code>@fisker</code></a>)</li> </ul> <p>🔗 <a href="https://github.com/prettier/prettier/blob/3.9.9/CHANGELOG.md#399">Changelog</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/blob/main/CHANGELOG.md">prettier's changelog</a>.</em></p> <blockquote> <h1>3.9.9</h1> <p><a href="https://github.com/prettier/prettier/compare/3.9.8...3.9.9">diff</a></p> <h4>Markdown: Fix text with <code>$</code> been incorrectly parsed as math syntax (<a href="https://redirect.github.com/prettier/prettier/pull/20140">#20140</a> by <a href="https://github.com/fisker"><code>@fisker</code></a>)</h4> <!-- raw HTML omitted --> <pre lang="md"><code><!-- Input --> **Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR` from `c.sh`, before anything else runs here. <p><!-- Prettier 3.9.8 --><br /> <strong>Uses $FOO</strong> from <code>a.sh</code> and <code>b.sh</code>, plus <code>$BAR</code>from<code>c.sh</code>, before anything else runs here.</p> <p><!-- Prettier 3.9.9 --><br /> <strong>Uses $FOO</strong> from <code>a.sh</code> and <code>b.sh</code>, plus <code>$BAR</code> from <code>c.sh</code>, before anything else runs here.<br /> </code></pre></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="cdd17f2288"><code>cdd17f2</code></a> Release 3.9.9</li> <li><a href="dc7b8968e6"><code>dc7b896</code></a> Disable <code>singleDollarTextMath</code> in <code>mdast-util-math</code> (<a href="https://redirect.github.com/prettier/prettier/issues/20140">#20140</a>)</li> <li><a href="f9be58fb8e"><code>f9be58f</code></a> Git blame ignore 3.9.8</li> <li><a href="88470cb79c"><code>88470cb</code></a> Bump Prettier dependency to 3.9.8</li> <li><a href="9559cab39e"><code>9559cab</code></a> Clean changelog_unreleased</li> <li><a href="4fc8ee8746"><code>4fc8ee8</code></a> Update dependents count</li> <li>See full diff in <a href="https://github.com/prettier/prettier/compare/3.9.8...3.9.9">compare view</a></li> </ul> </details> <br /> Updates `vitest` from 5.0.1 to 5.0.2 <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>v5.0.2</h2> <h3> 🐞 Bug Fixes</h3> <ul> <li>Bind <code>process</code> in case global is overwritten - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11343">vitest-dev/vitest#11343</a> <a href="https://github.com/vitest-dev/vitest/commit/0b79231ad"><!-- raw HTML omitted -->(0b792)<!-- raw HTML omitted --></a></li> <li><strong>detect-async-leaks</strong>: <ul> <li>Ignore <code>process.stdio</code> handles - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11333">vitest-dev/vitest#11333</a> <a href="https://github.com/vitest-dev/vitest/commit/0fd6b9790"><!-- raw HTML omitted -->(0fd6b)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>expect</strong>: <ul> <li>Fix <code>toMatchObject</code> with asymmetric matchers - by <a href="https://github.com/ShreeBohara"><code>@ShreeBohara</code></a>, <strong>Claude Opus 5</strong>, <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>Codex (GPT-5)</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11100">vitest-dev/vitest#11100</a> <a href="https://github.com/vitest-dev/vitest/commit/42523289e"><!-- raw HTML omitted -->(42523)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>jsdom</strong>: <ul> <li>Fix <code>Request</code> with <code>Blob</code> body on jsdom 28+ - by <a href="https://github.com/harshit-d3v"><code>@harshit-d3v</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11295">vitest-dev/vitest#11295</a> <a href="https://github.com/vitest-dev/vitest/commit/d1c3ecc93"><!-- raw HTML omitted -->(d1c3e)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>reporter</strong>: <ul> <li><code>agent</code> to respect <code>--silent</code> - by <a href="https://github.com/Raj4478"><code>@Raj4478</code></a> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11271">vitest-dev/vitest#11271</a> <a href="https://github.com/vitest-dev/vitest/commit/5b95efb6d"><!-- raw HTML omitted -->(5b95e)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>reporters</strong>: <ul> <li>Handle concurrent <code>createReport</code> calls - by <a href="https://github.com/7rulnik"><code>@7rulnik</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11278">vitest-dev/vitest#11278</a> <a href="https://github.com/vitest-dev/vitest/commit/e8e556ff7"><!-- raw HTML omitted -->(e8e55)<!-- raw HTML omitted --></a></li> <li><code>hanging-process</code> to use ESM entrypoint - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11316">vitest-dev/vitest#11316</a> <a href="https://github.com/vitest-dev/vitest/commit/4e91e5668"><!-- raw HTML omitted -->(4e91e)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>spy</strong>: <ul> <li>Fix stack overflow when spying <code>Set.prototype.add</code> - by <a href="https://github.com/fengmk2"><code>@fengmk2</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11299">vitest-dev/vitest#11299</a> <a href="https://github.com/vitest-dev/vitest/commit/a0a939653"><!-- raw HTML omitted -->(a0a93)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>ui</strong>: <ul> <li>Persist authentication cookie beyond current browser session - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>OpenCode (gpt-5.6-sol)</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11066">vitest-dev/vitest#11066</a> <a href="https://github.com/vitest-dev/vitest/commit/f88195e16"><!-- raw HTML omitted -->(f8819)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <h5> <a href="https://github.com/vitest-dev/vitest/compare/v5.0.1...v5.0.2">View changes on GitHub</a></h5> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="428e2e5043"><code>428e2e5</code></a> chore: release v5.0.2 (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11357">#11357</a>)</li> <li><a href="0b79231ad7"><code>0b79231</code></a> fix: bind <code>process</code> in case global is overwritten (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11343">#11343</a>)</li> <li><a href="597df569ab"><code>597df56</code></a> docs: correct stale config defaults (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11354">#11354</a>)</li> <li><a href="ea1c44fb58"><code>ea1c44f</code></a> docs: <code>sequence.setupFiles</code> default is <code>'list'</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11351">#11351</a>)</li> <li><a href="0fd6b97902"><code>0fd6b97</code></a> fix(detect-async-leaks): ignore <code>process.stdio</code> handles (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11333">#11333</a>)</li> <li><a href="4e91e56687"><code>4e91e56</code></a> fix(reporters): <code>hanging-process</code> to use ESM entrypoint (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11316">#11316</a>)</li> <li><a href="1a57929a49"><code>1a57929</code></a> docs(browser): fix locators.exact default (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11338">#11338</a>)</li> <li><a href="5b95efb6df"><code>5b95efb</code></a> fix(reporter): <code>agent</code> to respect <code>--silent</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11271">#11271</a>)</li> <li><a href="f58a209779"><code>f58a209</code></a> docs: correct benchmark.exclude and watch defaults (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11268">#11268</a>)</li> <li><a href="d1c3ecc932"><code>d1c3ecc</code></a> fix(jsdom): fix <code>Request</code> with <code>Blob</code> body on jsdom 28+ (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11295">#11295</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitest-dev/vitest/commits/v5.0.2/packages/vitest">compare view</a></li> </ul> </details> <br /> Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.280 to 0.3.282 Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.280 to 0.3.282 Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.280 to 0.3.282 Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.280 to 0.3.282 Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.280 to 0.3.282 Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.280 to 0.3.282 Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.280 to 0.3.282 Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.280 to 0.3.282 Updates `@modelcontextprotocol/sdk` from 1.30.0 to 1.30.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/modelcontextprotocol/typescript-sdk/releases">@modelcontextprotocol/sdk's releases</a>.</em></p> <blockquote> <h2>1.30.1</h2> <h2>What's Changed</h2> <ul> <li>[v1.x] fix(server): read HTTP request bodies with a size limit and bound JSON-RPC batch length by <a href="https://github.com/maxisbey"><code>@maxisbey</code></a> in <a href="https://redirect.github.com/modelcontextprotocol/typescript-sdk/pull/2717">modelcontextprotocol/typescript-sdk#2717</a></li> <li>fix(auth): preserve resource URI without trailing slash (<a href="https://redirect.github.com/modelcontextprotocol/typescript-sdk/issues/1968">#1968</a>) by <a href="https://github.com/MukundaKatta"><code>@MukundaKatta</code></a> in <a href="https://redirect.github.com/modelcontextprotocol/typescript-sdk/pull/1972">modelcontextprotocol/typescript-sdk#1972</a></li> <li>chore: bump version to 1.30.1 by <a href="https://github.com/claude"><code>@claude</code></a>[bot] in <a href="https://redirect.github.com/modelcontextprotocol/typescript-sdk/pull/2848">modelcontextprotocol/typescript-sdk#2848</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/MukundaKatta"><code>@MukundaKatta</code></a> made their first contribution in <a href="https://redirect.github.com/modelcontextprotocol/typescript-sdk/pull/1972">modelcontextprotocol/typescript-sdk#1972</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/modelcontextprotocol/typescript-sdk/compare/1.30.0...1.30.1">https://github.com/modelcontextprotocol/typescript-sdk/compare/1.30.0...1.30.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="289ac2c3af"><code>289ac2c</code></a> chore: bump version to 1.30.1 (<a href="https://redirect.github.com/modelcontextprotocol/typescript-sdk/issues/2848">#2848</a>)</li> <li><a href="12b425678a"><code>12b4256</code></a> fix(auth): preserve resource URI without trailing slash (<a href="https://redirect.github.com/modelcontextprotocol/typescript-sdk/issues/1968">#1968</a>) (<a href="https://redirect.github.com/modelcontextprotocol/typescript-sdk/issues/1972">#1972</a>)</li> <li><a href="a9f6eb709b"><code>a9f6eb7</code></a> [v1.x] fix(server): read HTTP request bodies with a size limit and bound JSON...</li> <li>See full diff in <a href="https://github.com/modelcontextprotocol/typescript-sdk/compare/1.30.0...1.30.1">compare view</a></li> </ul> </details> <br /> Updates `@oxc-project/types` from 0.150.0 to 0.151.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.151.0</h2> <h3>🚀 Features</h3> <ul> <li>1fac655 coverage: Support new TypeScript fixture layout (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26226">#26226</a>) (camc314)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>cd7228f minifier: Add missing negation for boolean literal (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26847">#26847</a>) (Armano)</li> <li>32305e2 transformer: Skip enum reverse mappings for syntactic string initializers (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26724">#26724</a>) (Dunqing)</li> <li>7811f0a parser: Preserve reparsed <code>await</code> tokens (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26619">#26619</a>) (camc314)</li> <li>9220158 transformer: Skip recovered using loop patterns (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26722">#26722</a>) (camc314)</li> <li>3130405 parser: Recover await using object binding patterns (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26721">#26721</a>) (camc314)</li> <li>827fdbd parser: Reject invalid modifiers on import aliases (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26622">#26622</a>) (camc314)</li> </ul> <h3>⚡ Performance</h3> <ul> <li>3f1e3aa minifier: Preallocate stmts vec size to avoid excesive reallocs (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26856">#26856</a>) (Armano)</li> <li>bd3f69e semantic: Reuse identifier hashes in enum member lookups (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26773">#26773</a>) (camc314)</li> <li>5f72954 minifier: Reduce allocations when processing if statements (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26666">#26666</a>) (Armano)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="bec650f15b"><code>bec650f</code></a> release(crates): oxc v0.151.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types/issues/26875">#26875</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/crates_v0.151.0/npm/oxc-types">compare view</a></li> </ul> </details> <br /> Updates `@rolldown/binding-android-arm-eabi` from 1.2.9 to 1.2.11 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rolldown/rolldown/releases">@rolldown/binding-android-arm-eabi's releases</a>.</em></p> <blockquote> <h2>v1.2.11</h2> <h2>[1.2.11] - 2026-09-24</h2> <h3>🚀 Features</h3> <ul> <li>watch: report only file events (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10974">#10974</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>sourcemap: preserve names through <code>collapse_sourcemaps</code> (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9486">#9486</a>) by <a href="https://github.com/eoin"><code>@eoin</code></a></li> <li>watch: map metadata events by kind and missing paths as deleted (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10973">#10973</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>🚜 Refactor</h3> <ul> <li>rolldown_fs_watcher: hand the handler file events instead of notify results (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10980">#10980</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: share one event handler adapter between the notify watchers (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10979">#10979</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: register every path with one watch mode (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10978">#10978</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: tweak the backend traits and the event mapping (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10977">#10977</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>watch: translate notify events inside FsWatcher (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10972">#10972</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>📚 Documentation</h3> <ul> <li>watch: update the fs watcher layout and the dev coordinator message (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10981">#10981</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>watch: document the event translation in FsWatcher (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10975">#10975</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>◀️ Revert</h3> <ul> <li>"perf(dev/lazy): fetch a lazy route in one request" (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10789">#10789</a>) (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10982">#10982</a>) by <a href="https://github.com/h-a-n-a"><code>@h-a-n-a</code></a></li> </ul> <h3>❤️ New Contributors</h3> <ul> <li><a href="https://github.com/eoin"><code>@eoin</code></a> made their first contribution in <a href="https://redirect.github.com/rolldown/rolldown/pull/9486">#9486</a></li> </ul> <p>Co-authored-by: shulaoda <a href="mailto:165626830+shulaoda@users.noreply.github.com">165626830+shulaoda@users.noreply.github.com</a></p> <h2>v1.2.10</h2> <h2>[1.2.10] - 2026-09-23</h2> <h3>🚀 Features</h3> <ul> <li>rolldown_plugin_esm_external_require: prefer 'module.exports' over a namespace spread (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10901">#10901</a>) by <a href="https://github.com/isker"><code>@isker</code></a></li> <li>watch: support directories in addWatchFile (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10944">#10944</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>label code-splitting timing rows (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10896">#10896</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>separate code-splitting group timing rows (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10892">#10892</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>clarify callback owners in the timing report (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10890">#10890</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>add checks.bundlerTimings with deprecated pluginTimings alias (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10883">#10883</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>code-splitting: initialize leaves behind a re-exported namespace import (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10694">#10694</a>) by <a href="https://github.com/hyfdev"><code>@hyfdev</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-arm-eabi's changelog</a>.</em></p> <blockquote> <h2>[1.2.11] - 2026-09-24</h2> <h3>🚀 Features</h3> <ul> <li>watch: report only file events (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10974">#10974</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>sourcemap: preserve names through <code>collapse_sourcemaps</code> (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9486">#9486</a>) by <a href="https://github.com/eoin"><code>@eoin</code></a></li> <li>watch: map metadata events by kind and missing paths as deleted (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10973">#10973</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>🚜 Refactor</h3> <ul> <li>rolldown_fs_watcher: hand the handler file events instead of notify results (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10980">#10980</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: share one event handler adapter between the notify watchers (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10979">#10979</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: register every path with one watch mode (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10978">#10978</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: tweak the backend traits and the event mapping (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10977">#10977</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>watch: translate notify events inside FsWatcher (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10972">#10972</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>📚 Documentation</h3> <ul> <li>watch: update the fs watcher layout and the dev coordinator message (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10981">#10981</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>watch: document the event translation in FsWatcher (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10975">#10975</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>◀️ Revert</h3> <ul> <li>"perf(dev/lazy): fetch a lazy route in one request" (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10789">#10789</a>) (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10982">#10982</a>) by <a href="https://github.com/h-a-n-a"><code>@h-a-n-a</code></a></li> </ul> <h3>❤️ New Contributors</h3> <ul> <li><a href="https://github.com/eoin"><code>@eoin</code></a> made their first contribution in <a href="https://redirect.github.com/rolldown/rolldown/pull/9486">#9486</a></li> </ul> <h2>[1.2.10] - 2026-09-23</h2> <h3>🚀 Features</h3> <ul> <li>rolldown_plugin_esm_external_require: prefer 'module.exports' over a namespace spread (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10901">#10901</a>) by <a href="https://github.com/isker"><code>@isker</code></a></li> <li>watch: support directories in addWatchFile (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10944">#10944</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>label code-splitting timing rows (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10896">#10896</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>separate code-splitting group timing rows (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10892">#10892</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>clarify callback owners in the timing report (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10890">#10890</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>add checks.bundlerTimings with deprecated pluginTimings alias (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10883">#10883</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>code-splitting: initialize leaves behind a re-exported namespace import (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10694">#10694</a>) by <a href="https://github.com/hyfdev"><code>@hyfdev</code></a></li> <li>node: record the WASI target on the WebContainer binding fallback (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10952">#10952</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>dev: force incremental build on in DevEngine::new (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10958">#10958</a>) by <a href="https://github.com/o-alexandrov"><code>@o-alexandrov</code></a></li> <li>tree-shaking: propagate side effects through cycles (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10893">#10893</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="8df4219851"><code>8df4219</code></a> release: v1.2.11 (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10987">#10987</a>)</li> <li><a href="6f85455383"><code>6f85455</code></a> revert: "perf(dev/lazy): fetch a lazy route in one request" (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10789">#10789</a>) (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10982">#10982</a>)</li> <li><a href="78699253af"><code>7869925</code></a> feat(watch): report only file events (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10974">#10974</a>)</li> <li><a href="3b8e06e99b"><code>3b8e06e</code></a> release: v1.2.10 (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10969">#10969</a>)</li> <li><a href="ec5bab8832"><code>ec5bab8</code></a> feat(rolldown_plugin_esm_external_require): prefer 'module.exports' over a na...</li> <li><a href="bb1db15db2"><code>bb1db15</code></a> chore(deps): update napi (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10959">#10959</a>)</li> <li><a href="374639ef58"><code>374639e</code></a> fix(node): record the WASI target on the WebContainer binding fallback (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10952">#10952</a>)</li> <li><a href="cfc9d19df0"><code>cfc9d19</code></a> refactor(watch): let FsWatcher own the watched paths (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10948">#10948</a>)</li> <li><a href="1551cf8a09"><code>1551cf8</code></a> feat(watch): support directories in addWatchFile (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10944">#10944</a>)</li> <li><a href="b12f077c66"><code>b12f077</code></a> test: handle Windows paths in sourcemap callback tests (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10942">#10942</a>)</li> <li>Additional commits viewable in <a href="https://github.com/rolldown/rolldown/commits/v1.2.11/packages/rolldown">compare view</a></li> </ul> </details> <br /> Updates `@rolldown/binding-android-arm64` from 1.2.9 to 1.2.11 <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.2.11</h2> <h2>[1.2.11] - 2026-09-24</h2> <h3>🚀 Features</h3> <ul> <li>watch: report only file events (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10974">#10974</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>sourcemap: preserve names through <code>collapse_sourcemaps</code> (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9486">#9486</a>) by <a href="https://github.com/eoin"><code>@eoin</code></a></li> <li>watch: map metadata events by kind and missing paths as deleted (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10973">#10973</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>🚜 Refactor</h3> <ul> <li>rolldown_fs_watcher: hand the handler file events instead of notify results (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10980">#10980</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: share one event handler adapter between the notify watchers (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10979">#10979</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: register every path with one watch mode (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10978">#10978</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: tweak the backend traits and the event mapping (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10977">#10977</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>watch: translate notify events inside FsWatcher (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10972">#10972</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>📚 Documentation</h3> <ul> <li>watch: update the fs watcher layout and the dev coordinator message (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10981">#10981</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>watch: document the event translation in FsWatcher (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10975">#10975</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>◀️ Revert</h3> <ul> <li>"perf(dev/lazy): fetch a lazy route in one request" (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10789">#10789</a>) (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10982">#10982</a>) by <a href="https://github.com/h-a-n-a"><code>@h-a-n-a</code></a></li> </ul> <h3>❤️ New Contributors</h3> <ul> <li><a href="https://github.com/eoin"><code>@eoin</code></a> made their first contribution in <a href="https://redirect.github.com/rolldown/rolldown/pull/9486">#9486</a></li> </ul> <p>Co-authored-by: shulaoda <a href="mailto:165626830+shulaoda@users.noreply.github.com">165626830+shulaoda@users.noreply.github.com</a></p> <h2>v1.2.10</h2> <h2>[1.2.10] - 2026-09-23</h2> <h3>🚀 Features</h3> <ul> <li>rolldown_plugin_esm_external_require: prefer 'module.exports' over a namespace spread (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10901">#10901</a>) by <a href="https://github.com/isker"><code>@isker</code></a></li> <li>watch: support directories in addWatchFile (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10944">#10944</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>label code-splitting timing rows (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10896">#10896</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>separate code-splitting group timing rows (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10892">#10892</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>clarify callback owners in the timing report (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10890">#10890</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>add checks.bundlerTimings with deprecated pluginTimings alias (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10883">#10883</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>code-splitting: initialize leaves behind a re-exported namespace import (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10694">#10694</a>) by <a href="https://github.com/hyfdev"><code>@hyfdev</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.2.11] - 2026-09-24</h2> <h3>🚀 Features</h3> <ul> <li>watch: report only file events (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10974">#10974</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>sourcemap: preserve names through <code>collapse_sourcemaps</code> (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9486">#9486</a>) by <a href="https://github.com/eoin"><code>@eoin</code></a></li> <li>watch: map metadata events by kind and missing paths as deleted (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10973">#10973</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>🚜 Refactor</h3> <ul> <li>rolldown_fs_watcher: hand the handler file events instead of notify results (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10980">#10980</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: share one event handler adapter between the notify watchers (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10979">#10979</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: register every path with one watch mode (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10978">#10978</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>rolldown_fs_watcher: tweak the backend traits and the event mapping (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10977">#10977</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>watch: translate notify events inside FsWatcher (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10972">#10972</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>📚 Documentation</h3> <ul> <li>watch: update the fs watcher layout and the dev coordinator message (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10981">#10981</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>watch: document the event translation in FsWatcher (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10975">#10975</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>◀️ Revert</h3> <ul> <li>"perf(dev/lazy): fetch a lazy route in one request" (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10789">#10789</a>) (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10982">#10982</a>) by <a href="https://github.com/h-a-n-a"><code>@h-a-n-a</code></a></li> </ul> <h3>❤️ New Contributors</h3> <ul> <li><a href="https://github.com/eoin"><code>@eoin</code></a> made their first contribution in <a href="https://redirect.github.com/rolldown/rolldown/pull/9486">#9486</a></li> </ul> <h2>[1.2.10] - 2026-09-23</h2> <h3>🚀 Features</h3> <ul> <li>rolldown_plugin_esm_external_require: prefer 'module.exports' over a namespace spread (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10901">#10901</a>) by <a href="https://github.com/isker"><code>@isker</code></a></li> <li>watch: support directories in addWatchFile (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10944">#10944</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>label code-splitting timing rows (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10896">#10896</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>separate code-splitting group timing rows (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10892">#10892</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>clarify callback owners in the timing report (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10890">#10890</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> <li>add checks.bundlerTimings with deprecated pluginTimings alias (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10883">#10883</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>code-splitting: initialize leaves behind a re-exported namespace import (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10694">#10694</a>) by <a href="https://github.com/hyfdev"><code>@hyfdev</code></a></li> <li>node: record the WASI target on the WebContainer binding fallback (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10952">#10952</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> <li>dev: force incremental build on in DevEngine::new (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10958">#10958</a>) by <a href="https://github.com/o-alexandrov"><code>@o-alexandrov</code></a></li> <li>tree-shaking: propagate side effects through cycles (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10893">#10893</a>) by <a href="https://github.com/IWANABETHATGUY"><code>@IWANABETHATGUY</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="8df4219851"><code>8df4219</code></a> release: v1.2.11 (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10987">#10987</a>)</li> <li><a href="6f85455383"><code>6f85455</code></a> revert: "perf(dev/lazy): fetch a lazy route in one request" (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10789">#10789</a>) (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10982">#10982</a>)</li> <li><a href="78699253af"><code>7869925</code></a> feat(watch): report only file events (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10974">#10974</a>)</li> <li><a href="3b8e06e99b"><code>3b8e06e</code></a> release: v1.2.10 (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10969">#10969</a>)</li> <li><a href="ec5bab8832"><code>ec5bab8</code></a> feat(rolldown_plugin_esm_external_require): prefer 'module.exports' over a na...</li> <li><a href="bb1db15db2"><code>bb1db15</code></a> chore(deps): update napi (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10959">#10959</a>)</li> <li><a href="374639ef58"><code>374639e</code></a> fix(node): record the WASI target on the WebContainer binding fallback (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10952">#10952</a>)</li> <li><a href="cfc9d19df0"><code>cfc9d19</code></a> refactor(watch): let FsWatcher own the watched paths (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10948">#10948</a>)</li> <li><a href="1551cf8a09"><code>1551cf8</code></a> feat(watch): support directories in addWatchFile (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10944">#10944</a>)</li> <li><a href="b12f077c66"><code>b12f077</code></a> test: handle Windows paths in sourcemap callback tests (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10942">#10942</a>)</li> <li>Additional commits viewable in <a href="https://github.com/rolldown/rolldown/commits/v1.2.11/packages/rolldown">compare view</a></li> </ul> </details> <br /> Updates `@rolldown/binding-darwin-arm64` from 1.2.9 to 1.2.11 <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.2.11</h2> <h2>[1.2.11] - 2026-09-24</h2> <h3>🚀 Features</h3> <ul> <li>watch: report only file events (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/10974">#10974</a>) by <a href="https://github.com/shulaoda"><code>@shulaoda</code></a></li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>sourcemap: preserve names through <code>collapse_sourcemaps</code> (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown/issues/9486">#9486</a>) by <a href="https://github.com/eoin"><code>@eoin</code></a></li> <li>watch: map metadata events by kind and missing paths as deleted (<a href="https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown... _Description has been truncated_ --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
This commit is contained in:
714
package-lock.json
generated
714
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
12
package.json
12
package.json
@@ -65,16 +65,16 @@
|
||||
"node": ">=22"
|
||||
},
|
||||
"dependencies": {
|
||||
"@agentclientprotocol/sdk": "1.5.0",
|
||||
"@anthropic-ai/claude-agent-sdk": "0.3.280",
|
||||
"@agentclientprotocol/sdk": "1.5.1",
|
||||
"@anthropic-ai/claude-agent-sdk": "0.3.283",
|
||||
"diff": "9.0.0",
|
||||
"zod": "4.6.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@anthropic-ai/sdk": "0.127.0",
|
||||
"@anthropic-ai/sdk": "0.128.0",
|
||||
"@eslint/js": "10.0.1",
|
||||
"@tsconfig/node22": "22.0.6",
|
||||
"@types/node": "26.6.2",
|
||||
"@types/node": "26.6.3",
|
||||
"@typescript-eslint/eslint-plugin": "8.70.1",
|
||||
"@typescript-eslint/parser": "8.70.1",
|
||||
"ajv": "8.20.0",
|
||||
@@ -82,9 +82,9 @@
|
||||
"eslint": "10.11.0",
|
||||
"eslint-config-prettier": "10.1.8",
|
||||
"globals": "17.12.0",
|
||||
"prettier": "3.9.8",
|
||||
"prettier": "3.9.9",
|
||||
"ts-node": "10.9.2",
|
||||
"typescript": "6.0.3",
|
||||
"vitest": "5.0.1"
|
||||
"vitest": "5.0.2"
|
||||
}
|
||||
}
|
||||
|
||||
138
src/acp-agent.ts
138
src/acp-agent.ts
@@ -833,6 +833,9 @@ export type Session = {
|
||||
* terminal (e.g. /doctor, /color). ACP clients aren't that terminal, so
|
||||
* these are filtered out of `available_commands_update` payloads. */
|
||||
terminalSlashCommands?: string[];
|
||||
/** Serialized `system`/init `plugin_errors` last logged, so the per-turn
|
||||
* init re-emit logs a plugin load failure once, not every turn. */
|
||||
loggedPluginErrors?: string;
|
||||
/** The long-lived consumer task. Lazily started on the first `prompt()` and
|
||||
* kept alive for the session so between-turn/background messages are still
|
||||
* drained and forwarded. */
|
||||
@@ -928,16 +931,16 @@ export type Session = {
|
||||
* prompts so mid-stream usage_update notifications report a correct `size`
|
||||
* before the turn's first result message arrives. Seeded synchronously at
|
||||
* session creation and on model switches from the per-model cache or the
|
||||
* text heuristic (DEFAULT_CONTEXT_WINDOW when both miss), then confirmed —
|
||||
* and the cache populated — by each result's modelUsage. No extra
|
||||
* `getContextUsage` IPC is on these paths: before the first turn it can add
|
||||
* tens of seconds to both fresh and resumed sessions (see the seeding call
|
||||
* sites and `contextWindowCache`). */
|
||||
* text heuristic (DEFAULT_CONTEXT_WINDOW when both miss), refined by a
|
||||
* background `getContextUsage` when that seed was a guess (see
|
||||
* `refreshContextWindowInBackground`), then confirmed — and the cache
|
||||
* populated — by each result's modelUsage. No awaited IPC is on these
|
||||
* paths (see the seeding call sites and `contextWindowCache`). */
|
||||
contextWindowSize: number;
|
||||
contextUsedTokens?: number;
|
||||
/** Whether `contextWindowSize` came from an authoritative source (the
|
||||
* cross-session cache or a `result.modelUsage`) rather than the text
|
||||
* heuristic / default. Guards the
|
||||
* cross-session cache, a `result.modelUsage`, or the background
|
||||
* `getContextUsage`) rather than the text heuristic / default. Guards the
|
||||
* mid-stream `message_start` heuristic upgrade: an authoritative window that
|
||||
* happens to equal DEFAULT_CONTEXT_WINDOW must not be mistaken for "unseeded"
|
||||
* and clobbered by a "1m" text match. */
|
||||
@@ -4591,6 +4594,20 @@ export class ClaudeAcpAgent {
|
||||
this.logger.error(`Failed to re-advertise slash commands: ${error}`);
|
||||
}
|
||||
}
|
||||
// Plugin load failures (CLI 2.1.283+) have no ACP surface;
|
||||
// log them so a missing plugin isn't silent.
|
||||
if (message.plugin_errors?.length) {
|
||||
const pluginErrors = JSON.stringify(message.plugin_errors);
|
||||
if (pluginErrors !== session.loggedPluginErrors) {
|
||||
session.loggedPluginErrors = pluginErrors;
|
||||
for (const error of message.plugin_errors) {
|
||||
this.logger.error(
|
||||
`Plugin ${error.plugin} failed to load (${error.type})` +
|
||||
`${error.path ? ` from ${error.path}` : ""}: ${error.message}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "status": {
|
||||
if (message.status === "compacting") {
|
||||
@@ -7983,6 +8000,41 @@ export class ClaudeAcpAgent {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace a heuristic context window with `getContextUsage().rawMaxTokens`
|
||||
* without blocking the caller. The text heuristic misses natively-1M models
|
||||
* whose picker rows carry no "1m" token (`sonnet`, and since CLI 2.1.283
|
||||
* `opus`/`default`), which would otherwise report 200k until the first
|
||||
* result's modelUsage. Never awaited: SDK control requests are serialized,
|
||||
* so an awaited call would delay session/new or a model switch (before the
|
||||
* first turn it took ~15s on older CLIs, issues #886/#880; ~0.5s on 2.1.283).
|
||||
* Not written to `contextWindowCache` — that stays keyed to the
|
||||
* `result.modelUsage` spellings — and a result still overwrites it.
|
||||
*/
|
||||
private refreshContextWindowInBackground(sessionId: string, session: Session): void {
|
||||
if (session.contextWindowAuthoritative) return;
|
||||
const { query } = session;
|
||||
const modelId = session.models.currentModelId;
|
||||
const stillCurrent = () =>
|
||||
this.sessions[sessionId] === session &&
|
||||
session.query === query &&
|
||||
session.models.currentModelId === modelId;
|
||||
// A synchronous throw must not fail the caller either.
|
||||
Promise.resolve()
|
||||
.then(() => query.getContextUsage())
|
||||
.then(
|
||||
(usage) => {
|
||||
if (!stillCurrent() || session.contextWindowAuthoritative) return;
|
||||
if (!(usage.rawMaxTokens > 0)) return;
|
||||
session.contextWindowSize = usage.rawMaxTokens;
|
||||
session.contextWindowAuthoritative = true;
|
||||
},
|
||||
(error) => {
|
||||
if (stillCurrent()) this.logger.error("Failed to read the context window:", error);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
private async applyConfigOptionValue(
|
||||
sessionId: string,
|
||||
session: Session,
|
||||
@@ -7997,19 +8049,16 @@ export class ClaudeAcpAgent {
|
||||
// context window for semantic aliases (e.g. `default`) whose ID alone
|
||||
// carries no "1m" token.
|
||||
const newModelInfo = session.modelInfos.find((m) => m.value === value);
|
||||
if (session.models.currentModelId !== value) {
|
||||
// Seed the new model's context window WITHOUT any IPC on the switch
|
||||
// path: cached authoritative value if we've already learned it (from a
|
||||
// prior turn's `result.modelUsage`), else the text heuristic, else the
|
||||
// default. We deliberately do NOT call `getContextUsage` here — before
|
||||
// a fresh session's first prompt turn that control request is not
|
||||
// serviced (~15s stall, issues #886/#880), and (because SDK control
|
||||
// requests are serialized over one channel) it would drag the awaited
|
||||
// `setModel` down with it. The authoritative window arrives on the
|
||||
// first `result.modelUsage` for the model and is cached from there;
|
||||
// until then a switched-to alias that has never run a turn shows the
|
||||
// heuristic/default window, which self-corrects on its first response
|
||||
// (matches pre-0.59.0 behavior).
|
||||
const modelChanged = session.models.currentModelId !== value;
|
||||
if (modelChanged) {
|
||||
// Seed the new model's context window WITHOUT awaited IPC on the
|
||||
// switch path: cached authoritative value if we've already learned it
|
||||
// (from a prior turn's `result.modelUsage`), else the text heuristic,
|
||||
// else the default. SDK control requests are serialized over one
|
||||
// channel, so an awaited `getContextUsage` here would delay the rest
|
||||
// of the switch (issues #886/#880); a guessed seed is instead refined
|
||||
// in the background once the switch is done
|
||||
// (`refreshContextWindowInBackground`).
|
||||
const seeded = immediateContextWindow(session.providerCacheKey, value, newModelInfo);
|
||||
session.contextWindowSize = seeded.size;
|
||||
session.contextWindowAuthoritative = seeded.authoritative;
|
||||
@@ -8151,6 +8200,8 @@ export class ClaudeAcpAgent {
|
||||
if (modeDowngraded) {
|
||||
await this.sessionModes.publishFallbackState(sessionId, session);
|
||||
}
|
||||
// Last, so the switch's own control requests don't queue behind it.
|
||||
if (modelChanged) this.refreshContextWindowInBackground(sessionId, session);
|
||||
} else if (configId === EFFORT_CONFIG_ID) {
|
||||
// Apply first so a rejected control request cannot leave the displayed
|
||||
// value ahead of the SDK flag layer.
|
||||
@@ -8873,10 +8924,12 @@ export class ClaudeAcpAgent {
|
||||
}
|
||||
|
||||
// Apply user's `availableModels` allowlist from settings.json before any
|
||||
// downstream model handling. The SDK only enforces this allowlist in its
|
||||
// own UI, not in `initializationResult.models`, so we filter here to keep
|
||||
// configOptions, the current-model resolver, and the stored modelInfos
|
||||
// consistent with what the user configured.
|
||||
// downstream model handling. `initializationResult.models` is already
|
||||
// policy-filtered by the CLI; we rebuild the picker from the allowlist
|
||||
// so the user's exact spellings (and `modelOverrides` targets) are the
|
||||
// values passed to `setModel`, keeping configOptions, the current-model
|
||||
// resolver, and the stored modelInfos consistent with what the user
|
||||
// configured. Managed `deniedModels` drops entries the CLI would refuse.
|
||||
const settingsAvailableModels = settingsManager.getSettings().availableModels;
|
||||
const settingsModelOverrides = settingsManager.getSettings().modelOverrides;
|
||||
const allowedModels = Array.isArray(settingsAvailableModels)
|
||||
@@ -8884,6 +8937,7 @@ export class ClaudeAcpAgent {
|
||||
initializationResult.models,
|
||||
settingsAvailableModels,
|
||||
settingsModelOverrides,
|
||||
settingsManager.getManagedDeniedModels(),
|
||||
)
|
||||
: initializationResult.models;
|
||||
|
||||
@@ -8987,21 +9041,17 @@ export class ClaudeAcpAgent {
|
||||
if (useRecommendedValue && typeof initialEffort?.currentValue === "string") {
|
||||
await q.applyFlagSettings({ effortLevel: toSdkEffortLevel(initialEffort.currentValue) });
|
||||
}
|
||||
// Seed the context window without extra IPC. The cached authoritative
|
||||
// Seed the context window without awaited IPC. The cached authoritative
|
||||
// window from a prior turn wins (`result.modelUsage`, cross-session),
|
||||
// then the text heuristic, then the default. We deliberately do NOT issue
|
||||
// a getContextUsage call here: before the first prompt turn that control
|
||||
// request can take tens of seconds, on resumed as well as fresh sessions.
|
||||
// The authoritative window arrives on the first `result.modelUsage` and
|
||||
// is cached from there.
|
||||
// then the text heuristic, then the default. A guessed seed is refined
|
||||
// by a background getContextUsage once the session is registered
|
||||
// (`refreshContextWindowInBackground`); the authoritative window then
|
||||
// arrives on the first `result.modelUsage` and is cached from there.
|
||||
//
|
||||
// Text inference alone misses aliases that resolve to extended-context
|
||||
// models with no "1m" token anywhere in their id or description (e.g.
|
||||
// `sonnet` → claude-sonnet-5, natively ~1M): those stream
|
||||
// `usage_update.size: 200000` until the first result's modelUsage corrects
|
||||
// it — but the cache means only the FIRST session to ever run a turn on such
|
||||
// a model eats that window, not every fresh session after a process
|
||||
// restart (issue #596).
|
||||
// `sonnet` → claude-sonnet-5, and `opus`/`default` since CLI 2.1.283,
|
||||
// all natively ~1M) — the background refresh covers those (issue #596).
|
||||
//
|
||||
// The inference fallback is deliberately keyed to the allowlisted entry: a
|
||||
// fallback-resolved sibling's resolvedModel/displayName/description can
|
||||
@@ -9077,6 +9127,7 @@ export class ClaudeAcpAgent {
|
||||
fileChangeReporter,
|
||||
};
|
||||
timing.phase("register");
|
||||
this.refreshContextWindowInBackground(sessionId, this.sessions[sessionId]);
|
||||
|
||||
return {
|
||||
sessionId,
|
||||
@@ -10310,6 +10361,7 @@ export function toAcpNotifications(
|
||||
case "compaction_delta":
|
||||
case "advisor_tool_result":
|
||||
case "fallback":
|
||||
case "mcp_tool_listing":
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -10582,10 +10634,9 @@ function commonPrefixLength(a: string, b: string) {
|
||||
* "claude-opus-4-8[1m]", "Opus 4.7 (1M context)"), so callers pass those too.
|
||||
* This text scan can't catch every model — some resolve to extended-context
|
||||
* models with no "1m" anywhere (e.g. `sonnet` → claude-sonnet-5, natively
|
||||
* ~1M). Such a miss falls back to the default window and is corrected by
|
||||
* `result.modelUsage` (and cached) within one turn. We do NOT consult the
|
||||
* SDK's `getContextUsage` to close that gap: before the first prompt turn it
|
||||
* can take tens of seconds (issues #886/#880, see `contextWindowCache`). */
|
||||
* ~1M). Such a miss falls back to the default window, is refined by the
|
||||
* background `getContextUsage` (`refreshContextWindowInBackground`), and is
|
||||
* corrected by `result.modelUsage` (and cached) within one turn. */
|
||||
function inferContextWindowFromModel(...texts: Array<string | undefined>): number | null {
|
||||
if (texts.some((text) => text != null && /\b1m\b/i.test(text))) return 1_000_000;
|
||||
return null;
|
||||
@@ -10606,11 +10657,10 @@ function inferContextWindowFromModel(...texts: Array<string | undefined>): numbe
|
||||
* verbatim live id (rows without `resolvedModel`) can hit too.
|
||||
*
|
||||
* Populated authoritatively by each `result.modelUsage` a turn confirms (see
|
||||
* the consumer's result handler). We deliberately never populate it from a
|
||||
* fresh session's `getContextUsage`: before that session's first prompt turn
|
||||
* has run the control request is not serviced (it stalls ~15s, and serializes
|
||||
* ahead of an awaited `setModel` — issues #886/#880, regressed in 0.59.0), so
|
||||
* it can neither beat the first `result` nor be issued cheaply before one.
|
||||
* the consumer's result handler). We deliberately never populate it from
|
||||
* `getContextUsage`: its `model` spelling and `rawMaxTokens` can differ from
|
||||
* the `result.modelUsage` key and window (e.g. 967000 vs 1000000 for sonnet),
|
||||
* so it only refines the live session (`refreshContextWindowInBackground`).
|
||||
* Cleared on `logout`: 1M-context entitlement can differ per account/tier, so
|
||||
* windows learned under one login must not seed sessions under the next. */
|
||||
const contextWindowCache = new Map<string, number>();
|
||||
|
||||
@@ -260,6 +260,39 @@ function resolveSettingsModel(
|
||||
return resolveModelPreference(models, settingsModel);
|
||||
}
|
||||
|
||||
const MODEL_FAMILY_ALIASES = new Set(["opus", "sonnet", "haiku", "fable"]);
|
||||
|
||||
/** A model id without the spellings `deniedModels` ignores: provider
|
||||
* prefixes, dates, version suffixes, `-fast` and context hints. */
|
||||
function normalizeDeniedModelId(value: string): string {
|
||||
let id = stripContextHints(value.trim().toLowerCase());
|
||||
const providerPrefix = id.lastIndexOf("anthropic.");
|
||||
if (providerPrefix !== -1) id = id.slice(providerPrefix + "anthropic.".length);
|
||||
return id
|
||||
.replace(/@.*$/, "")
|
||||
.replace(/-v\d+(?::\d+)?$/, "")
|
||||
.replace(/-fast$/, "")
|
||||
.replace(/-\d{8}$/, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether managed `deniedModels` blocks a model id, following the CLI's rules
|
||||
* closely enough for the picker: a family alias blocks the whole family, and a
|
||||
* model id blocks that version in every spelling plus the later minor versions
|
||||
* it prefixes (`claude-opus-5` also blocks `claude-opus-5-5`). The CLI stays
|
||||
* the enforcer; this only keeps the picker from offering a refused row.
|
||||
*/
|
||||
export function isDeniedModel(modelId: string, deniedModels: readonly string[]): boolean {
|
||||
const id = normalizeDeniedModelId(modelId);
|
||||
if (!id) return false;
|
||||
return deniedModels.some((entry) => {
|
||||
const denied = normalizeDeniedModelId(entry);
|
||||
if (!denied) return false;
|
||||
if (MODEL_FAMILY_ALIASES.has(denied)) return id === denied || id.includes(`-${denied}`);
|
||||
return id === denied || id.startsWith(`${denied}-`);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Restrict the SDK's model list to the user's `availableModels` allowlist
|
||||
* (already merged-and-deduped across settings sources by `SettingsManager`).
|
||||
@@ -275,11 +308,14 @@ function resolveSettingsModel(
|
||||
* - `undefined` is handled by the caller (no allowlist applied).
|
||||
* - The Default option is unaffected by `availableModels` — it always remains
|
||||
* available, even when the allowlist is `[]`.
|
||||
* - Managed `deniedModels` wins over the allowlist, so a denied entry is
|
||||
* dropped even though the CLI would otherwise leave it unmatched.
|
||||
*/
|
||||
export function applyAvailableModelsAllowlist(
|
||||
sdkModels: ModelInfo[],
|
||||
allowlist: string[],
|
||||
settingsModelOverrides?: Record<string, string>,
|
||||
deniedModels: readonly string[] = [],
|
||||
): ModelInfo[] {
|
||||
// Default is always preserved per the docs. Synthesize one if the SDK
|
||||
// didn't surface it so downstream code (e.g. `getAvailableModels` picking
|
||||
@@ -310,6 +346,13 @@ export function applyAvailableModelsAllowlist(
|
||||
if (seen.has(effective)) continue;
|
||||
|
||||
const sdkMatch = resolveModelPreference(sdkModelsWithoutDefault, trimmed);
|
||||
if (
|
||||
[trimmed, effective, sdkMatch?.resolvedModel].some(
|
||||
(id) => id != null && isDeniedModel(id, deniedModels),
|
||||
)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (sdkMatch) {
|
||||
result.push({ ...sdkMatch, value: effective });
|
||||
} else {
|
||||
|
||||
@@ -49,6 +49,7 @@ export interface SettingsManagerOptions {
|
||||
export class SettingsManager {
|
||||
private cwd: string;
|
||||
private effective: Settings = {};
|
||||
private managedDeniedModels: string[] = [];
|
||||
private watchers: fs.FSWatcher[] = [];
|
||||
private onChange?: () => void;
|
||||
private logger: { log: (...args: any[]) => void; error: (...args: any[]) => void };
|
||||
@@ -106,9 +107,14 @@ export class SettingsManager {
|
||||
try {
|
||||
const resolved = await resolveSettings({ cwd: this.cwd });
|
||||
this.effective = filterEscalatingDefaultMode(resolved);
|
||||
// The CLI reads `deniedModels` from managed settings only.
|
||||
this.managedDeniedModels = resolved.sources
|
||||
.filter((entry) => entry.source === "managed")
|
||||
.flatMap((entry) => entry.settings.deniedModels ?? []);
|
||||
} catch (error) {
|
||||
this.logger.error("Failed to resolve settings:", error);
|
||||
this.effective = {};
|
||||
this.managedDeniedModels = [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,6 +177,14 @@ export class SettingsManager {
|
||||
return this.effective;
|
||||
}
|
||||
|
||||
/**
|
||||
* `deniedModels` entries from the managed tier, the only tier the CLI
|
||||
* honors them from.
|
||||
*/
|
||||
getManagedDeniedModels(): string[] {
|
||||
return this.managedDeniedModels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current working directory
|
||||
*/
|
||||
|
||||
@@ -852,26 +852,40 @@ describe("createSession options merging", () => {
|
||||
return (agent as unknown as { sessions: Record<string, any> }).sessions[sessionId];
|
||||
}
|
||||
|
||||
it("does not call getContextUsage during session creation", async () => {
|
||||
// getContextUsage stalls until the session's first prompt turn has run
|
||||
// (it is not serviced pre-turn), so session/new must never call it —
|
||||
it("does not wait for getContextUsage during session creation", async () => {
|
||||
// SDK control requests are serialized and getContextUsage used to stall
|
||||
// until the first prompt turn, so session/new only kicks it off —
|
||||
// awaiting it inline is what regressed session/new latency in 0.59.0.
|
||||
const ctxSpy = vi.fn(async () => ({ rawMaxTokens: 967000 }));
|
||||
const ctxSpy = vi.fn(() => new Promise<never>(() => {}));
|
||||
contextUsageResult = ctxSpy;
|
||||
|
||||
await agent.newSession({ cwd: process.cwd(), mcpServers: [] });
|
||||
const response = await agent.newSession({ cwd: process.cwd(), mcpServers: [] });
|
||||
|
||||
expect(ctxSpy).not.toHaveBeenCalled();
|
||||
expect(ctxSpy).toHaveBeenCalledOnce();
|
||||
expect(sessionFor(response.sessionId).contextWindowSize).toBe(200000);
|
||||
expect(sessionFor(response.sessionId).contextWindowAuthoritative).toBe(false);
|
||||
});
|
||||
|
||||
it("seeds contextWindowSize from text inference, falling back to the default when it misses", async () => {
|
||||
it("refines a guessed window from getContextUsage in the background", async () => {
|
||||
// The mock model ("claude-sonnet-4-6" / "Claude Sonnet" / "Fast") carries
|
||||
// no "1m" token anywhere, so inference misses and the window falls back to
|
||||
// the default; the authoritative value arrives later via result.modelUsage.
|
||||
// no "1m" token anywhere, so inference misses and the seed is the default
|
||||
// until the background getContextUsage answers.
|
||||
contextUsageResult = async () => ({ rawMaxTokens: 967000 });
|
||||
|
||||
const response = await agent.newSession({ cwd: process.cwd(), mcpServers: [] });
|
||||
|
||||
await vi.waitFor(() => expect(sessionFor(response.sessionId).contextWindowSize).toBe(967000));
|
||||
expect(sessionFor(response.sessionId).contextWindowAuthoritative).toBe(true);
|
||||
});
|
||||
|
||||
it("keeps the guessed window when getContextUsage reports a non-positive size", async () => {
|
||||
const ctxSpy = vi.fn(async () => ({ rawMaxTokens: 0 }));
|
||||
contextUsageResult = ctxSpy;
|
||||
|
||||
const response = await agent.newSession({ cwd: process.cwd(), mcpServers: [] });
|
||||
await vi.waitFor(() => expect(ctxSpy).toHaveBeenCalled());
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
|
||||
expect(sessionFor(response.sessionId).contextWindowSize).toBe(200000);
|
||||
expect(sessionFor(response.sessionId).contextWindowAuthoritative).toBe(false);
|
||||
});
|
||||
@@ -918,7 +932,7 @@ describe("createSession options merging", () => {
|
||||
expect(response.configOptions?.find((option) => option.id === "model")?.currentValue).toBe(
|
||||
"haiku",
|
||||
);
|
||||
expect(ctxSpy).not.toHaveBeenCalled();
|
||||
// Kicked off in the background, never awaited: it never answers here.
|
||||
expect(sessionFor("resumed-model-probe").contextWindowAuthoritative).toBe(false);
|
||||
expect(getSessionMessages).toHaveBeenCalledTimes(1);
|
||||
expect(getSessionMessages).toHaveBeenCalledWith("resumed-model-probe");
|
||||
|
||||
@@ -156,7 +156,7 @@ describe("versioned model display names", () => {
|
||||
// Account-dependent model availability requires the same authenticated environment
|
||||
// as the adapter. No prompt is sent: inspect only the SDK initialization response.
|
||||
it.skipIf(!process.env.RUN_INTEGRATION_TESTS)(
|
||||
"the real SDK exposes one named Opus with the expected context suffix",
|
||||
"the real SDK exposes one plain Opus row",
|
||||
async () => {
|
||||
let finishInput!: () => void;
|
||||
const inputGate = new Promise<void>((resolve) => {
|
||||
@@ -178,12 +178,14 @@ it.skipIf(!process.env.RUN_INTEGRATION_TESTS)(
|
||||
/\bopus\b/i.test(`${model.value} ${model.resolvedModel} ${model.displayName}`),
|
||||
);
|
||||
expect(opusModels).toHaveLength(1);
|
||||
// CLI 2.1.283 dropped the "[1m]" / "(1M context)" spelling from the Opus
|
||||
// row: Opus is natively 1M, so the row names the plain model.
|
||||
expect(opusModels[0]).toMatchObject({
|
||||
value: "opus[1m]",
|
||||
displayName: "Opus (1M context)",
|
||||
resolvedModel: expect.stringMatching(/^claude-opus-.*\[1m\]$/),
|
||||
description: expect.stringContaining("1M context"),
|
||||
value: "opus",
|
||||
displayName: "Opus",
|
||||
resolvedModel: expect.stringMatching(/^claude-opus-[\d-]+$/),
|
||||
});
|
||||
expect(opusModels[0].description).not.toMatch(/\b1m\b/i);
|
||||
} finally {
|
||||
clearTimeout(timeout);
|
||||
finishInput();
|
||||
|
||||
@@ -5,6 +5,7 @@ import type { ModelInfo } from "@anthropic-ai/claude-agent-sdk";
|
||||
import {
|
||||
resolveModelPreference,
|
||||
applyAvailableModelsAllowlist,
|
||||
isDeniedModel,
|
||||
matchResumedModel,
|
||||
} from "../session-model.js";
|
||||
import { settingsEffortForModel } from "../session-effort.js";
|
||||
@@ -234,6 +235,49 @@ describe("applyAvailableModelsAllowlist - modelOverrides", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("applyAvailableModelsAllowlist - managed deniedModels", () => {
|
||||
it("drops an allowlisted model that deniedModels blocks, keeping Default", () => {
|
||||
const result = applyAvailableModelsAllowlist(
|
||||
LIVE_SHAPED_MODELS,
|
||||
["claude-sonnet-5", "claude-opus-5-5"],
|
||||
undefined,
|
||||
["claude-opus-5"],
|
||||
);
|
||||
expect(result.map((m) => m.value)).toEqual(["default", "claude-sonnet-5"]);
|
||||
});
|
||||
|
||||
it("checks an alias entry against the row it resolves to", () => {
|
||||
const result = applyAvailableModelsAllowlist(LIVE_SHAPED_MODELS, ["sonnet"], undefined, [
|
||||
"claude-sonnet-5",
|
||||
]);
|
||||
expect(result.map((m) => m.value)).toEqual(["default"]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("isDeniedModel", () => {
|
||||
it("blocks every spelling of a denied version and its later minors", () => {
|
||||
const denied = ["claude-opus-5"];
|
||||
expect(isDeniedModel("claude-opus-5", denied)).toBe(true);
|
||||
expect(isDeniedModel("claude-opus-5-20260101", denied)).toBe(true);
|
||||
expect(isDeniedModel("claude-opus-5[1m]", denied)).toBe(true);
|
||||
expect(isDeniedModel("us.anthropic.claude-opus-5-v1:0", denied)).toBe(true);
|
||||
expect(isDeniedModel("claude-opus-5-5", denied)).toBe(true);
|
||||
expect(isDeniedModel("claude-opus-4-8", denied)).toBe(false);
|
||||
});
|
||||
|
||||
it("blocks only that version when the entry names a minor", () => {
|
||||
expect(isDeniedModel("claude-opus-5", ["claude-opus-5-5"])).toBe(false);
|
||||
expect(isDeniedModel("claude-opus-5-5-fast", ["claude-opus-5-5"])).toBe(true);
|
||||
});
|
||||
|
||||
it("blocks a whole family for a family alias and ignores settings-dependent aliases", () => {
|
||||
expect(isDeniedModel("claude-haiku-4-5-20251001", ["haiku"])).toBe(true);
|
||||
expect(isDeniedModel("haiku", ["haiku"])).toBe(true);
|
||||
expect(isDeniedModel("claude-sonnet-5", ["haiku"])).toBe(false);
|
||||
expect(isDeniedModel("claude-opus-5", ["default", "best", "opusplan"])).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
// Runs against the real SDK (no mocks) so the fixture above is flagged the
|
||||
// moment the SDK's actual model list shape drifts from it. Requires a usable
|
||||
// ANTHROPIC_API_KEY, hence opt-in via RUN_INTEGRATION_TESTS.
|
||||
|
||||
@@ -1155,13 +1155,11 @@ describe("session config options", () => {
|
||||
return (agent as unknown as { sessions: Record<string, any> }).sessions[SESSION_ID];
|
||||
}
|
||||
|
||||
it("sets the window from text inference on model switch, without any getContextUsage IPC", async () => {
|
||||
// getContextUsage stalls until the session's first prompt turn, so the
|
||||
// switch path must never call it; the window is seeded from the text
|
||||
// heuristic (here via the new model's resolvedModel) and later confirmed
|
||||
// by result.modelUsage.
|
||||
it("seeds the window from text inference on model switch", async () => {
|
||||
// The window is seeded synchronously from the text heuristic (here via
|
||||
// the new model's resolvedModel); the background refresh never answers.
|
||||
const session = getSession();
|
||||
session.query.getContextUsage = vi.fn(async () => ({ rawMaxTokens: 967000 }));
|
||||
session.query.getContextUsage = vi.fn(() => new Promise<never>(() => {}));
|
||||
session.modelInfos = session.modelInfos.map((m: ModelInfo) =>
|
||||
m.value === "claude-sonnet-4-6" ? { ...m, resolvedModel: "claude-sonnet-5[1m]" } : m,
|
||||
);
|
||||
@@ -1172,15 +1170,17 @@ describe("session config options", () => {
|
||||
value: "claude-sonnet-4-6",
|
||||
});
|
||||
|
||||
expect(session.query.getContextUsage).not.toHaveBeenCalled();
|
||||
expect(session.contextWindowSize).toBe(1_000_000);
|
||||
expect(session.contextWindowAuthoritative).toBe(false);
|
||||
});
|
||||
|
||||
it("falls back to the default window when inference misses, without any getContextUsage IPC", async () => {
|
||||
it("falls back to the default window when inference misses, then refines it in the background", async () => {
|
||||
const session = getSession();
|
||||
session.contextWindowSize = 1_000_000;
|
||||
// Present but must NOT be called; the switch never consults it.
|
||||
session.query.getContextUsage = vi.fn(async () => ({ rawMaxTokens: 967000 }));
|
||||
let answer!: (usage: { rawMaxTokens: number }) => void;
|
||||
session.query.getContextUsage = vi.fn(
|
||||
() => new Promise<{ rawMaxTokens: number }>((resolve) => (answer = resolve)),
|
||||
);
|
||||
// claude-sonnet-4-6 carries no "1m" token in its id, resolvedModel,
|
||||
// displayName, or description, so inference misses → default window.
|
||||
|
||||
@@ -1190,22 +1190,40 @@ describe("session config options", () => {
|
||||
value: "claude-sonnet-4-6",
|
||||
});
|
||||
|
||||
expect(session.query.getContextUsage).not.toHaveBeenCalled();
|
||||
// The switch resolved without waiting for getContextUsage.
|
||||
expect(session.query.getContextUsage).toHaveBeenCalledOnce();
|
||||
expect(session.contextWindowSize).toBe(200000);
|
||||
|
||||
answer({ rawMaxTokens: 967000 });
|
||||
await vi.waitFor(() => expect(session.contextWindowSize).toBe(967000));
|
||||
expect(session.contextWindowAuthoritative).toBe(true);
|
||||
});
|
||||
|
||||
it("does not call getContextUsage even when switching to a fresh model", async () => {
|
||||
it("drops a background answer that arrives after another switch", async () => {
|
||||
const session = getSession();
|
||||
const spy = vi.fn(async () => ({ rawMaxTokens: 967000 }));
|
||||
session.query.getContextUsage = spy;
|
||||
let answer!: (usage: { rawMaxTokens: number }) => void;
|
||||
session.query.getContextUsage = vi.fn(
|
||||
() => new Promise<{ rawMaxTokens: number }>((resolve) => (answer = resolve)),
|
||||
);
|
||||
|
||||
await agent.setSessionConfigOption({
|
||||
sessionId: SESSION_ID,
|
||||
configId: "model",
|
||||
value: "claude-sonnet-4-6",
|
||||
});
|
||||
const staleAnswer = answer;
|
||||
await agent.setSessionConfigOption({
|
||||
sessionId: SESSION_ID,
|
||||
configId: "model",
|
||||
value: "claude-opus-4-5",
|
||||
});
|
||||
const windowAfterSecondSwitch = session.contextWindowSize;
|
||||
|
||||
expect(spy).not.toHaveBeenCalled();
|
||||
staleAnswer({ rawMaxTokens: 967000 });
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
|
||||
expect(session.contextWindowSize).toBe(windowAfterSecondSwitch);
|
||||
expect(session.contextWindowAuthoritative).toBe(false);
|
||||
});
|
||||
|
||||
it("keeps the learned window when re-asserting the current model", async () => {
|
||||
|
||||
Reference in New Issue
Block a user