From 2cabc4b5f6767c6c22d1593b7a039a328ebc5590 Mon Sep 17 00:00:00 2001 From: Justin Carper Date: Tue, 29 Sep 2026 12:34:34 -0500 Subject: [PATCH 1/3] chore: consolidate dependency updates, clear npm audit, fix per-model param docs Dependencies (supersedes #122, #124, #125): - @connectrpc/connect-node 2.1.2 -> 2.2.0 - @cursor/sdk 1.0.31 -> 1.0.32 - @opencode-ai/plugin + sdk -> 1.18.33 (one sdk copy) - @ai-sdk/provider 3.0.15 -> 3.0.18, @types/node -> 26.6.3, vitest -> 5.0.2 - overrides: undici ^6.28.1 (GHSA-3wwx-pv8p-q78v), new toml ^4.2.0 (GHSA-82x6-q7mm-w9cf); npm audit reports 0 vulnerabilities - @ai-sdk/provider v4 and TypeScript 7 stay blocked per dependabot.yml Docs (#119): Cursor model param ids are per model, so `thinking` on a model without that param (e.g. grok-4.6, which takes `effort`) is ignored. Correct the README examples and the delegate/cloud-agent `thinking` tool-arg descriptions. Comment-only changes in src/provider; no logic change. --- CHANGELOG.md | 22 +++ README.md | 16 +- package-lock.json | 347 +++++++++++++++++------------------- package.json | 19 +- src/plugin/cursor-tools.ts | 4 +- src/provider/cloud-agent.ts | 2 +- src/provider/controls.ts | 6 +- src/provider/delegate.ts | 2 +- src/provider/index.ts | 2 +- 9 files changed, 215 insertions(+), 205 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab8b359..ae865ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +- **Docs: model param ids are per model (#119).** Cursor model param ids differ + per model, so a `thinking` param set on a model that doesn't advertise one + (e.g. grok-4.6, which takes `effort`) is ignored and Cursor falls back to its + own default. The README's per-request controls example, `params` row, and + `thinking` rows, plus the `cursor_delegate`/`cursor_cloud_agent` `thinking` + tool-arg descriptions, were corrected to say so (wording only — no behavior + change). + +- **Chore: dependency bumps (#122, #124, #125) and audit overrides.** + Consolidates the three open Dependabot PRs: `@connectrpc/connect-node` + 2.1.2 → 2.2.0 (required at runtime by `@cursor/sdk`, not imported + by the plugin itself; the 2.2.0 additions are server-side), + `@cursor/sdk` 1.0.31 → 1.0.32, `@opencode-ai/plugin` and + `@opencode-ai/sdk` 1.18.25/1.18.30 → 1.18.33 (kept on one version, one + sdk copy in the tree), `@ai-sdk/provider` 3.0.15 → 3.0.18, + `@types/node` 26.5.0 → 26.6.3, `vitest` 5.0.0 → 5.0.2. + `@ai-sdk/provider` v4 and TypeScript 7 stay blocked (see + .github/dependabot.yml). Clears both `npm audit` findings via overrides: + `undici` `^6.28.1` (resolves 6.29.0, GHSA-3wwx-pv8p-q78v) and a new + `toml` `^4.2.0` (resolves 4.3.0, GHSA-82x6-q7mm-w9cf; reached through + `effect` under `@opencode-ai/plugin`). + ## [0.10.0-next.1] — 2026-09-29 (pre-release) Adds opencode v2 support alongside v1 (#127). Not on `latest`; install with diff --git a/README.md b/README.md index cc7c156..d69e258 100644 --- a/README.md +++ b/README.md @@ -246,7 +246,7 @@ See [SECURITY.md](./SECURITY.md) for the full threat model. | `apiKey` | `CURSOR_API_KEY` | Cursor API key | | `cwd` | `process.cwd()` | Directory the local agent operates in | | `mode` | `"agent"` | Default conversation mode (`"agent"` or `"plan"`) | -| `params` | — | Default model params, e.g. `{ thinking: "high" }` | +| `params` | — | Default model params, e.g. `{ effort: "high" }` (param ids are per model — see [Per-request controls](#per-request-controls-mode-thinking-level)) | | `settingSources` | — | Cursor settings layers to load: `["project","user","all",...]` — pulls in your Cursor skills, rules, and `.cursor/mcp.json` | | `sandbox` | — | Run the agent's tools in [Cursor's sandbox](https://cursor.com/docs/agent/sandbox) | | `autoReview` | `false` | Gate tool calls through Cursor's classifier-backed Auto review (best-effort, not a security boundary) | @@ -306,12 +306,18 @@ variant to opt in, or set it per model under `options.params.fast` below. opencode's **plan agent** (`Tab`) maps to Cursor's plan mode automatically — no manual config needed. +Param ids are **per model** — use the id the model actually advertises, or Cursor ignores the +param and falls back to its own default (e.g. `high` effort). `grok-4.6` uses `effort`, +`gpt-5.5` uses `reasoning`, `claude-opus-4-8` uses `effort` (plus a boolean `thinking`), and +`composer-2.5` has only `fast`. Run `cursor_refresh_models` to list model ids, and check the +model picker's variant names for the values a model accepts. + To set controls statically per model: ```json { "provider": { "cursor": { "models": { - "composer-2.5": { "options": { "params": { "thinking": "high" } } } -} } } } + "grok-4.6": { "options": { "params": { "effort": "medium" } } } } +} } } ``` ## System prompt @@ -560,7 +566,7 @@ non-session cwd — see [Skills limitations](#limitations)). | `prompt` | ✅ | The subtask to delegate | | `model` | ✅ | Cursor model id | | `mode` | — | `"agent"` or `"plan"` | -| `thinking` | — | Thinking level (e.g. `"high"`) | +| `thinking` | — | Sets the model's `thinking` param (`"true"`/`"false"`) — only on models that advertise it (e.g. `claude-opus-4-8`); models using `effort`/`reasoning`/`reasoning_effort` can't be set through this arg | | `cwd` | — | Working directory | | `sandbox` | — | Run in Cursor's sandbox | | `agentId` | — | Resume a specific Cursor agent | @@ -577,7 +583,7 @@ open a PR. | `startingRef` | — | Branch/ref to start from | | `model` | — | Cursor model id | | `mode` | — | `"agent"` or `"plan"` | -| `thinking` | — | Thinking level | +| `thinking` | — | Sets the model's `thinking` param (`"true"`/`"false"`) — only on models that advertise it (e.g. `claude-opus-4-8`); models using `effort`/`reasoning`/`reasoning_effort` can't be set through this arg | | `autoCreatePR` | — | Open a PR when finished | | `workOnCurrentBranch` | — | Operate on the current branch instead of a new one | diff --git a/package-lock.json b/package-lock.json index df9b7c0..13c04e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,19 +9,19 @@ "version": "0.10.0-next.1", "license": "MIT", "dependencies": { - "@connectrpc/connect-node": "^2.1.2", - "@cursor/sdk": "^1.0.24", - "@opencode-ai/plugin": "^1.18.21", + "@connectrpc/connect-node": "^2.2.0", + "@cursor/sdk": "^1.0.32", + "@opencode-ai/plugin": "^1.18.33", "semver": "^7.8.4" }, "devDependencies": { - "@ai-sdk/provider": "^3.0.15", - "@opencode-ai/sdk": "^1.18.30", - "@types/node": "^26.4.1", + "@ai-sdk/provider": "^3.0.18", + "@opencode-ai/sdk": "^1.18.33", + "@types/node": "^26.6.3", "@types/semver": "^7.8.0", "tsup": "^8.5.1", "typescript": "^6.0.3", - "vitest": "^5.0.0" + "vitest": "^5.0.2" }, "engines": { "node": ">=22.13.0" @@ -31,9 +31,9 @@ } }, "node_modules/@ai-sdk/provider": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.15.tgz", - "integrity": "sha512-XeZW1CcDF2GMbH4wejW6xBRI2QCOgnkVYUnxoeDadB1mf85riL2bMUeDoh+6gJ/r4mjNfzUPW8OjLjvwTP0u1Q==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.18.tgz", + "integrity": "sha512-IpefF5ssZVOZCD4Wu7zxt6PwZoGT2HLVjxpJ10Bjx6EAmRfLYJPjyrfxb0RYDlwvXnDb9nkQ7Do/oJVDuRFzew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -44,16 +44,16 @@ } }, "node_modules/@bufbuild/protobuf": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.12.1.tgz", - "integrity": "sha512-BvAMfS6LrgZiryOAZ4pBYucu4wG/Ei/9o9DZ9akbREnMLbPJiom2i8b9C8IsKErQoiKqVhrerzt3kOT/RrzLHg==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.16.0.tgz", + "integrity": "sha512-FWa0sPlqYGJgpTs6OxBRcL/AW4JT0OIO+W1ajerluoTVh8CV0B7XM1qsNCRgnkSCkRCgOICKHRQlY17jrsm0+Q==", "license": "(Apache-2.0 AND BSD-3-Clause)", "peer": true }, "node_modules/@connectrpc/connect": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-2.1.2.tgz", - "integrity": "sha512-MXkBijtcX09R10Eb6sFeIetc6w6746eio6xtfuyVOH7oQAacT1X0GzMIQFux6Qy8cq3W/T5qX5Bei8YbFtmRGA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-2.2.0.tgz", + "integrity": "sha512-M63OQ1ZFcPUm85CuewJ9G9CMV8LjzGR9935xOnXNQGSazAbwMb3x2W7vXBYM1zqrP7XFD8uxp/dUAhirclgwnQ==", "license": "Apache-2.0", "peer": true, "peerDependencies": { @@ -61,22 +61,22 @@ } }, "node_modules/@connectrpc/connect-node": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@connectrpc/connect-node/-/connect-node-2.1.2.tgz", - "integrity": "sha512-+i/aAOpsI8sIx1mbYp6d99zvxaUSF6t/jP9Ux9maAmjsZPgmIQ3JuIeYi0zJIP9zlCnBlJjkpPosshCgdRuThQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@connectrpc/connect-node/-/connect-node-2.2.0.tgz", + "integrity": "sha512-E6uUO6e11WdynAuBjuN+0WpHjqxEM9BNDdfDIJHcn49Esg/WxSIbn2y1KFt9XL96IJi01qdBbvubcdpBz1X3Zw==", "license": "Apache-2.0", "engines": { - "node": ">=20" + "node": ">=22" }, "peerDependencies": { "@bufbuild/protobuf": "^2.7.0", - "@connectrpc/connect": "2.1.2" + "@connectrpc/connect": "2.2.0" } }, "node_modules/@cursor/sdk": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/@cursor/sdk/-/sdk-1.0.31.tgz", - "integrity": "sha512-0SdJQqp5oXn81oJqIVkLpgHih+CL6CAudK83pCsdJyA23AvInSWlMaGpLi+JlrK3efHoswiEhhASs9WpeEz3QQ==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@cursor/sdk/-/sdk-1.0.32.tgz", + "integrity": "sha512-aimGfsgu4Mp/cZNGT34pY8X4FGTzUPAEnYocYK2o3JqCBiO2RsT9TIrdX9r5gfZ81qkapc66CxatxAN0UZky5A==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@bufbuild/protobuf": "1.10.0", @@ -90,17 +90,17 @@ "node": ">=22.13" }, "optionalDependencies": { - "@cursor/sdk-darwin-arm64": "1.0.31", - "@cursor/sdk-darwin-x64": "1.0.31", - "@cursor/sdk-linux-arm64": "1.0.31", - "@cursor/sdk-linux-x64": "1.0.31", - "@cursor/sdk-win32-x64": "1.0.31" + "@cursor/sdk-darwin-arm64": "1.0.32", + "@cursor/sdk-darwin-x64": "1.0.32", + "@cursor/sdk-linux-arm64": "1.0.32", + "@cursor/sdk-linux-x64": "1.0.32", + "@cursor/sdk-win32-x64": "1.0.32" } }, "node_modules/@cursor/sdk-darwin-arm64": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/@cursor/sdk-darwin-arm64/-/sdk-darwin-arm64-1.0.31.tgz", - "integrity": "sha512-i6INDIQhV7xDeFKfND0yr/SOwv4uJthPMfXXvNpZapO+IbJTx30aPzJVMBqdksvDHyn/cekJB/92Jkz+a5K8Ow==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@cursor/sdk-darwin-arm64/-/sdk-darwin-arm64-1.0.32.tgz", + "integrity": "sha512-72EYr7Bmc1clgt5YVNdUdClCz461P3Fw91BUHebLMqI35A2suCMNo+99Yy7CDAv3SIqqh3kskPUuFCinVEqZhg==", "cpu": [ "arm64" ], @@ -114,9 +114,9 @@ } }, "node_modules/@cursor/sdk-darwin-x64": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/@cursor/sdk-darwin-x64/-/sdk-darwin-x64-1.0.31.tgz", - "integrity": "sha512-vCmrGykwflJNAAr4RVY4UlZ+F0fmUF+WCR8zFzP4Jl1Da2b8Oh1rxrVLbIbleS1/LKsX/OPbTQNRL0SEER95Sg==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@cursor/sdk-darwin-x64/-/sdk-darwin-x64-1.0.32.tgz", + "integrity": "sha512-9vmxqb4y2xR5wGBrbygcqhmejMgNfsADpBMb+t9QorKH7qIRo6ItzhqrP5rSDB30UO9pcefAsQyVNjWy0hSnoA==", "cpu": [ "x64" ], @@ -130,9 +130,9 @@ } }, "node_modules/@cursor/sdk-linux-arm64": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/@cursor/sdk-linux-arm64/-/sdk-linux-arm64-1.0.31.tgz", - "integrity": "sha512-BHTwumfhWjTy0k41+KaaXfTm3MGu6WEYU76FmXqc/r1+ynuQroqfBKWyfH4XBcx3uzyaZJQLxNB9BBbs8yHUig==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@cursor/sdk-linux-arm64/-/sdk-linux-arm64-1.0.32.tgz", + "integrity": "sha512-Ii74pL4KMquRwMhD+/X+HYpsMe9Vf2WwwL46TwJPhwH85h4X3dm450QG8geTD4L4aXtzDY4fsTf/BVTdw5ulfQ==", "cpu": [ "arm64" ], @@ -146,9 +146,9 @@ } }, "node_modules/@cursor/sdk-linux-x64": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/@cursor/sdk-linux-x64/-/sdk-linux-x64-1.0.31.tgz", - "integrity": "sha512-y+ahiKQvEISUn9y6z75jwKjLQkrJ/nY7ehL1Vi9X8zdbjz14fiEtMTICAHccTiTq5cf6dZjXC5QfPdJRat6dhg==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@cursor/sdk-linux-x64/-/sdk-linux-x64-1.0.32.tgz", + "integrity": "sha512-cvCuD+pb52DNHV1Nmb6Pv1XnzcSmREekhCtz+zNFz1VWWYrTbPwLGlA9Ou9rEY1KMHxPq9shkvRmrjDVCK+cXQ==", "cpu": [ "x64" ], @@ -162,9 +162,9 @@ } }, "node_modules/@cursor/sdk-win32-x64": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/@cursor/sdk-win32-x64/-/sdk-win32-x64-1.0.31.tgz", - "integrity": "sha512-5ti4AwUz8kh5ovM86K/fTiHmVGL6jk1faQkTCX08lcCxFSlUDwpeyhn90pWsbNFQ4Vy2PttqEjanV6895p13eA==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@cursor/sdk-win32-x64/-/sdk-win32-x64-1.0.32.tgz", + "integrity": "sha512-Ltqal7hG2KKgz8ZHgy0KLJvkFWtJCL5wbEUHOaMHJe1gC+eXuVYA89DXijdoFHkrZNzYo9tt4AW2nszqVKz3Mw==", "cpu": [ "x64" ], @@ -682,9 +682,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "dev": true, "license": "MIT" }, @@ -778,13 +778,13 @@ ] }, "node_modules/@opencode-ai/plugin": { - "version": "1.18.25", - "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.18.25.tgz", - "integrity": "sha512-Kb34zFqYosFNiMd1IuYiZGjX17z+18Srm7tHZMCz+uMVRTYNkEw1FTrfAK2FLbggwYdgzifGwKMNF1slLT8eLw==", + "version": "1.18.33", + "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.18.33.tgz", + "integrity": "sha512-fmhqCBJvNt+Vfbx6ckKP19S3xwMBhUXLCBQaK92R4wnv3wsWTZYkJQwYf2egiWfJNOl47jhs3vP7uQkl0mvHQw==", "license": "MIT", "dependencies": { "@ai-sdk/provider": "3.0.8", - "@opencode-ai/sdk": "1.18.25", + "@opencode-ai/sdk": "1.18.33", "effect": "4.0.0-beta.83", "zod": "4.1.8" }, @@ -827,19 +827,18 @@ } }, "node_modules/@opencode-ai/sdk": { - "version": "1.18.30", - "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.30.tgz", - "integrity": "sha512-uviJ+PZLc/D1szt33WGzzt/rqJ+IaNmRGBb+UcOXrcQANl8XXKJrp4CNQQ2UAnUJ3Ek+VqcamIwjtKHUW/OjOQ==", - "dev": true, + "version": "1.18.33", + "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.33.tgz", + "integrity": "sha512-Nyurky9+AA2tvZ6my8UtO5pxPoXxrNypqjeEqMshBGiR542glOy+KE1Y+3lwWU+Z6HC/hSmrdXNbX81+qiuTzg==", "license": "MIT", "dependencies": { "cross-spawn": "7.0.6" } }, "node_modules/@oxc-project/types": { - "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.148.0.tgz", - "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==", + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", + "integrity": "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==", "dev": true, "license": "MIT", "peer": true, @@ -848,9 +847,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz", - "integrity": "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.11.tgz", + "integrity": "sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==", "cpu": [ "arm" ], @@ -866,9 +865,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.7.tgz", - "integrity": "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.11.tgz", + "integrity": "sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==", "cpu": [ "arm64" ], @@ -884,9 +883,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz", - "integrity": "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.11.tgz", + "integrity": "sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==", "cpu": [ "arm64" ], @@ -902,9 +901,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz", - "integrity": "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.11.tgz", + "integrity": "sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==", "cpu": [ "x64" ], @@ -920,9 +919,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.7.tgz", - "integrity": "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.11.tgz", + "integrity": "sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==", "cpu": [ "x64" ], @@ -938,9 +937,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.7.tgz", - "integrity": "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.11.tgz", + "integrity": "sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==", "cpu": [ "arm" ], @@ -956,9 +955,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz", - "integrity": "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.11.tgz", + "integrity": "sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==", "cpu": [ "arm64" ], @@ -977,9 +976,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz", - "integrity": "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.11.tgz", + "integrity": "sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==", "cpu": [ "arm64" ], @@ -998,9 +997,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.7.tgz", - "integrity": "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.11.tgz", + "integrity": "sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==", "cpu": [ "ppc64" ], @@ -1019,9 +1018,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.7.tgz", - "integrity": "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.11.tgz", + "integrity": "sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==", "cpu": [ "s390x" ], @@ -1040,9 +1039,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz", - "integrity": "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.11.tgz", + "integrity": "sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==", "cpu": [ "x64" ], @@ -1061,9 +1060,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz", - "integrity": "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.11.tgz", + "integrity": "sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==", "cpu": [ "x64" ], @@ -1082,9 +1081,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.7.tgz", - "integrity": "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.11.tgz", + "integrity": "sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==", "cpu": [ "arm64" ], @@ -1100,9 +1099,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz", - "integrity": "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.11.tgz", + "integrity": "sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==", "cpu": [ "arm64" ], @@ -1118,9 +1117,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz", - "integrity": "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.11.tgz", + "integrity": "sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==", "cpu": [ "x64" ], @@ -1579,9 +1578,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.5.0.tgz", - "integrity": "sha512-dVSGpriSoCgz8WnDNTuSSuSv1PC/ALXihO4ulRZt7Md8k9mlbdin3lGOcDE8SnWOgf513ByWlXd7BK4azmyg/A==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -1596,14 +1595,14 @@ "license": "MIT" }, "node_modules/@vitest/mocker": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.0.tgz", - "integrity": "sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.2.tgz", + "integrity": "sha512-Z5FS00Q1SJHkB35xATsmWGdQ5WA1/0MV3CDjqyv7GavHv1OfOj145MNfHOlHk7QLes21dKFDHr8EO2zvL+9WGA==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.31", - "@vitest/spy": "5.0.0", + "@vitest/spy": "5.0.2", "estree-walker": "^3.0.3", "magic-string": "^1.2.3" }, @@ -1624,19 +1623,19 @@ } }, "node_modules/@vitest/mocker/node_modules/magic-string": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz", - "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz", + "integrity": "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "@jridgewell/sourcemap-codec": "^1.6.0" } }, "node_modules/@vitest/spy": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.0.tgz", - "integrity": "sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.2.tgz", + "integrity": "sha512-Ijc7T1nT9efNb5LxvjaBrEqw3f/QwUv5EE0nKqZxgqsaV/FxAAZ8baGylA8X/Z2oS4Lp+K74Jr6dTJsDKxJDeg==", "dev": true, "license": "MIT", "funding": { @@ -2616,14 +2615,14 @@ } }, "node_modules/rolldown": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.7.tgz", - "integrity": "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.11.tgz", + "integrity": "sha512-qpSwIyz0jHQq5qXBTNxFmE6664rJ7O+4TvPFOiOaBSrz8IOHc1koKKSqTM2H6u1UG1+TveuC6vaDHKXFOvb1Kw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@oxc-project/types": "=0.148.0", + "@oxc-project/types": "=0.151.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -2633,21 +2632,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.7", - "@rolldown/binding-android-arm64": "1.2.7", - "@rolldown/binding-darwin-arm64": "1.2.7", - "@rolldown/binding-darwin-x64": "1.2.7", - "@rolldown/binding-freebsd-x64": "1.2.7", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.7", - "@rolldown/binding-linux-arm64-gnu": "1.2.7", - "@rolldown/binding-linux-arm64-musl": "1.2.7", - "@rolldown/binding-linux-ppc64-gnu": "1.2.7", - "@rolldown/binding-linux-s390x-gnu": "1.2.7", - "@rolldown/binding-linux-x64-gnu": "1.2.7", - "@rolldown/binding-linux-x64-musl": "1.2.7", - "@rolldown/binding-openharmony-arm64": "1.2.7", - "@rolldown/binding-win32-arm64-msvc": "1.2.7", - "@rolldown/binding-win32-x64-msvc": "1.2.7" + "@rolldown/binding-android-arm-eabi": "1.2.11", + "@rolldown/binding-android-arm64": "1.2.11", + "@rolldown/binding-darwin-arm64": "1.2.11", + "@rolldown/binding-darwin-x64": "1.2.11", + "@rolldown/binding-freebsd-x64": "1.2.11", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.11", + "@rolldown/binding-linux-arm64-gnu": "1.2.11", + "@rolldown/binding-linux-arm64-musl": "1.2.11", + "@rolldown/binding-linux-ppc64-gnu": "1.2.11", + "@rolldown/binding-linux-s390x-gnu": "1.2.11", + "@rolldown/binding-linux-x64-gnu": "1.2.11", + "@rolldown/binding-linux-x64-musl": "1.2.11", + "@rolldown/binding-openharmony-arm64": "1.2.11", + "@rolldown/binding-win32-arm64-msvc": "1.2.11", + "@rolldown/binding-win32-x64-msvc": "1.2.11" } }, "node_modules/rollup": { @@ -2728,13 +2727,6 @@ "node": ">=8" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, "node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -2756,13 +2748,6 @@ "node": ">=0.10.0" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, "node_modules/std-env": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", @@ -2851,9 +2836,9 @@ } }, "node_modules/toml": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/toml/-/toml-4.1.2.tgz", - "integrity": "sha512-m0vXfHODcw3gk+KONAOlVQ5yNHc3yS3B1ybM3HS1vqDoS0RWTDDVBVVTYi8hH0k+2OM1vmo9fb1WX9EVqjqfHA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-4.3.0.tgz", + "integrity": "sha512-lVb8X9BsPVuH0M4BKeS91tXAmJvCjQ5UIyAbQFaxkKGyUFK2RPkhwaFSQH8vbpl1d23eu/IBH+dwVMHWaq9A5A==", "license": "MIT", "engines": { "node": ">=20" @@ -2951,9 +2936,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "6.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", - "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "version": "6.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.29.0.tgz", + "integrity": "sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==", "license": "MIT", "engines": { "node": ">=18.17" @@ -2980,17 +2965,17 @@ } }, "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz", + "integrity": "sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.9", "tinyglobby": "^0.2.17" }, "bin": { @@ -3007,7 +2992,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -3059,14 +3044,14 @@ } }, "node_modules/vitest": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.0.tgz", - "integrity": "sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.2.tgz", + "integrity": "sha512-7MQrx9pDv5aHiUcovIb/70Ys3tgtkUVgCtledvKdCmEO+/1Dicq5ZqoSxOW034m03oqC+oHOKui2dM6qtMLoJg==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/mocker": "5.0.0", + "@vitest/mocker": "5.0.2", "chai": "^6.2.2", "es-module-lexer": "^2.3.2", "expect-type": "^1.4.0", @@ -3074,10 +3059,10 @@ "obug": "^2.1.4", "picomatch": "^4.0.7", "std-env": "^4.2.0", - "tinybench": "6.1.4", - "tinyexec": "1.3.0", + "tinybench": "^6.1.4", + "tinyexec": "^1.3.0", "tinyglobby": "^0.2.17", - "why-is-node-running": "^2.3.0" + "why-is-node-running": "^3.2.1" }, "bin": { "vitest": "vitest.mjs" @@ -3092,12 +3077,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "5.0.0", - "@vitest/browser-preview": "5.0.0", + "@vitest/browser-playwright": "5.0.2", + "@vitest/browser-preview": "5.0.2", "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", - "@vitest/coverage-istanbul": "5.0.0", - "@vitest/coverage-v8": "5.0.0", - "@vitest/ui": "5.0.0", + "@vitest/coverage-istanbul": "5.0.2", + "@vitest/coverage-v8": "5.0.2", + "@vitest/ui": "5.0.2", "happy-dom": "*", "jsdom": "*", "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" @@ -3177,20 +3162,16 @@ } }, "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-3.2.2.tgz", + "integrity": "sha512-NKUzAelcoCXhXL4dJzKIwXeR8iEVqsA0Lq6Vnd0UXvgaKbzVo4ZTHROF2Jidrv+SgxOQ03fMinnNhzZATxOD3A==", "dev": true, "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, "bin": { "why-is-node-running": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=20.11" } }, "node_modules/yaml": { diff --git a/package.json b/package.json index 1939ab3..bcb05fa 100644 --- a/package.json +++ b/package.json @@ -58,28 +58,29 @@ "prepublishOnly": "npm run typecheck && npm test && npm run build" }, "dependencies": { - "@connectrpc/connect-node": "^2.1.2", - "@cursor/sdk": "^1.0.24", - "@opencode-ai/plugin": "^1.18.21", + "@connectrpc/connect-node": "^2.2.0", + "@cursor/sdk": "^1.0.32", + "@opencode-ai/plugin": "^1.18.33", "semver": "^7.8.4" }, "overrides": { "@opencode-ai/sdk": "$@opencode-ai/sdk", - "undici": "^6.28.0", + "undici": "^6.28.1", "tar": "^7.5.11", "node-gyp": "^12.4.0", - "esbuild": "^0.28.1" + "esbuild": "^0.28.1", + "toml": "^4.2.0" }, "peerDependencies": { "@ai-sdk/provider": "^3.0.0" }, "devDependencies": { - "@ai-sdk/provider": "^3.0.15", - "@opencode-ai/sdk": "^1.18.30", - "@types/node": "^26.4.1", + "@ai-sdk/provider": "^3.0.18", + "@opencode-ai/sdk": "^1.18.33", + "@types/node": "^26.6.3", "@types/semver": "^7.8.0", "tsup": "^8.5.1", "typescript": "^6.0.3", - "vitest": "^5.0.0" + "vitest": "^5.0.2" } } diff --git a/src/plugin/cursor-tools.ts b/src/plugin/cursor-tools.ts index 7c06bd6..4781eca 100644 --- a/src/plugin/cursor-tools.ts +++ b/src/plugin/cursor-tools.ts @@ -87,7 +87,7 @@ export function buildCursorTools(deps: CursorToolDeps): Record value), e.g. { thinking: "high" }. */ + /** Default Cursor model params (id -> value), e.g. { effort: "high" }. */ params?: Record; /** * Per-model floor params, applied UNDER {@link params} and per-request options @@ -20,7 +20,7 @@ export interface ResolvedControls { /** * Build a Cursor `ModelSelection` from a model id and an optional map of model - * params (e.g. `{ thinking: "high" }`). Shared by the provider control + * params (e.g. `{ effort: "high" }`). Shared by the provider control * resolution and the cloud/delegate tools so param handling stays consistent. */ export function buildModelSelection( @@ -46,7 +46,7 @@ function isMode(value: unknown): value is AgentModeOption { * * Recognized keys in `providerOptions.cursor`: * - `mode`: "agent" | "plan" - * - `params`: Record of Cursor model params (e.g. { thinking: "high" }) + * - `params`: Record of Cursor model params (e.g. { effort: "high" }) * - `thinking`: string convenience, mapped to the `thinking` param if not already set */ export function resolveControls( diff --git a/src/provider/delegate.ts b/src/provider/delegate.ts index dd195aa..4a1f172 100644 --- a/src/provider/delegate.ts +++ b/src/provider/delegate.ts @@ -12,7 +12,7 @@ export interface DelegateParams { model: string; /** Conversation mode; defaults to "agent". */ mode?: AgentModeOption; - /** Convenience for the Cursor `thinking` model param (e.g. "high"). */ + /** Convenience that sets the literal Cursor `thinking` model param. */ thinking?: string; /** * Working directory the local agent operates in. An array supplies diff --git a/src/provider/index.ts b/src/provider/index.ts index b88ab13..eaf599c 100644 --- a/src/provider/index.ts +++ b/src/provider/index.ts @@ -32,7 +32,7 @@ export interface CursorProviderOptions { cwd?: string; /** Default conversation mode: "agent" (default) or "plan". Overridable per-request. */ mode?: AgentModeOption; - /** Default Cursor model params (id -> value), e.g. { thinking: "high" }. */ + /** Default Cursor model params (id -> value), e.g. { effort: "high" }. */ params?: Record; /** * Per-model floor params keyed by model id, e.g. `{ "composer-2.5": { fast: From 116cde05a369e9ee2ac7e8a833a03375aef73653 Mon Sep 17 00:00:00 2001 From: Justin Carper Date: Tue, 29 Sep 2026 14:28:41 -0500 Subject: [PATCH 2/3] fix: point v2 install at @next, list model params in refresh tool, fix fallback param - README (#126): the opencode v2 install snippet used @latest, which is 0.9.0 (v1-only build, no { id, setup } default export) and reproduces "Plugin must export a default definition" on opencode 2.x. Point it at @next until 0.10.0 is promoted, with a note. - cursor_refresh_models (#119): append each model's param ids and accepted values, e.g. `grok-4.6 [effort=low|medium|high|xhigh, fast=false|true]`, so users can tell effort from reasoning_effort. Add a test. - fallback catalog: composer-2.5 exposes `fast`, not `thinking`; the stale entry produced a bogus `thinking` variant on the keyless path. - CHANGELOG: limit the connect-node note to verified facts (nothing in the repo imports it; @cursor/sdk nests its own 1.7.0) and record the above. --- CHANGELOG.md | 25 ++++++++++++++++++++++-- README.md | 15 ++++++++++---- src/fallback-models.ts | 2 +- src/plugin/cursor-tools.ts | 18 ++++++++++++++++- test/cursor-tools.test.ts | 40 +++++++++++++++++++++++++++++++++++++- 5 files changed, 91 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae865ee..eb87092 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,31 @@ All notable changes to this project will be documented in this file. tool-arg descriptions, were corrected to say so (wording only — no behavior change). +- **Fix: README v2 install snippet points at `@next` (#126).** The + `plugins` example used `@latest`, which resolves to 0.9.0 — a v1-only + build that opencode v2 rejects with "Plugin must export a default + definition with an id and an effect or setup function". v2 support is + published under the `next` dist-tag (0.10.0-next.1+) until promoted; + the snippet and a note now say so. + +- **Fix: fallback catalog's composer-2.5 param matches the live one.** + The keyless/fallback entry advertised a `thinking` param (off/on) that + the live catalog does not expose, yielding a bogus `thinking` variant; + it now declares only `fast` (false/true), so the fallback path yields + exactly the `fast` variant and `{ fast: "false" }` defaults. + +- **Add: `cursor_refresh_models` lists param ids and values (#119).** + Each model line now appends the model's advertised params as + `[effort=low|medium|high|xhigh, fast=false|true]` (no suffix when the + model has none), so accepted param ids and values are readable + straight from the tool output. + - **Chore: dependency bumps (#122, #124, #125) and audit overrides.** Consolidates the three open Dependabot PRs: `@connectrpc/connect-node` - 2.1.2 → 2.2.0 (required at runtime by `@cursor/sdk`, not imported - by the plugin itself; the 2.2.0 additions are server-side), + 2.1.2 → 2.2.0 (nothing in src/, scripts/, or test/ imports it, and + `@cursor/sdk` declares `^1.6.1` and nests its own 1.7.0 copy, so the + top-level entry — added in #31 when the SDK did not declare it — no + longer looks needed; left in place as a removal candidate), `@cursor/sdk` 1.0.31 → 1.0.32, `@opencode-ai/plugin` and `@opencode-ai/sdk` 1.18.25/1.18.30 → 1.18.33 (kept on one version, one sdk copy in the tree), `@ai-sdk/provider` 3.0.15 → 3.0.18, diff --git a/README.md b/README.md index d69e258..e0fdcc6 100644 --- a/README.md +++ b/README.md @@ -81,11 +81,18 @@ opencode v2 uses a `plugins` key (plural) and loads the plugin's `setup()` entry ```json { "$schema": "https://opencode.ai/config.json", - "plugins": ["@stablekernel/opencode-cursor@latest"] + "plugins": ["@stablekernel/opencode-cursor@next"] } ``` -Both generations load the same published package, so one install serves either. +> v2 support is published under the `next` dist-tag (`0.10.0-next.1` or later) +> until it is promoted to `latest`. `@latest` currently resolves to 0.9.0, a +> v1-only build that opencode v2 rejects with "Plugin must export a default +> definition with an id and an effect or setup function". Switch the spec back +> to `@latest` once 0.10.0 is stable. + +From 0.10.0 onward both generations load the same published package, so one +install serves either (0.9.x `@latest` is v1-only). Minimum versions: v1 >= 1.18.29 (object plugin entrypoint), v2 tested against 2.0.19. **Registry mirrors:** on v2 the provider package is installed at exactly the plugin's @@ -309,8 +316,8 @@ needed. Param ids are **per model** — use the id the model actually advertises, or Cursor ignores the param and falls back to its own default (e.g. `high` effort). `grok-4.6` uses `effort`, `gpt-5.5` uses `reasoning`, `claude-opus-4-8` uses `effort` (plus a boolean `thinking`), and -`composer-2.5` has only `fast`. Run `cursor_refresh_models` to list model ids, and check the -model picker's variant names for the values a model accepts. +`composer-2.5` has only `fast`. Run `cursor_refresh_models` to list each model id +with its param ids and accepted values. To set controls statically per model: diff --git a/src/fallback-models.ts b/src/fallback-models.ts index 067952e..55cf547 100644 --- a/src/fallback-models.ts +++ b/src/fallback-models.ts @@ -13,7 +13,7 @@ export const FALLBACK_MODELS: ModelListItem[] = [ displayName: "Composer 2.5", description: "Cursor's default agent model (fallback entry).", parameters: [ - { id: "thinking", displayName: "Thinking", values: [{ value: "off" }, { value: "on" }] }, + { id: "fast", displayName: "Fast", values: [{ value: "false" }, { value: "true" }] }, ], }, { id: "claude-opus-4-8", displayName: "Claude Opus 4.8 (via Cursor)" }, diff --git a/src/plugin/cursor-tools.ts b/src/plugin/cursor-tools.ts index 4781eca..d56c929 100644 --- a/src/plugin/cursor-tools.ts +++ b/src/plugin/cursor-tools.ts @@ -1,4 +1,5 @@ import { tool, type ToolContext, type ToolDefinition } from "@opencode-ai/plugin"; +import type { ModelListItem } from "@cursor/sdk"; import { rmSync } from "node:fs"; import semver from "semver"; import { runCloudAgent } from "../provider/cloud-agent.js"; @@ -262,6 +263,21 @@ export function buildCursorTools(deps: CursorToolDeps): Record): string { + const params = m.parameters ?? []; + if (params.length === 0) return `- ${m.id} — ${m.displayName}`; + const joined = params + .map((p) => `${p.id}=${(p.values ?? []).map((v) => v.value).join("|")}`) + .join(", "); + return `- ${m.id} — ${m.displayName} [${joined}]`; +} + /** * Build the maintenance tools shared by v1 and v2: * - `cursor_refresh_models`: force-refresh the model catalog. @@ -282,7 +298,7 @@ export function buildMaintenanceTools( execute: async () => { const apiKey = deps ? await deps.resolveApiKey() : undefined; const result = await discoverModels({ apiKey, forceRefresh: true }); - const lines = result.models.map((m) => `- ${m.id} — ${m.displayName}`); + const lines = result.models.map(modelLine); const header = result.source === "live" ? `Refreshed ${result.models.length} Cursor models (live):` diff --git a/test/cursor-tools.test.ts b/test/cursor-tools.test.ts index 1847849..3d91dfb 100644 --- a/test/cursor-tools.test.ts +++ b/test/cursor-tools.test.ts @@ -3,12 +3,14 @@ import { afterEach, describe, expect, it, vi } from "vitest"; const runCloudAgent = vi.fn(); const runDelegate = vi.fn(); const linkDelegateSession = vi.fn(); +const discoverModels = vi.fn(); vi.mock("../src/provider/cloud-agent.js", () => ({ runCloudAgent })); vi.mock("../src/provider/delegate.js", () => ({ runDelegate })); vi.mock("../src/provider/subagent-bridge.js", () => ({ linkDelegateSession })); +vi.mock("../src/model-discovery.js", () => ({ discoverModels })); -const { buildCursorTools } = await import("../src/plugin/cursor-tools.js"); +const { buildCursorTools, buildMaintenanceTools } = await import("../src/plugin/cursor-tools.js"); function ctx(ask: ReturnType) { return { @@ -30,6 +32,7 @@ afterEach(() => { runCloudAgent.mockReset(); runDelegate.mockReset(); linkDelegateSession.mockReset(); + discoverModels.mockReset(); }); describe("buildCursorTools", () => { @@ -312,3 +315,38 @@ describe("buildCursorTools", () => { expect(String(out)).toContain("agent crashed"); }); }); + +describe("buildMaintenanceTools — cursor_refresh_models output", () => { + const exec = async () => { + const tools = buildMaintenanceTools(); + const out = (await tools.cursor_refresh_models!.execute({}, undefined as never)) as { + output: string; + }; + return out.output; + }; + + it("appends [id=values] to a model with params; plain line without", async () => { + discoverModels.mockResolvedValue({ + source: "live", + models: [ + { + id: "grok-4.6", + displayName: "Grok 4.6", + parameters: [ + { + id: "effort", + values: [{ value: "low" }, { value: "medium" }, { value: "high" }, { value: "xhigh" }], + }, + { id: "fast", values: [{ value: "false" }, { value: "true" }] }, + ], + }, + { id: "plain-model", displayName: "Plain Model" }, + ], + }); + const output = await exec(); + expect(output).toContain( + "- grok-4.6 — Grok 4.6 [effort=low|medium|high|xhigh, fast=false|true]", + ); + expect(output.endsWith("- plain-model — Plain Model")).toBe(true); + }); +}); From 786482c0069562e976bf905488359ca84b6e0578 Mon Sep 17 00:00:00 2001 From: Justin Carper Date: Wed, 30 Sep 2026 06:40:27 -0500 Subject: [PATCH 3/3] docs: give opencode v2 users the right plugin cache path The troubleshooting entry and the manual-install snippet only described the opencode v1 cache layout (~/.cache/opencode/packages/...). opencode v2 caches plugin installs under ~/.cache/opencode/npm//, so anyone following the README on v2 cleared the wrong directory (#126). Cover both layouts, point v2 users at `opencode plugin update`, and note that an @latest install of 0.9.x has no v2 entrypoint. --- CHANGELOG.md | 4 +++- README.md | 12 +++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb87092..549b025 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,9 @@ All notable changes to this project will be documented in this file. build that opencode v2 rejects with "Plugin must export a default definition with an id and an effect or setup function". v2 support is published under the `next` dist-tag (0.10.0-next.1+) until promoted; - the snippet and a note now say so. + the snippet and a note now say so, and the troubleshooting entry now + gives the v2 cache path (`~/.cache/opencode/npm//`, or + `opencode plugin update`) instead of only the v1 `packages/` path. - **Fix: fallback catalog's composer-2.5 param matches the live one.** The keyless/fallback entry advertised a `thinking` param (off/on) that diff --git a/README.md b/README.md index e0fdcc6..319a8e7 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,8 @@ rm -rf ~/.cache/opencode/packages/@stablekernel/opencode-cursor@latest rmdir /s /q "%LocalAppData%\opencode\cache\packages\@stablekernel\opencode-cursor@latest" ``` -Then restart opencode. +Then restart opencode. (This cache layout is opencode v1's; on v2 run +`opencode plugin update` — see [opencode v2](#opencode-v2).) Drop `@latest` (`"@stablekernel/opencode-cursor"`) or pin a version (`"@stablekernel/opencode-cursor@1.2.3"`) if you prefer deterministic installs. @@ -712,8 +713,13 @@ watchdog (an empty string also disables, for backward compatibility). `PATH`). - **Plugin enabled but no `cursor` provider/models appear, or you see a stale-version warning.** opencode caches the `@latest` plugin install on first use and never refreshes it. - Exit opencode, delete `~/.cache/opencode/packages/@stablekernel/opencode-cursor@latest` - (or the pinned version directory), and restart. + On v1: exit opencode, delete `~/.cache/opencode/packages/@stablekernel/opencode-cursor@latest` + (or the pinned version directory), and restart. On v2: run `opencode plugin update`, or + exit opencode and delete `~/.cache/opencode/npm/@stablekernel/opencode-cursor@` + (e.g. `@next`), then restart. On v2 the spec must also resolve to a build with the v2 + entrypoint (0.10.0-next.1 or later — see [opencode v2](#opencode-v2)): an `@latest` + install of 0.9.x makes opencode 2 report "Plugin must export a default definition + with an id and an effect or setup function". - **Only the four fallback models appear.** The live catalog loads after the first authenticated use. Restart opencode once after login, or run `cursor_refresh_models`. - **Invalid or expired key.** Validated on first use — that's where the error surfaces.