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.270 (#1123)
Bumps the minor group with 8 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@anthropic-ai/claude-agent-sdk](https://github.com/anthropics/claude-agent-sdk-typescript) | `0.3.257` | `0.3.263` | | [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript) | `0.122.0` | `0.124.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.4.0` | `26.5.0` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.69.0` | `8.70.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.69.0` | `8.70.0` | | [eslint](https://github.com/eslint/eslint) | `10.9.1` | `10.10.0` | | [hono](https://github.com/honojs/hono) | `4.13.5` | `4.13.7` | | [jose](https://github.com/panva/jose) | `6.2.10` | `6.2.12` | Updates `@anthropic-ai/claude-agent-sdk` from 0.3.257 to 0.3.263 <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.263</h2> <h2>What's changed</h2> <ul> <li>Updated to parity with Claude Code v2.1.263</li> </ul> <h2>Update</h2> <pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.263 # or yarn add @anthropic-ai/claude-agent-sdk@0.3.263 # or pnpm add @anthropic-ai/claude-agent-sdk@0.3.263 # or bun add @anthropic-ai/claude-agent-sdk@0.3.263 </code></pre> <h2>v0.3.261</h2> <h2>What's changed</h2> <ul> <li>Added <code>pluginDelivery: 'initialize'</code> to send <code>plugins</code> over stdin so the launch command line no longer grows with the plugin count (fixes Windows start failures with many plugins)</li> <li>Fixed <code>query()</code> throwing "Object not disposable" in runtimes without a native <code>Symbol.dispose</code>, such as Node ≤22 <code>vm</code> contexts (Jest's <code>node</code> environment, vitest <code>vmThreads</code>/<code>vmForks</code>) and Node <18.18</li> <li>Updated to parity with Claude Code v2.1.261</li> </ul> <h2>Update</h2> <pre lang="sh"><code>npm install @anthropic-ai/claude-agent-sdk@0.3.261 # or yarn add @anthropic-ai/claude-agent-sdk@0.3.261 # or pnpm add @anthropic-ai/claude-agent-sdk@0.3.261 # or bun add @anthropic-ai/claude-agent-sdk@0.3.261 </code></pre> <h2>v0.3.260</h2> <h2>What's changed</h2> <ul> <li>Added optional <code>user_message_uuid</code> to <code>thinking_tokens</code> system messages, linking thinking progress to the user message that triggered the turn</li> <li>Added optional <code>first_content_frame_ms</code>, <code>first_stream_post_ms</code>, <code>first_stream_post_ack_ms</code> and <code>first_stream_post_wall_ms</code> fields to the success result message for remote-session latency breakdowns</li> <li>Fixed <code>managedSettings</code> <code>disableAutoMode: "disable"</code> (either spelling) being dropped by the restrictive-only filter instead of turning auto mode off for the spawned session</li> <li>Fixed <code>rewindFiles()</code> reporting success when no files could be restored (for example when checkpoint backups are missing); it now fails</li> <li>Changed <code>error_max_structured_output_retries</code> results to append the last StructuredOutput tool error; validation errors now name the offending key, allowed values, and actual length or count</li> <li>Changed <code>rate_limit_event</code> to also re-emit during an exceeded window on repeat 429s (about once per 30 seconds per limit window), so stream consumers can refresh stale rate-limit state</li> <li>Updated to parity with Claude Code v2.1.260</li> </ul> <h2>Update</h2> <pre lang="sh"><code></tr></table> </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.263</h2> <ul> <li>Updated to parity with Claude Code v2.1.263</li> </ul> <h2>0.3.262</h2> <ul> <li>Updated to parity with Claude Code v2.1.262</li> </ul> <h2>0.3.261</h2> <ul> <li>Added <code>pluginDelivery: 'initialize'</code> to send <code>plugins</code> over stdin so the launch command line no longer grows with the plugin count (fixes Windows start failures with many plugins)</li> <li>Fixed <code>query()</code> throwing "Object not disposable" in runtimes without a native <code>Symbol.dispose</code>, such as Node ≤22 <code>vm</code> contexts (Jest's <code>node</code> environment, vitest <code>vmThreads</code>/<code>vmForks</code>) and Node <18.18</li> <li>Updated to parity with Claude Code v2.1.261</li> </ul> <h2>0.3.260</h2> <ul> <li>Added optional <code>user_message_uuid</code> to <code>thinking_tokens</code> system messages, linking thinking progress to the user message that triggered the turn</li> <li>Added optional <code>first_content_frame_ms</code>, <code>first_stream_post_ms</code>, <code>first_stream_post_ack_ms</code> and <code>first_stream_post_wall_ms</code> fields to the success result message for remote-session latency breakdowns</li> <li>Fixed <code>managedSettings</code> <code>disableAutoMode: "disable"</code> (either spelling) being dropped by the restrictive-only filter instead of turning auto mode off for the spawned session</li> <li>Fixed <code>rewindFiles()</code> reporting success when no files could be restored (for example when checkpoint backups are missing); it now fails</li> <li>Changed <code>error_max_structured_output_retries</code> results to append the last StructuredOutput tool error; validation errors now name the offending key, allowed values, and actual length or count</li> <li>Changed <code>rate_limit_event</code> to also re-emit during an exceeded window on repeat 429s (about once per 30 seconds per limit window), so stream consumers can refresh stale rate-limit state</li> <li>Updated to parity with Claude Code v2.1.260</li> </ul> <h2>0.3.259</h2> <ul> <li>Added <code>user_message_uuids</code> beside <code>user_message_uuid</code> on a turn's first reply frame and result: every user message the turn answered, so a reply to several merged messages can be matched to each</li> <li>Added <code>permissionPrompts: 'none'</code> option to auto-deny permission prompts in sessions with nobody to answer them, without disabling auto mode's classifier</li> <li>Updated to parity with Claude Code v2.1.259</li> </ul> <h2>0.3.258</h2> <ul> <li>Updated to parity with Claude Code v2.1.258</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="69f318f92f"><code>69f318f</code></a> chore: Update CHANGELOG.md</li> <li><a href="a96f6b5cbe"><code>a96f6b5</code></a> chore: Update CHANGELOG.md</li> <li><a href="a79d677cbd"><code>a79d677</code></a> chore: Update CHANGELOG.md</li> <li><a href="e3d162bdf0"><code>e3d162b</code></a> chore: Update CHANGELOG.md</li> <li><a href="eefd0df145"><code>eefd0df</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.257...v0.3.263">compare view</a></li> </ul> </details> <br /> Updates `@anthropic-ai/sdk` from 0.122.0 to 0.124.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.124.0</h2> <h2>0.124.0 (2026-09-04)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.123.0...sdk-v0.124.0">sdk-v0.123.0...sdk-v0.124.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add Claude Tag category and user breakdowns to usage reports (<a href="669ff22431">669ff22</a>)</li> <li><strong>api:</strong> add named types for organization compliance settings state (<a href="54be8da717">54be8da</a>)</li> <li><strong>api:</strong> add support for sending a workspace ID on more endpoints (<a href="a11e6f1d3b">a11e6f1</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>repair custom-code merge in messages resources (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/455">#455</a>) (<a href="7ac43b92e7">7ac43b9</a>)</li> <li><strong>tools:</strong> create agent-toolset files and directories owner-only (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/485">#485</a>) (<a href="a9c2298873">a9c2298</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>internal:</strong> bundle the mock server spec and update breaking-change detection (<a href="8752d02422">8752d02</a>)</li> <li><strong>internal:</strong> codegen related update (<a href="a63afbc47d">a63afbc</a>)</li> <li><strong>tests:</strong> reword the skip reason on the path-level query param tests (<a href="999bee5bb8">999bee5</a>)</li> </ul> <h3>Documentation</h3> <ul> <li><strong>api:</strong> update a few doc strings (<a href="2ef3d59b81">2ef3d59</a>)</li> </ul> <h2>sdk: v0.123.0</h2> <h2>0.123.0 (2026-09-01)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.122.0...sdk-v0.123.0">sdk-v0.122.0...sdk-v0.123.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> beta user profiles: add external_user_onboarded_at, remove relationship in favor of access_type (<a href="3efb1a1a81">3efb1a1</a>)</li> <li><strong>api:</strong> manual updates (<a href="c6f0bdaff6">c6f0bda</a>)</li> <li><strong>api:</strong> organization compliance settings, user-profile order_by, memory-store and toolset schema updates (<a href="8e2f0c2f7e">8e2f0c2</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>keep credential file access out of non-Node bundles (<a href="ab6a4b2814">ab6a4b2</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>internal:</strong> codegen related update (<a href="788ea8bdaa">788ea8b</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </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.124.0 (2026-09-04)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.123.0...sdk-v0.124.0">sdk-v0.123.0...sdk-v0.124.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add Claude Tag category and user breakdowns to usage reports (<a href="669ff22431">669ff22</a>)</li> <li><strong>api:</strong> add named types for organization compliance settings state (<a href="54be8da717">54be8da</a>)</li> <li><strong>api:</strong> add support for sending a workspace ID on more endpoints (<a href="a11e6f1d3b">a11e6f1</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>repair custom-code merge in messages resources (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/455">#455</a>) (<a href="7ac43b92e7">7ac43b9</a>)</li> <li><strong>tools:</strong> create agent-toolset files and directories owner-only (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/485">#485</a>) (<a href="a9c2298873">a9c2298</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>internal:</strong> bundle the mock server spec and update breaking-change detection (<a href="8752d02422">8752d02</a>)</li> <li><strong>internal:</strong> codegen related update (<a href="a63afbc47d">a63afbc</a>)</li> <li><strong>tests:</strong> reword the skip reason on the path-level query param tests (<a href="999bee5bb8">999bee5</a>)</li> </ul> <h3>Documentation</h3> <ul> <li><strong>api:</strong> update a few doc strings (<a href="2ef3d59b81">2ef3d59</a>)</li> </ul> <h2>0.123.0 (2026-09-01)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.122.0...sdk-v0.123.0">sdk-v0.122.0...sdk-v0.123.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> beta user profiles: add external_user_onboarded_at, remove relationship in favor of access_type (<a href="3efb1a1a81">3efb1a1</a>)</li> <li><strong>api:</strong> manual updates (<a href="c6f0bdaff6">c6f0bda</a>)</li> <li><strong>api:</strong> organization compliance settings, user-profile order_by, memory-store and toolset schema updates (<a href="8e2f0c2f7e">8e2f0c2</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>keep credential file access out of non-Node bundles (<a href="ab6a4b2814">ab6a4b2</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>internal:</strong> codegen related update (<a href="788ea8bdaa">788ea8b</a>)</li> </ul> <h3>Documentation</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="ba14b1f4fd"><code>ba14b1f</code></a> Merge pull request <a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/1177">#1177</a> from anthropics/release-please--branches--main--chan...</li> <li><a href="f99c1a7942"><code>f99c1a7</code></a> chore: release main</li> <li><a href="54be8da717"><code>54be8da</code></a> feat(api): add named types for organization compliance settings state</li> <li><a href="999bee5bb8"><code>999bee5</code></a> chore(tests): reword the skip reason on the path-level query param tests</li> <li><a href="a9c2298873"><code>a9c2298</code></a> fix(tools): create agent-toolset files and directories owner-only (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/485">#485</a>)</li> <li><a href="2637d1198b"><code>2637d11</code></a> chore(examples): refresh platform model IDs (<a href="https://redirect.github.com/anthropics/anthropic-sdk-typescript/issues/376">#376</a>)</li> <li><a href="669ff22431"><code>669ff22</code></a> feat(api): add Claude Tag category and user breakdowns to usage reports</li> <li><a href="a9090aff65"><code>a9090af</code></a> Build SDK</li> <li><a href="8752d02422"><code>8752d02</code></a> chore(internal): bundle the mock server spec and update breaking-change detec...</li> <li><a href="a63afbc47d"><code>a63afbc</code></a> chore(internal): codegen related update</li> <li>Additional commits viewable in <a href="https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.122.0...sdk-v0.124.0">compare view</a></li> </ul> </details> <br /> Updates `@types/node` from 26.4.0 to 26.5.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.69.0 to 8.70.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/eslint-plugin's releases</a>.</em></p> <blockquote> <h2>v8.70.0</h2> <h2>8.70.0 (2026-09-07)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [no-generated-empty-object-type] add rule (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12730">#12730</a>)</li> <li><strong>website:</strong> generate per-page social preview cards (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12734">#12734</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>use stable release of pnpm 12 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12808">#12808</a>)</li> <li>update pnpm to 12.3.4 and dedupe Docusaurus packages (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12829">#12829</a>)</li> <li><strong>eslint-plugin:</strong> [member-ordering] don't report fields that read fields declared before them (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12729">#12729</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-condition] no false positive on RHS of a nested logical expression (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12728">#12728</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated imported values used in object shorthand properties (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12780">#12780</a>)</li> <li><strong>project-service:</strong> avoid discarded tsserver logs (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12748">#12748</a>)</li> <li><strong>typescript-estree:</strong> clarify the parserOptions.project error message (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12817">#12817</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Barry <a href="https://github.com/barry166"><code>@barry166</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Josh Goldberg ✨ <a href="https://github.com/JoshuaKGoldberg"><code>@JoshuaKGoldberg</code></a></li> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>Ulrich Stark <a href="https://github.com/ulrichstark"><code>@ulrichstark</code></a></li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md">@typescript-eslint/eslint-plugin's changelog</a>.</em></p> <blockquote> <h2>8.70.0 (2026-09-07)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [no-generated-empty-object-type] add rule (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12730">#12730</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated imported values used in object shorthand properties (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12780">#12780</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-condition] no false positive on RHS of a nested logical expression (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12728">#12728</a>)</li> <li><strong>eslint-plugin:</strong> [member-ordering] don't report fields that read fields declared before them (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12729">#12729</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Josh Goldberg ✨ <a href="https://github.com/JoshuaKGoldberg"><code>@JoshuaKGoldberg</code></a></li> <li>Ulrich Stark <a href="https://github.com/ulrichstark"><code>@ulrichstark</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="7ee76085c2"><code>7ee7608</code></a> chore(release): publish 8.70.0</li> <li><a href="f66bdcac30"><code>f66bdca</code></a> test(eslint-plugin): [member-ordering] use <code>RuleTester</code> directly in `optional...</li> <li><a href="4586535ab2"><code>4586535</code></a> fix(eslint-plugin): [no-deprecated] report deprecated imported values used in...</li> <li><a href="f8e1e4e2f7"><code>f8e1e4e</code></a> fix(eslint-plugin): [no-unnecessary-condition] no false positive on RHS of a ...</li> <li><a href="889cece8bb"><code>889cece</code></a> fix(eslint-plugin): [member-ordering] don't report fields that read fields de...</li> <li><a href="1a5a8b124b"><code>1a5a8b1</code></a> feat(eslint-plugin): [no-generated-empty-object-type] add rule (<a href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/12730">#12730</a>)</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/eslint-plugin">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/parser` from 8.69.0 to 8.70.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/parser's releases</a>.</em></p> <blockquote> <h2>v8.70.0</h2> <h2>8.70.0 (2026-09-07)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [no-generated-empty-object-type] add rule (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12730">#12730</a>)</li> <li><strong>website:</strong> generate per-page social preview cards (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12734">#12734</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>use stable release of pnpm 12 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12808">#12808</a>)</li> <li>update pnpm to 12.3.4 and dedupe Docusaurus packages (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12829">#12829</a>)</li> <li><strong>eslint-plugin:</strong> [member-ordering] don't report fields that read fields declared before them (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12729">#12729</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-condition] no false positive on RHS of a nested logical expression (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12728">#12728</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated imported values used in object shorthand properties (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12780">#12780</a>)</li> <li><strong>project-service:</strong> avoid discarded tsserver logs (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12748">#12748</a>)</li> <li><strong>typescript-estree:</strong> clarify the parserOptions.project error message (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12817">#12817</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Barry <a href="https://github.com/barry166"><code>@barry166</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Josh Goldberg ✨ <a href="https://github.com/JoshuaKGoldberg"><code>@JoshuaKGoldberg</code></a></li> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>Ulrich Stark <a href="https://github.com/ulrichstark"><code>@ulrichstark</code></a></li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md">@typescript-eslint/parser's changelog</a>.</em></p> <blockquote> <h2>8.70.0 (2026-09-07)</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.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="7ee76085c2"><code>7ee7608</code></a> chore(release): publish 8.70.0</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/parser">compare view</a></li> </ul> </details> <br /> Updates `eslint` from 10.9.1 to 10.10.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/eslint/eslint/releases">eslint's releases</a>.</em></p> <blockquote> <h2>v10.10.0</h2> <h2>Features</h2> <ul> <li><a href="264b4346d1"><code>264b434</code></a> feat: add <code>d</code> and <code>v</code> flags to <code>no-unexpected-multiline</code> (<a href="https://redirect.github.com/eslint/eslint/issues/21305">#21305</a>) (Gihyeon Jeong / 정기현)</li> <li><a href="c6cc6c592f"><code>c6cc6c5</code></a> feat: check <code>Object.prototype</code> property names in <code>new-cap</code> (<a href="https://redirect.github.com/eslint/eslint/issues/21269">#21269</a>) (crimsonjay0)</li> <li><a href="5661fa65fd"><code>5661fa6</code></a> feat: no-extra-bind false negatives with class fields and static blocks (<a href="https://redirect.github.com/eslint/eslint/issues/21260">#21260</a>) (synthex-byte)</li> </ul> <h2>Bug Fixes</h2> <ul> <li><a href="bb47dc6da2"><code>bb47dc6</code></a> fix: update dependency file-entry-cache to v11 (<a href="https://redirect.github.com/eslint/eslint/issues/20801">#20801</a>) (Milos Djermanovic)</li> <li><a href="427ac0a014"><code>427ac0a</code></a> fix: use format strings in debug calls (<a href="https://redirect.github.com/eslint/eslint/issues/21247">#21247</a>) (Francesco Trotta)</li> <li><a href="9d8153223d"><code>9d81532</code></a> fix: support <code>__proto__</code> in <code>/* exported */</code> comments (<a href="https://redirect.github.com/eslint/eslint/issues/21261">#21261</a>) (sethamus)</li> <li><a href="87e0a08243"><code>87e0a08</code></a> fix: prefer-object-has-own autofix breaks when Object is shadowed (<a href="https://redirect.github.com/eslint/eslint/issues/21282">#21282</a>) (김채영)</li> <li><a href="8e2cb14221"><code>8e2cb14</code></a> fix: <code>new-cap</code> false positive for <code>UTC</code> calls with <code>properties: false</code> (<a href="https://redirect.github.com/eslint/eslint/issues/21275">#21275</a>) (Pixel)</li> <li><a href="9f4a364ab0"><code>9f4a364</code></a> fix: Ignore static imports in no-unreachable (<a href="https://redirect.github.com/eslint/eslint/issues/21276">#21276</a>) (Taha Kotil)</li> </ul> <h2>Documentation</h2> <ul> <li><a href="2417cad57d"><code>2417cad</code></a> docs: Update README (GitHub Actions Bot)</li> <li><a href="9cecb8a0a2"><code>9cecb8a</code></a> docs: document <code>\c</code> control letter escapes in no-control-regex (<a href="https://redirect.github.com/eslint/eslint/issues/21286">#21286</a>) (한국)</li> <li><a href="8724829f69"><code>8724829</code></a> docs: update compat table links (<a href="https://redirect.github.com/eslint/eslint/issues/21263">#21263</a>) (fnx)</li> <li><a href="5634542be5"><code>5634542</code></a> docs: Clarify eqeqeq suggestion behavior (<a href="https://redirect.github.com/eslint/eslint/issues/21256">#21256</a>) (Müslüm Yılmaz)</li> </ul> <h2>Chores</h2> <ul> <li><a href="b3d876b460"><code>b3d876b</code></a> chore: disable npm audit in ecosystem tests (<a href="https://redirect.github.com/eslint/eslint/issues/21306">#21306</a>) (Francesco Trotta)</li> <li><a href="1696682791"><code>1696682</code></a> ci: restore EMFILE test on Node.js 26 (<a href="https://redirect.github.com/eslint/eslint/issues/21297">#21297</a>) (Marry (Subin Yang))</li> <li><a href="2c7f5d6f47"><code>2c7f5d6</code></a> chore: update github/codeql-action action to v4.37.9 (<a href="https://redirect.github.com/eslint/eslint/issues/21296">#21296</a>) (renovate[bot])</li> <li><a href="3c753f18b4"><code>3c753f1</code></a> chore: update eslint (<a href="https://redirect.github.com/eslint/eslint/issues/21289">#21289</a>) (renovate[bot])</li> <li><a href="1c734690bf"><code>1c73469</code></a> chore: update ecosystem plugins (<a href="https://redirect.github.com/eslint/eslint/issues/21280">#21280</a>) (ESLint Bot)</li> <li><a href="08a02be429"><code>08a02be</code></a> test: add error locations to <code>no-extra-boolean-cast</code> (<a href="https://redirect.github.com/eslint/eslint/issues/21266">#21266</a>) (lumir)</li> <li><a href="77bb1db8e7"><code>77bb1db</code></a> chore: update github/codeql-action action to v4.37.8 (<a href="https://redirect.github.com/eslint/eslint/issues/21270">#21270</a>) (renovate[bot])</li> <li><a href="007e81ac0a"><code>007e81a</code></a> ci: skip EMFILE test on Node.js 26 (<a href="https://redirect.github.com/eslint/eslint/issues/21265">#21265</a>) (lumir)</li> <li><a href="0430280e7c"><code>0430280</code></a> chore: improve ecosystem tests compatibility on Windows (<a href="https://redirect.github.com/eslint/eslint/issues/21178">#21178</a>) (crimsonjay0)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="3f20a57c62"><code>3f20a57</code></a> 10.10.0</li> <li><a href="f4e5284803"><code>f4e5284</code></a> Build: changelog update for 10.10.0</li> <li><a href="bb47dc6da2"><code>bb47dc6</code></a> fix: update dependency file-entry-cache to v11 (<a href="https://redirect.github.com/eslint/eslint/issues/20801">#20801</a>)</li> <li><a href="427ac0a014"><code>427ac0a</code></a> fix: use format strings in debug calls (<a href="https://redirect.github.com/eslint/eslint/issues/21247">#21247</a>)</li> <li><a href="b3d876b460"><code>b3d876b</code></a> chore: disable npm audit in ecosystem tests (<a href="https://redirect.github.com/eslint/eslint/issues/21306">#21306</a>)</li> <li><a href="9d8153223d"><code>9d81532</code></a> fix: support <code>__proto__</code> in <code>/* exported */</code> comments (<a href="https://redirect.github.com/eslint/eslint/issues/21261">#21261</a>)</li> <li><a href="264b4346d1"><code>264b434</code></a> feat: add <code>d</code> and <code>v</code> flags to <code>no-unexpected-multiline</code> (<a href="https://redirect.github.com/eslint/eslint/issues/21305">#21305</a>)</li> <li><a href="1696682791"><code>1696682</code></a> ci: restore EMFILE test on Node.js 26 (<a href="https://redirect.github.com/eslint/eslint/issues/21297">#21297</a>)</li> <li><a href="2c7f5d6f47"><code>2c7f5d6</code></a> chore: update github/codeql-action action to v4.37.9 (<a href="https://redirect.github.com/eslint/eslint/issues/21296">#21296</a>)</li> <li><a href="87e0a08243"><code>87e0a08</code></a> fix: prefer-object-has-own autofix breaks when Object is shadowed (<a href="https://redirect.github.com/eslint/eslint/issues/21282">#21282</a>)</li> <li>Additional commits viewable in <a href="https://github.com/eslint/eslint/compare/v10.9.1...v10.10.0">compare view</a></li> </ul> </details> <br /> Updates `@anthropic-ai/claude-agent-sdk-darwin-arm64` from 0.3.257 to 0.3.263 Updates `@anthropic-ai/claude-agent-sdk-darwin-x64` from 0.3.257 to 0.3.263 Updates `@anthropic-ai/claude-agent-sdk-linux-arm64` from 0.3.257 to 0.3.263 Updates `@anthropic-ai/claude-agent-sdk-linux-arm64-musl` from 0.3.257 to 0.3.263 Updates `@anthropic-ai/claude-agent-sdk-linux-x64` from 0.3.257 to 0.3.263 Updates `@anthropic-ai/claude-agent-sdk-linux-x64-musl` from 0.3.257 to 0.3.263 Updates `@anthropic-ai/claude-agent-sdk-win32-arm64` from 0.3.257 to 0.3.263 Updates `@anthropic-ai/claude-agent-sdk-win32-x64` from 0.3.257 to 0.3.263 Updates `@eslint/plugin-kit` from 0.7.2 to 0.7.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/eslint/rewrite/releases">@eslint/plugin-kit's releases</a>.</em></p> <blockquote> <h2>plugin-kit: v0.7.3</h2> <h2><a href="https://github.com/eslint/rewrite/compare/plugin-kit-v0.7.2...plugin-kit-v0.7.3">0.7.3</a> (2026-09-01)</h2> <h3>Bug Fixes</h3> <ul> <li>preserve <code>__proto__</code> in <code>ConfigCommentParser</code> results (<a href="https://redirect.github.com/eslint/rewrite/issues/501">#501</a>) (<a href="18773d9e41">18773d9</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/eslint/rewrite/blob/main/packages/plugin-kit/CHANGELOG.md">@eslint/plugin-kit's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/eslint/rewrite/compare/plugin-kit-v0.7.2...plugin-kit-v0.7.3">0.7.3</a> (2026-09-01)</h2> <h3>Bug Fixes</h3> <ul> <li>preserve <code>__proto__</code> in <code>ConfigCommentParser</code> results (<a href="https://redirect.github.com/eslint/rewrite/issues/501">#501</a>) (<a href="18773d9e41">18773d9</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="a4466ca3f8"><code>a4466ca</code></a> chore: release main (<a href="https://github.com/eslint/rewrite/tree/HEAD/packages/plugin-kit/issues/504">#504</a>)</li> <li><a href="f83339de1a"><code>f83339d</code></a> docs: clarify parameter description in <code>getText</code> (<a href="https://github.com/eslint/rewrite/tree/HEAD/packages/plugin-kit/issues/505">#505</a>)</li> <li><a href="714ffde559"><code>714ffde</code></a> docs: Update README sponsors</li> <li><a href="18773d9e41"><code>18773d9</code></a> fix: preserve <code>__proto__</code> in <code>ConfigCommentParser</code> results (<a href="https://github.com/eslint/rewrite/tree/HEAD/packages/plugin-kit/issues/501">#501</a>)</li> <li><a href="caffae71f6"><code>caffae7</code></a> docs: Update README sponsors</li> <li><a href="ae1ba2585b"><code>ae1ba25</code></a> docs: Update README sponsors</li> <li><a href="50051c603e"><code>50051c6</code></a> docs: Update README sponsors</li> <li><a href="ea835245e2"><code>ea83524</code></a> docs: Update README sponsors</li> <li><a href="29956ae008"><code>29956ae</code></a> docs: Update README sponsors</li> <li><a href="f6d5bdff38"><code>f6d5bdf</code></a> docs: Update README sponsors</li> <li>Additional commits viewable in <a href="https://github.com/eslint/rewrite/commits/plugin-kit-v0.7.3/packages/plugin-kit">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/project-service` from 8.69.0 to 8.70.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/project-service's releases</a>.</em></p> <blockquote> <h2>v8.70.0</h2> <h2>8.70.0 (2026-09-07)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [no-generated-empty-object-type] add rule (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12730">#12730</a>)</li> <li><strong>website:</strong> generate per-page social preview cards (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12734">#12734</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>use stable release of pnpm 12 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12808">#12808</a>)</li> <li>update pnpm to 12.3.4 and dedupe Docusaurus packages (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12829">#12829</a>)</li> <li><strong>eslint-plugin:</strong> [member-ordering] don't report fields that read fields declared before them (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12729">#12729</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-condition] no false positive on RHS of a nested logical expression (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12728">#12728</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated imported values used in object shorthand properties (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12780">#12780</a>)</li> <li><strong>project-service:</strong> avoid discarded tsserver logs (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12748">#12748</a>)</li> <li><strong>typescript-estree:</strong> clarify the parserOptions.project error message (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12817">#12817</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Barry <a href="https://github.com/barry166"><code>@barry166</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Josh Goldberg ✨ <a href="https://github.com/JoshuaKGoldberg"><code>@JoshuaKGoldberg</code></a></li> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>Ulrich Stark <a href="https://github.com/ulrichstark"><code>@ulrichstark</code></a></li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/project-service/CHANGELOG.md">@typescript-eslint/project-service's changelog</a>.</em></p> <blockquote> <h2>8.70.0 (2026-09-07)</h2> <h3>🩹 Fixes</h3> <ul> <li><strong>project-service:</strong> avoid discarded tsserver logs (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12748">#12748</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Barry <a href="https://github.com/barry166"><code>@barry166</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="7ee76085c2"><code>7ee7608</code></a> chore(release): publish 8.70.0</li> <li><a href="d2d07eb2ac"><code>d2d07eb</code></a> fix(project-service): avoid discarded tsserver logs (<a href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/project-service/issues/12748">#12748</a>)</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/project-service">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/scope-manager` from 8.69.0 to 8.70.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/scope-manager's releases</a>.</em></p> <blockquote> <h2>v8.70.0</h2> <h2>8.70.0 (2026-09-07)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [no-generated-empty-object-type] add rule (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12730">#12730</a>)</li> <li><strong>website:</strong> generate per-page social preview cards (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12734">#12734</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>use stable release of pnpm 12 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12808">#12808</a>)</li> <li>update pnpm to 12.3.4 and dedupe Docusaurus packages (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12829">#12829</a>)</li> <li><strong>eslint-plugin:</strong> [member-ordering] don't report fields that read fields declared before them (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12729">#12729</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-condition] no false positive on RHS of a nested logical expression (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12728">#12728</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated imported values used in object shorthand properties (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12780">#12780</a>)</li> <li><strong>project-service:</strong> avoid discarded tsserver logs (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12748">#12748</a>)</li> <li><strong>typescript-estree:</strong> clarify the parserOptions.project error message (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12817">#12817</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Barry <a href="https://github.com/barry166"><code>@barry166</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Josh Goldberg ✨ <a href="https://github.com/JoshuaKGoldberg"><code>@JoshuaKGoldberg</code></a></li> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>Ulrich Stark <a href="https://github.com/ulrichstark"><code>@ulrichstark</code></a></li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/scope-manager/CHANGELOG.md">@typescript-eslint/scope-manager's changelog</a>.</em></p> <blockquote> <h2>8.70.0 (2026-09-07)</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.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="7ee76085c2"><code>7ee7608</code></a> chore(release): publish 8.70.0</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/scope-manager">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/tsconfig-utils` from 8.69.0 to 8.70.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/tsconfig-utils's releases</a>.</em></p> <blockquote> <h2>v8.70.0</h2> <h2>8.70.0 (2026-09-07)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [no-generated-empty-object-type] add rule (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12730">#12730</a>)</li> <li><strong>website:</strong> generate per-page social preview cards (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12734">#12734</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>use stable release of pnpm 12 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12808">#12808</a>)</li> <li>update pnpm to 12.3.4 and dedupe Docusaurus packages (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12829">#12829</a>)</li> <li><strong>eslint-plugin:</strong> [member-ordering] don't report fields that read fields declared before them (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12729">#12729</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-condition] no false positive on RHS of a nested logical expression (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12728">#12728</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated imported values used in object shorthand properties (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12780">#12780</a>)</li> <li><strong>project-service:</strong> avoid discarded tsserver logs (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12748">#12748</a>)</li> <li><strong>typescript-estree:</strong> clarify the parserOptions.project error message (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12817">#12817</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Barry <a href="https://github.com/barry166"><code>@barry166</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Josh Goldberg ✨ <a href="https://github.com/JoshuaKGoldberg"><code>@JoshuaKGoldberg</code></a></li> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>Ulrich Stark <a href="https://github.com/ulrichstark"><code>@ulrichstark</code></a></li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/tsconfig-utils/CHANGELOG.md">@typescript-eslint/tsconfig-utils's changelog</a>.</em></p> <blockquote> <h2>8.70.0 (2026-09-07)</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.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="7ee76085c2"><code>7ee7608</code></a> chore(release): publish 8.70.0</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/tsconfig-utils">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/type-utils` from 8.69.0 to 8.70.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/type-utils's releases</a>.</em></p> <blockquote> <h2>v8.70.0</h2> <h2>8.70.0 (2026-09-07)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [no-generated-empty-object-type] add rule (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12730">#12730</a>)</li> <li><strong>website:</strong> generate per-page social preview cards (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12734">#12734</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>use stable release of pnpm 12 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12808">#12808</a>)</li> <li>update pnpm to 12.3.4 and dedupe Docusaurus packages (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12829">#12829</a>)</li> <li><strong>eslint-plugin:</strong> [member-ordering] don't report fields that read fields declared before them (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12729">#12729</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-condition] no false positive on RHS of a nested logical expression (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12728">#12728</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated imported values used in object shorthand properties (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12780">#12780</a>)</li> <li><strong>project-service:</strong> avoid discarded tsserver logs (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12748">#12748</a>)</li> <li><strong>typescript-estree:</strong> clarify the parserOptions.project error message (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12817">#12817</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Barry <a href="https://github.com/barry166"><code>@barry166</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Josh Goldberg ✨ <a href="https://github.com/JoshuaKGoldberg"><code>@JoshuaKGoldberg</code></a></li> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>Ulrich Stark <a href="https://github.com/ulrichstark"><code>@ulrichstark</code></a></li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/type-utils/CHANGELOG.md">@typescript-eslint/type-utils's changelog</a>.</em></p> <blockquote> <h2>8.70.0 (2026-09-07)</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.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="7ee76085c2"><code>7ee7608</code></a> chore(release): publish 8.70.0</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/type-utils">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/types` from 8.69.0 to 8.70.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/types's releases</a>.</em></p> <blockquote> <h2>v8.70.0</h2> <h2>8.70.0 (2026-09-07)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [no-generated-empty-object-type] add rule (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12730">#12730</a>)</li> <li><strong>website:</strong> generate per-page social preview cards (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12734">#12734</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>use stable release of pnpm 12 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12808">#12808</a>)</li> <li>update pnpm to 12.3.4 and dedupe Docusaurus packages (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12829">#12829</a>)</li> <li><strong>eslint-plugin:</strong> [member-ordering] don't report fields that read fields declared before them (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12729">#12729</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-condition] no false positive on RHS of a nested logical expression (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12728">#12728</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated imported values used in object shorthand properties (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12780">#12780</a>)</li> <li><strong>project-service:</strong> avoid discarded tsserver logs (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12748">#12748</a>)</li> <li><strong>typescript-estree:</strong> clarify the parserOptions.project error message (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12817">#12817</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Barry <a href="https://github.com/barry166"><code>@barry166</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Josh Goldberg ✨ <a href="https://github.com/JoshuaKGoldberg"><code>@JoshuaKGoldberg</code></a></li> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>Ulrich Stark <a href="https://github.com/ulrichstark"><code>@ulrichstark</code></a></li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/types/CHANGELOG.md">@typescript-eslint/types's changelog</a>.</em></p> <blockquote> <h2>8.70.0 (2026-09-07)</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.70.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="7ee76085c2"><code>7ee7608</code></a> chore(release): publish 8.70.0</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/types">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/typescript-estree` from 8.69.0 to 8.70.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/typescript-estree's releases</a>.</em></p> <blockquote> <h2>v8.70.0</h2> <h2>8.70.0 (2026-09-07)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [no-generated-empty-object-type] add rule (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12730">#12730</a>)</li> <li><strong>website:</strong> generate per-page social preview cards (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12734">#12734</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>use stable release of pnpm 12 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12808">#12808</a>)</li> <li>update pnpm to 12.3.4 and dedupe Docusaurus packages (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12829">#12829</a>)</li> <li><strong>eslint-plugin:</strong> [member-ordering] don't report fields that read fields declared before them (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12729">#12729</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-condition] no false positive on RHS of a nested logical expression (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12728">#12728</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated imported values used in object shorthand properties (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12780">#12780</a>)</li> <li><strong>project-service:</strong> avoid discarded tsserver logs (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12748">#12748</a>)</li> <li><strong>typescript-estree:</strong> clarify the parserOptions.project error message (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12817">#12817</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Barry <a href="https://github.com/barry166"><code>@barry166</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Josh Goldberg ✨ <a href="https://github.com/JoshuaKGoldberg"><code>@JoshuaKGoldberg</code></a></li> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaibling... _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> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -53,11 +53,12 @@ The request-level record is placed under `RequestPermissionRequest._meta.permiss
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
| Field | Required | Type | Meaning |
|
| Field | Required | Type | Meaning |
|
||||||
| ------------- | -------: | ---------------- | ----------------------------------------- |
|
| ------------- | -------: | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| `version` | yes | integer `1` | Permission presentation schema version. |
|
| `version` | yes | integer `1` | Permission presentation schema version. |
|
||||||
| `title` | yes | non-empty string | The standard tool-call operation title. |
|
| `title` | yes | non-empty string | The standard tool-call operation title. |
|
||||||
| `description` | no | string | Temporary diagnostic SDK decision reason. |
|
| `description` | no | string | Temporary diagnostic SDK decision reason. |
|
||||||
|
| `defaultToNo` | no | `true` | The ask must not be approvable by a stray keystroke; the reject options are listed first and a client that pre-selects an option should focus the decline. |
|
||||||
|
|
||||||
The permission title normally duplicates `toolCall.title`: one operation has one heading across the
|
The permission title normally duplicates `toolCall.title`: one operation has one heading across the
|
||||||
tool card and approval UI. `ExitPlanMode` is the deliberate exception and uses the action-oriented
|
tool card and approval UI. `ExitPlanMode` is the deliberate exception and uses the action-oriented
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ Claude SDK conditions map to these groups:
|
|||||||
| Claude condition | Category |
|
| Claude condition | Category |
|
||||||
| ---------------------------------------------------------------------------------------- | ---------------------------------- |
|
| ---------------------------------------------------------------------------------------- | ---------------------------------- |
|
||||||
| `authentication_failed`, `oauth_org_not_allowed`, synthetic login message | `access` |
|
| `authentication_failed`, `oauth_org_not_allowed`, synthetic login message | `access` |
|
||||||
|
| `verification_required`, `cloud_credential_error` | `access` (no `login` action) |
|
||||||
| `billing_error`, `rate_limit`, `max_output_tokens`, usage/spend limit, budget/turn limit | `limit` |
|
| `billing_error`, `rate_limit`, `max_output_tokens`, usage/spend limit, budget/turn limit | `limit` |
|
||||||
| `invalid_request`, `model_not_found` | `request` |
|
| `invalid_request`, `model_not_found` | `request` |
|
||||||
| `overloaded`, `server_error`, unknown provider error, adapter internal error | `service` |
|
| `overloaded`, `server_error`, unknown provider error, adapter internal error | `service` |
|
||||||
|
|||||||
574
package-lock.json
generated
574
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
14
package.json
14
package.json
@@ -66,17 +66,17 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@agentclientprotocol/sdk": "1.4.0",
|
"@agentclientprotocol/sdk": "1.4.0",
|
||||||
"@anthropic-ai/claude-agent-sdk": "0.3.257",
|
"@anthropic-ai/claude-agent-sdk": "0.3.270",
|
||||||
"zod": "^4.0.0"
|
"zod": "4.6.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@anthropic-ai/sdk": "0.122.0",
|
"@anthropic-ai/sdk": "0.125.0",
|
||||||
"@eslint/js": "10.0.1",
|
"@eslint/js": "10.0.1",
|
||||||
"@tsconfig/node22": "22.0.6",
|
"@tsconfig/node22": "22.0.6",
|
||||||
"@types/node": "26.4.0",
|
"@types/node": "26.5.1",
|
||||||
"@typescript-eslint/eslint-plugin": "8.69.0",
|
"@typescript-eslint/eslint-plugin": "8.70.0",
|
||||||
"@typescript-eslint/parser": "8.69.0",
|
"@typescript-eslint/parser": "8.70.0",
|
||||||
"eslint": "10.9.1",
|
"eslint": "10.10.0",
|
||||||
"eslint-config-prettier": "10.1.8",
|
"eslint-config-prettier": "10.1.8",
|
||||||
"globals": "17.12.0",
|
"globals": "17.12.0",
|
||||||
"prettier": "3.9.6",
|
"prettier": "3.9.6",
|
||||||
|
|||||||
@@ -626,10 +626,14 @@ type Turn = {
|
|||||||
* issue #866), and the model's task-notification followup summary all
|
* issue #866), and the model's task-notification followup summary all
|
||||||
* land inside the turn.
|
* land inside the turn.
|
||||||
*
|
*
|
||||||
* The CLI does NOT hold its trailing idle for background agents (observed
|
* Idle cadence depends on the CLI. Through 2.1.269 the trailing idle is
|
||||||
* on 2.1.206: `idle` follows the result immediately while the subagent
|
* NOT held for background agents (observed on 2.1.206: `idle` follows
|
||||||
* still runs), so the hold spans multiple idle cycles: user result →
|
* the result immediately while the subagent still runs), so the hold
|
||||||
* idle → (subagent works) → task_notification → followup turn → idle.
|
* spans multiple idle cycles: user result → idle → (subagent works) →
|
||||||
|
* task_notification → followup turn → idle. From 2.1.270 the CLI stays
|
||||||
|
* `running` while background agents live (observed live: user result →
|
||||||
|
* task_notification → followup turn → ONE idle), so the user result's
|
||||||
|
* idle debt goes unpaid — swept at the next `running` transition.
|
||||||
* The stored outcome (the result's stop reason and usage snapshot) is
|
* The stored outcome (the result's stop reason and usage snapshot) is
|
||||||
* what the turn settles with once its spawned subagents have settled —
|
* what the turn settles with once its spawned subagents have settled —
|
||||||
* at the followup's terminal result (the summary has streamed by then),
|
* at the followup's terminal result (the summary has streamed by then),
|
||||||
@@ -4183,7 +4187,31 @@ export class ClaudeAcpAgent {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "session_state_changed": {
|
case "session_state_changed": {
|
||||||
|
const previousState = session.lastSessionState;
|
||||||
session.lastSessionState = message.state;
|
session.lastSessionState = message.state;
|
||||||
|
if (
|
||||||
|
message.state === "running" &&
|
||||||
|
previousState !== "running" &&
|
||||||
|
session.owedTrailingIdles > 0
|
||||||
|
) {
|
||||||
|
// A transition INTO `running` (the CLI reports state
|
||||||
|
// changes; a repeated `running` is not a transition and is
|
||||||
|
// left alone) proves the idle period before it ended: every
|
||||||
|
// idle the CLI was going to emit for earlier results has
|
||||||
|
// been emitted. Debt still outstanding here can never be paid.
|
||||||
|
// CLI 2.1.270+ withholds `idle` while background agents run
|
||||||
|
// (verified live: user result → task_notification →
|
||||||
|
// followup result → ONE idle), so a held turn's own result
|
||||||
|
// leaves one unpaid unit per hold. Left in place, each unit
|
||||||
|
// would absorb a later un-owed idle — masking an issue-#825
|
||||||
|
// detection — or swallow the idle a steered turn settles on
|
||||||
|
// (the owed-idle branch below runs before the steer lane),
|
||||||
|
// hanging that prompt. Sweep it.
|
||||||
|
this.logger.log(
|
||||||
|
`[claude-agent-acp] Session ${params.sessionId}: dropping ${session.owedTrailingIdles} unpaid trailing-idle debt at the running transition`,
|
||||||
|
);
|
||||||
|
session.owedTrailingIdles = 0;
|
||||||
|
}
|
||||||
if (message.state === "idle") {
|
if (message.state === "idle") {
|
||||||
// A non-cancelled turn normally settled at its terminal
|
// A non-cancelled turn normally settled at its terminal
|
||||||
// `result` already (issue #773), and that result recorded an
|
// `result` already (issue #773), and that result recorded an
|
||||||
@@ -4225,17 +4253,19 @@ export class ClaudeAcpAgent {
|
|||||||
session.emittedAssistantText = false;
|
session.emittedAssistantText = false;
|
||||||
} else if (isHeldOpen(session.activeTurn)) {
|
} else if (isHeldOpen(session.activeTurn)) {
|
||||||
// A turn held open for its background subagents (see
|
// A turn held open for its background subagents (see
|
||||||
// Turn.deferredSettle). Idles keep their normal cadence
|
// Turn.deferredSettle). Idle cadence during the hold
|
||||||
// during the hold — the CLI emits one per processing
|
// depends on the CLI: through 2.1.269 one idle per
|
||||||
// cycle (the turn's own trailer, then one per followup),
|
// processing cycle (the turn's own trailer, then one per
|
||||||
// NOT one final "all drained" signal — so each one
|
// followup); from 2.1.270 none until the background
|
||||||
// absorbs an outstanding trailer debt, and the turn only
|
// agents drain, then one. Either way each idle absorbs an
|
||||||
// settles once none of its spawned subagents is left
|
// outstanding trailer debt (the unpayable remainder is
|
||||||
// (the followup-result settle usually got there first;
|
// swept at the next `running` transition above), and the
|
||||||
// this is the fallback when no followup came). Mid-hold
|
// turn only settles once none of its spawned subagents is
|
||||||
// idles never fall through: a held turn HAS its result,
|
// left (the followup-result settle usually got there
|
||||||
// so reading its idle as "turn abandoned without a
|
// first; this is the fallback when no followup came).
|
||||||
// result" (issue #825) would fail a healthy prompt.
|
// Mid-hold idles never fall through: a held turn HAS its
|
||||||
|
// result, so reading its idle as "turn abandoned without
|
||||||
|
// a result" (issue #825) would fail a healthy prompt.
|
||||||
if (session.owedTrailingIdles > 0) {
|
if (session.owedTrailingIdles > 0) {
|
||||||
session.owedTrailingIdles--;
|
session.owedTrailingIdles--;
|
||||||
}
|
}
|
||||||
@@ -4601,10 +4631,18 @@ export class ClaudeAcpAgent {
|
|||||||
// here would outlive the `auth_required` rejection with no
|
// here would outlive the `auth_required` rejection with no
|
||||||
// action to clear it (issue #1072).
|
// action to clear it (issue #1072).
|
||||||
if (kind === "auth_required") break;
|
if (kind === "auth_required") break;
|
||||||
|
// `no_response` (SDK 0.3.261+): the API sent no response headers
|
||||||
|
// within the first-byte window, so this retry waits longer for
|
||||||
|
// them. Say so — "attempt 1 of 1" alone reads like a final
|
||||||
|
// failure, and the wait is what the user is about to sit through.
|
||||||
|
const seconds = (ms: number) => `${Math.max(1, Math.round(ms / 1000))}s`;
|
||||||
|
const noResponse = message.no_response
|
||||||
|
? ` No response after ${seconds(message.no_response.waited_ms)}; waiting up to ${seconds(message.no_response.retry_wait_ms)}.`
|
||||||
|
: "";
|
||||||
const title =
|
const title =
|
||||||
message.error_status === null
|
message.error_status === null
|
||||||
? `Reconnecting to Claude, attempt ${message.attempt} of ${message.max_retries}.`
|
? `Reconnecting to Claude, attempt ${message.attempt} of ${message.max_retries}.${noResponse}`
|
||||||
: `Retrying Claude, attempt ${message.attempt} of ${message.max_retries}.`;
|
: `Retrying Claude, attempt ${message.attempt} of ${message.max_retries}.${noResponse}`;
|
||||||
await publishSessionFailure(kind, { title, severity: "warning" });
|
await publishSessionFailure(kind, { title, severity: "warning" });
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -7006,6 +7044,8 @@ export class ClaudeAcpAgent {
|
|||||||
title,
|
title,
|
||||||
displayName,
|
displayName,
|
||||||
description,
|
description,
|
||||||
|
defaultToNo,
|
||||||
|
suppressAlwaysAllowRule,
|
||||||
},
|
},
|
||||||
) => {
|
) => {
|
||||||
const supportsTerminalOutput = this.clientCapabilities?._meta?.["terminal_output"] === true;
|
const supportsTerminalOutput = this.clientCapabilities?._meta?.["terminal_output"] === true;
|
||||||
@@ -7096,10 +7136,13 @@ export class ClaudeAcpAgent {
|
|||||||
// explicit ask rule). Re-applying bypass in the host would erase that
|
// explicit ask rule). Re-applying bypass in the host would erase that
|
||||||
// provider safety decision.
|
// provider safety decision.
|
||||||
|
|
||||||
const durableChangeSet = normalizeDurablePermissionChangeSet(
|
// No persistent "always allow" option when the user's own ask rule forced
|
||||||
suggestions,
|
// the prompt, or when the CLI says the rule it would write grants more
|
||||||
matchedAskRule !== undefined,
|
// than this ask's own action (`suppressAlwaysAllowRule`, SDK 0.3.268+ —
|
||||||
);
|
// set on its safety-check asks, e.g. delete-class Bash rulings and
|
||||||
|
// Artifact publishes).
|
||||||
|
const noPersistentRule = matchedAskRule !== undefined || suppressAlwaysAllowRule === true;
|
||||||
|
const durableChangeSet = normalizeDurablePermissionChangeSet(suggestions, noPersistentRule);
|
||||||
const presentation = buildClaudePermissionPresentation({
|
const presentation = buildClaudePermissionPresentation({
|
||||||
toolName,
|
toolName,
|
||||||
input: toolInput,
|
input: toolInput,
|
||||||
@@ -7111,6 +7154,7 @@ export class ClaudeAcpAgent {
|
|||||||
displayName,
|
displayName,
|
||||||
description,
|
description,
|
||||||
decisionReason,
|
decisionReason,
|
||||||
|
defaultToNo,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (parentToolUseId) {
|
if (parentToolUseId) {
|
||||||
@@ -7125,7 +7169,8 @@ export class ClaudeAcpAgent {
|
|||||||
input: toolInput,
|
input: toolInput,
|
||||||
cwd: session.cwd,
|
cwd: session.cwd,
|
||||||
durableChangeSet,
|
durableChangeSet,
|
||||||
allowPersistentOptions: matchedAskRule === undefined,
|
allowPersistentOptions: !noPersistentRule,
|
||||||
|
defaultToNo,
|
||||||
availableModes: this.sessionModes.availableModeIds(session.modes),
|
availableModes: this.sessionModes.availableModeIds(session.modes),
|
||||||
contextUsedPercent:
|
contextUsedPercent:
|
||||||
session.contextUsedTokens === undefined || session.contextWindowSize <= 0
|
session.contextUsedTokens === undefined || session.contextWindowSize <= 0
|
||||||
|
|||||||
@@ -23,8 +23,12 @@ import {
|
|||||||
export { PERMISSION_OPTION_ID } from "./options/shared.js";
|
export { PERMISSION_OPTION_ID } from "./options/shared.js";
|
||||||
|
|
||||||
export function buildClaudePermissionOptions(context: PermissionOptionContext): PermissionOption[] {
|
export function buildClaudePermissionOptions(context: PermissionOptionContext): PermissionOption[] {
|
||||||
|
// ACP has no "pre-selected option" field, so option order is the only lever
|
||||||
|
// for the CLI's `defaultToNo` hint ("open on the decline option"): lead with
|
||||||
|
// the reject options instead of the approvals.
|
||||||
|
const order = context.defaultToNo === true ? declineFirstOptionOrder : permissionOptionOrder;
|
||||||
return buildUnsortedClaudePermissionOptions(context).sort(
|
return buildUnsortedClaudePermissionOptions(context).sort(
|
||||||
(left, right) => permissionOptionOrder(left) - permissionOptionOrder(right),
|
(left, right) => order(left) - order(right),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +75,16 @@ function buildUnsortedClaudePermissionOptions(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function declineFirstOptionOrder(option: PermissionOption): number {
|
||||||
|
switch (option.kind) {
|
||||||
|
case "reject_once":
|
||||||
|
case "reject_always":
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
return 1 + permissionOptionOrder(option);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function permissionOptionOrder(option: PermissionOption): number {
|
function permissionOptionOrder(option: PermissionOption): number {
|
||||||
switch (option.kind) {
|
switch (option.kind) {
|
||||||
case "allow_once":
|
case "allow_once":
|
||||||
|
|||||||
@@ -23,6 +23,9 @@ export interface PermissionOptionContext {
|
|||||||
cwd: string;
|
cwd: string;
|
||||||
durableChangeSet?: DurablePermissionChangeSet;
|
durableChangeSet?: DurablePermissionChangeSet;
|
||||||
allowPersistentOptions?: boolean;
|
allowPersistentOptions?: boolean;
|
||||||
|
/** The CLI's `defaultToNo` hint (SDK 0.3.268+): the ask must not be
|
||||||
|
* approvable by a stray keystroke, so the decline option leads. */
|
||||||
|
defaultToNo?: boolean;
|
||||||
availableModes?: readonly string[];
|
availableModes?: readonly string[];
|
||||||
contextUsedPercent?: number;
|
contextUsedPercent?: number;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export interface ClaudePermissionPresentationInput {
|
|||||||
displayName?: string;
|
displayName?: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
decisionReason?: string;
|
decisionReason?: string;
|
||||||
|
defaultToNo?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
function humanText(value: unknown, maxLength: number, singleLine = false): string | undefined {
|
function humanText(value: unknown, maxLength: number, singleLine = false): string | undefined {
|
||||||
@@ -104,6 +105,10 @@ export function buildClaudePermissionPresentation(
|
|||||||
version: 1,
|
version: 1,
|
||||||
title,
|
title,
|
||||||
...(description ? { description } : {}),
|
...(description ? { description } : {}),
|
||||||
|
// The CLI's own hint, forwarded so a client that can pre-select
|
||||||
|
// an option keeps the decline focused; the option order already
|
||||||
|
// leads with the reject options when this is set.
|
||||||
|
...(value.defaultToNo === true ? { defaultToNo: true } : {}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ export function airSessionFailureCapabilityMeta(...additionalCapabilities: strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type ClaudeFailureKind =
|
export type ClaudeFailureKind =
|
||||||
|
| "access_denied"
|
||||||
| "advisory"
|
| "advisory"
|
||||||
| "auth_required"
|
| "auth_required"
|
||||||
| "bad_request"
|
| "bad_request"
|
||||||
@@ -93,6 +94,15 @@ const AIR_FAILURE_POLICY: Record<
|
|||||||
fallbackTitle: string;
|
fallbackTitle: string;
|
||||||
}
|
}
|
||||||
> = {
|
> = {
|
||||||
|
// Account or credential blocks that signing in again cannot fix: the
|
||||||
|
// organization must complete verification, or the cloud provider's
|
||||||
|
// credentials must be refreshed outside Claude. No `login` action, and not
|
||||||
|
// sticky like `auth_required` (nothing clears at `auth_status`).
|
||||||
|
access_denied: {
|
||||||
|
category: "access",
|
||||||
|
actions: ["retry"],
|
||||||
|
fallbackTitle: "Claude could not access the account or provider credentials.",
|
||||||
|
},
|
||||||
advisory: {
|
advisory: {
|
||||||
category: "unknown",
|
category: "unknown",
|
||||||
actions: [],
|
actions: [],
|
||||||
@@ -448,6 +458,15 @@ export function providerFailureCategory(
|
|||||||
case "billing_error":
|
case "billing_error":
|
||||||
case "account_on_hold":
|
case "account_on_hold":
|
||||||
return "quota_exhausted";
|
return "quota_exhausted";
|
||||||
|
// 403 `permission_error` with error_code `verification_required` (the
|
||||||
|
// organization must verify at the console), and a Bedrock/Vertex/Foundry
|
||||||
|
// credential the CLI could not load (transient: it retries, and asks the
|
||||||
|
// user to check or refresh the credentials). Both are access failures
|
||||||
|
// `/login` does not repair, so they get their own lane rather than
|
||||||
|
// `auth_required`'s login action and sticky auth_status recovery.
|
||||||
|
case "verification_required":
|
||||||
|
case "cloud_credential_error":
|
||||||
|
return "access_denied";
|
||||||
case "rate_limit":
|
case "rate_limit":
|
||||||
return "rate_limited";
|
return "rate_limited";
|
||||||
case "overloaded":
|
case "overloaded":
|
||||||
|
|||||||
@@ -4118,6 +4118,79 @@ describe("canUseTool in bypassPermissions mode", () => {
|
|||||||
|
|
||||||
expect(request?.options.map((option) => option.optionId)).toEqual(["allow-once", "reject"]);
|
expect(request?.options.map((option) => option.optionId)).toEqual(["allow-once", "reject"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// SDK 0.3.268+ hints on the CLI's safety-check asks (delete-class Bash
|
||||||
|
// rulings, Artifact publishes, …): the always-allow rule it would write is
|
||||||
|
// broader than the ask, so no persistent option may be offered; and the ask
|
||||||
|
// must open on its decline option, so the reject options lead.
|
||||||
|
it("offers no always-allow option when the CLI suppresses the persistent rule", async () => {
|
||||||
|
let request: RequestPermissionRequest | undefined;
|
||||||
|
const mockClient = {
|
||||||
|
sessionUpdate: async () => {},
|
||||||
|
requestPermission: async (params: RequestPermissionRequest) => {
|
||||||
|
request = params;
|
||||||
|
return { outcome: { outcome: "selected", optionId: "allow-once" } };
|
||||||
|
},
|
||||||
|
} as unknown as AcpClient;
|
||||||
|
const agent = new ClaudeAcpAgent(mockClient, { log: () => {}, error: () => {} });
|
||||||
|
agent.sessions["session-1"] = mockSessionState();
|
||||||
|
agent.sessions["session-1"]!.emittedToolCalls.add("tool-1");
|
||||||
|
|
||||||
|
await agent.canUseTool("session-1")("Bash", { command: "rm -rf build" }, {
|
||||||
|
signal: new AbortController().signal,
|
||||||
|
suggestions: [
|
||||||
|
{
|
||||||
|
type: "addRules",
|
||||||
|
rules: [{ toolName: "Bash", ruleContent: "rm:*" }],
|
||||||
|
behavior: "allow",
|
||||||
|
destination: "localSettings",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
toolUseID: "tool-1",
|
||||||
|
suppressAlwaysAllowRule: true,
|
||||||
|
} as any);
|
||||||
|
|
||||||
|
expect(request?.options.map((option) => option.optionId)).toEqual(["allow-once", "reject"]);
|
||||||
|
expect(request?._meta).toEqual({ permission: { version: 1, title: "Bash" } });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("leads with the reject option and forwards the hint when the CLI defaults to no", async () => {
|
||||||
|
let request: RequestPermissionRequest | undefined;
|
||||||
|
const mockClient = {
|
||||||
|
sessionUpdate: async () => {},
|
||||||
|
requestPermission: async (params: RequestPermissionRequest) => {
|
||||||
|
request = params;
|
||||||
|
return { outcome: { outcome: "selected", optionId: "reject" } };
|
||||||
|
},
|
||||||
|
} as unknown as AcpClient;
|
||||||
|
const agent = new ClaudeAcpAgent(mockClient, { log: () => {}, error: () => {} });
|
||||||
|
agent.sessions["session-1"] = mockSessionState();
|
||||||
|
agent.sessions["session-1"]!.emittedToolCalls.add("tool-1");
|
||||||
|
|
||||||
|
const result = await agent.canUseTool("session-1")("Bash", { command: "rm -rf build" }, {
|
||||||
|
signal: new AbortController().signal,
|
||||||
|
suggestions: [
|
||||||
|
{
|
||||||
|
type: "addRules",
|
||||||
|
rules: [{ toolName: "Bash", ruleContent: "rm:*" }],
|
||||||
|
behavior: "allow",
|
||||||
|
destination: "localSettings",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
toolUseID: "tool-1",
|
||||||
|
defaultToNo: true,
|
||||||
|
} as any);
|
||||||
|
|
||||||
|
expect(request?.options.map((option) => option.kind)).toEqual([
|
||||||
|
"reject_once",
|
||||||
|
"allow_once",
|
||||||
|
"allow_always",
|
||||||
|
]);
|
||||||
|
expect(request?._meta).toEqual({
|
||||||
|
permission: { version: 1, title: "Bash", defaultToNo: true },
|
||||||
|
});
|
||||||
|
expect(result).toMatchObject({ behavior: "deny" });
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("subagent permission attribution (issue #851)", () => {
|
describe("subagent permission attribution (issue #851)", () => {
|
||||||
@@ -6547,6 +6620,52 @@ describe("stop reason propagation", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("says how long a no-response retry waited and will wait", async () => {
|
||||||
|
const updates: SessionNotification[] = [];
|
||||||
|
const agent = new ClaudeAcpAgent(
|
||||||
|
{
|
||||||
|
sessionUpdate: async (update: SessionNotification) => updates.push(update),
|
||||||
|
} as unknown as AcpClient,
|
||||||
|
{ log: () => {}, error: () => {} },
|
||||||
|
);
|
||||||
|
(agent as any).clientCapabilities = airSessionFailureCapabilities;
|
||||||
|
injectSession(agent, [
|
||||||
|
{
|
||||||
|
type: "system",
|
||||||
|
subtype: "api_retry",
|
||||||
|
attempt: 1,
|
||||||
|
max_retries: 1,
|
||||||
|
retry_delay_ms: 0,
|
||||||
|
error_status: null,
|
||||||
|
error: "unknown",
|
||||||
|
// SDK 0.3.261+: the API sent no response headers within the
|
||||||
|
// first-byte window; the retry waits longer for them.
|
||||||
|
no_response: { waited_ms: 180_000, retry_wait_ms: 600_000 },
|
||||||
|
uuid: randomUUID(),
|
||||||
|
session_id: "test-session",
|
||||||
|
},
|
||||||
|
createResultMessage({
|
||||||
|
subtype: "success",
|
||||||
|
stop_reason: "end_turn",
|
||||||
|
is_error: false,
|
||||||
|
result: "ok",
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
|
await agent.prompt({ sessionId: "test-session", prompt: [{ type: "text", text: "test" }] });
|
||||||
|
const warning = updates
|
||||||
|
.map((update) => (update.update._meta as any)?.jetbrains?.air?.sessionFailure)
|
||||||
|
.find(Boolean);
|
||||||
|
expect(warning).toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
category: "connection",
|
||||||
|
severity: "warning",
|
||||||
|
title:
|
||||||
|
"Reconnecting to Claude, attempt 1 of 1. No response after 180s; waiting up to 600s.",
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it("clears a connection retry warning internally after the turn succeeds", async () => {
|
it("clears a connection retry warning internally after the turn succeeds", async () => {
|
||||||
const updates: SessionNotification[] = [];
|
const updates: SessionNotification[] = [];
|
||||||
const agent = new ClaudeAcpAgent(
|
const agent = new ClaudeAcpAgent(
|
||||||
@@ -6656,6 +6775,8 @@ describe("stop reason propagation", () => {
|
|||||||
it.each([
|
it.each([
|
||||||
["billing_error", "limit"],
|
["billing_error", "limit"],
|
||||||
["account_on_hold", "limit"],
|
["account_on_hold", "limit"],
|
||||||
|
["verification_required", "access"],
|
||||||
|
["cloud_credential_error", "access"],
|
||||||
["rate_limit", "limit"],
|
["rate_limit", "limit"],
|
||||||
["overloaded", "service"],
|
["overloaded", "service"],
|
||||||
["invalid_request", "request"],
|
["invalid_request", "request"],
|
||||||
@@ -13831,10 +13952,11 @@ describe("deferred settlement for live background subagents (issues #864/#866)",
|
|||||||
// out-of-turn session/update, but many clients stop consuming at the
|
// out-of-turn session/update, but many clients stop consuming at the
|
||||||
// prompt response, so the subagents' remaining output would be dropped
|
// prompt response, so the subagents' remaining output would be dropped
|
||||||
// and their permission requests would block on an RPC nobody answers. The turn is held open
|
// and their permission requests would block on an RPC nobody answers. The turn is held open
|
||||||
// across the CLI's idle cycles (observed cadence: user result → idle →
|
// across the CLI's idle cycles (cadence through CLI 2.1.269: user result →
|
||||||
// subagent works → task_notification → followup turn → idle) and settles
|
// idle → subagent works → task_notification → followup turn → idle; from
|
||||||
// once its subagents are done — at the followup's terminal result, or at
|
// 2.1.270: no idle until the subagent drains) and settles once its
|
||||||
// an idle with none of them left.
|
// subagents are done — at the followup's terminal result, or at an idle
|
||||||
|
// with none of them left.
|
||||||
|
|
||||||
function createMockAgent() {
|
function createMockAgent() {
|
||||||
const mockClient = {
|
const mockClient = {
|
||||||
@@ -14017,6 +14139,59 @@ describe("deferred settlement for live background subagents (issues #864/#866)",
|
|||||||
await agent.sessions["test-session"]?.consumer;
|
await agent.sessions["test-session"]?.consumer;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// CLI 2.1.270+ stays `running` while background agents live (verified
|
||||||
|
// live: user result → task_notification → followup result → ONE idle), so
|
||||||
|
// the user result's trailing-idle debt is never paid. It must not linger:
|
||||||
|
// a stale unit would swallow a later un-owed idle (masking issue #825) or
|
||||||
|
// the idle a steered turn settles on. The next transition into `running`
|
||||||
|
// sweeps it.
|
||||||
|
it("settles under the 2.1.270 cadence and sweeps the unpaid idle debt at the next running", async () => {
|
||||||
|
const { agent, events } = chunkCapturingAgent();
|
||||||
|
|
||||||
|
injectGeneratorSession(agent, (input) => {
|
||||||
|
async function* messageGenerator() {
|
||||||
|
const iter = input[Symbol.asyncIterator]();
|
||||||
|
const { value: first } = await iter.next();
|
||||||
|
yield userEcho(first);
|
||||||
|
yield running();
|
||||||
|
yield subagentStarted("agent-1");
|
||||||
|
yield resultMessage();
|
||||||
|
// No idle here: the CLI is still `running` for the live subagent.
|
||||||
|
yield taskNotification("agent-1");
|
||||||
|
yield assistantText("promised summary");
|
||||||
|
yield resultMessage({ origin: { kind: "task-notification" } });
|
||||||
|
yield idle(); // one idle for both results
|
||||||
|
const { value: second } = await iter.next();
|
||||||
|
yield userEcho(second);
|
||||||
|
yield running();
|
||||||
|
yield assistantText("second answer");
|
||||||
|
yield resultMessage();
|
||||||
|
yield idle();
|
||||||
|
}
|
||||||
|
return messageGenerator();
|
||||||
|
});
|
||||||
|
|
||||||
|
const session = () => agent.sessions["test-session"]!;
|
||||||
|
const first = await agent.prompt({
|
||||||
|
sessionId: "test-session",
|
||||||
|
prompt: [{ type: "text", text: "explore" }],
|
||||||
|
});
|
||||||
|
expect(first.stopReason).toBe("end_turn");
|
||||||
|
expect(events.indexOf("chunk:promised summary")).toBeGreaterThanOrEqual(0);
|
||||||
|
// Two results, one idle: one unit of debt is left over.
|
||||||
|
await waitFor(() => session().owedTrailingIdles === 1);
|
||||||
|
|
||||||
|
const second = await agent.prompt({
|
||||||
|
sessionId: "test-session",
|
||||||
|
prompt: [{ type: "text", text: "again" }],
|
||||||
|
});
|
||||||
|
expect(second.stopReason).toBe("end_turn");
|
||||||
|
// The `running` transition swept the stale unit, so the second turn's
|
||||||
|
// own idle leaves nothing outstanding.
|
||||||
|
await waitFor(() => session().owedTrailingIdles === 0);
|
||||||
|
await agent.sessions["test-session"]?.consumer;
|
||||||
|
});
|
||||||
|
|
||||||
it("falls back to settling at an idle when no followup comes", async () => {
|
it("falls back to settling at an idle when no followup comes", async () => {
|
||||||
const agent = createMockAgent();
|
const agent = createMockAgent();
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
import { readFileSync } from "node:fs";
|
|
||||||
import { createRequire } from "node:module";
|
|
||||||
import { dirname, join } from "node:path";
|
|
||||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
import { query, type ModelInfo, type Query } from "@anthropic-ai/claude-agent-sdk";
|
import { query, type ModelInfo, type Query } from "@anthropic-ai/claude-agent-sdk";
|
||||||
import { buildModelConfigOption, getAvailableModels } from "../session-model.js";
|
import { buildModelConfigOption, getAvailableModels } from "../session-model.js";
|
||||||
@@ -16,21 +13,6 @@ describe("versioned model display names", () => {
|
|||||||
beforeEach(() => vi.stubEnv("ANTHROPIC_MODEL", undefined));
|
beforeEach(() => vi.stubEnv("ANTHROPIC_MODEL", undefined));
|
||||||
afterEach(() => vi.unstubAllEnvs());
|
afterEach(() => vi.unstubAllEnvs());
|
||||||
|
|
||||||
it("requires reviewing the live model contract whenever the SDK is upgraded", () => {
|
|
||||||
const require = createRequire(import.meta.url);
|
|
||||||
const sdkPackage = JSON.parse(
|
|
||||||
readFileSync(
|
|
||||||
join(dirname(require.resolve("@anthropic-ai/claude-agent-sdk")), "package.json"),
|
|
||||||
"utf8",
|
|
||||||
),
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
sdkPackage.version,
|
|
||||||
"Run RUN_INTEGRATION_TESTS=true npx vitest run src/tests/model-presentation.test.ts " +
|
|
||||||
"and review the Opus name normalization before updating this version guard.",
|
|
||||||
).toBe("0.3.257");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("adds standard-family versions and preserves model identity and recommendation", async () => {
|
it("adds standard-family versions and preserves model identity and recommendation", async () => {
|
||||||
const models: ModelInfo[] = [
|
const models: ModelInfo[] = [
|
||||||
{ ...OPUS, value: "default", displayName: "Default (recommended)" },
|
{ ...OPUS, value: "default", displayName: "Default (recommended)" },
|
||||||
|
|||||||
@@ -29,6 +29,26 @@ describe("Claude permission options and response mapping", () => {
|
|||||||
contextUsedPercent,
|
contextUsedPercent,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("leads with the reject options when the CLI defaults the ask to no", () => {
|
||||||
|
const changeSet = normalizeDurablePermissionChangeSet([
|
||||||
|
{ type: "addRules", rules: [rule], behavior: "allow", destination: "localSettings" },
|
||||||
|
]);
|
||||||
|
const context = {
|
||||||
|
toolName: "Bash",
|
||||||
|
input: { command: "npm test" },
|
||||||
|
cwd: "/workspace",
|
||||||
|
durableChangeSet: changeSet,
|
||||||
|
};
|
||||||
|
expect(buildClaudePermissionOptions(context).map((option) => option.kind)).toEqual([
|
||||||
|
"allow_once",
|
||||||
|
"allow_always",
|
||||||
|
"reject_once",
|
||||||
|
]);
|
||||||
|
expect(
|
||||||
|
buildClaudePermissionOptions({ ...context, defaultToNo: true }).map((option) => option.kind),
|
||||||
|
).toEqual(["reject_once", "allow_once", "allow_always"]);
|
||||||
|
});
|
||||||
|
|
||||||
it("builds the native Bash static-suggestions option from the exact update bundle", () => {
|
it("builds the native Bash static-suggestions option from the exact update bundle", () => {
|
||||||
const changeSet = normalizeDurablePermissionChangeSet([
|
const changeSet = normalizeDurablePermissionChangeSet([
|
||||||
{ type: "addRules", rules: [rule], behavior: "allow", destination: "session" },
|
{ type: "addRules", rules: [rule], behavior: "allow", destination: "session" },
|
||||||
|
|||||||
@@ -103,6 +103,26 @@ describe("Claude permission ACP v1 presentation", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("forwards the CLI's defaultToNo hint in the permission record", () => {
|
||||||
|
const presentation = buildClaudePermissionPresentation({
|
||||||
|
toolName: "Bash",
|
||||||
|
input: { command: "rm -rf build" },
|
||||||
|
toolUseID: "tool-1",
|
||||||
|
defaultToNo: true,
|
||||||
|
});
|
||||||
|
expect(presentation._meta).toEqual({
|
||||||
|
permission: { version: 1, title: "Bash", defaultToNo: true },
|
||||||
|
});
|
||||||
|
expect(
|
||||||
|
buildClaudePermissionPresentation({
|
||||||
|
toolName: "Bash",
|
||||||
|
input: { command: "rm -rf build" },
|
||||||
|
toolUseID: "tool-1",
|
||||||
|
defaultToNo: false,
|
||||||
|
})._meta,
|
||||||
|
).toEqual({ permission: { version: 1, title: "Bash" } });
|
||||||
|
});
|
||||||
|
|
||||||
it("uses the human command description as the permission title", () => {
|
it("uses the human command description as the permission title", () => {
|
||||||
const input = { command: "npm test", description: "Run the tests" };
|
const input = { command: "npm test", description: "Run the tests" };
|
||||||
const presentation = buildClaudePermissionPresentation({
|
const presentation = buildClaudePermissionPresentation({
|
||||||
|
|||||||
Reference in New Issue
Block a user